1<?php
2
3require_once(HTML2PS_DIR.'box.generic.inline.php');
4
5/**
6 * @TODO: constructor required font properties to be known for the
7 * "content" element; on the other side, "content" element may be one
8 * without font properties defined/used. Currently, it is solved by
9 * adding CSS_FONT and CSS_LETTER_SPACING to GenericFormattedBox::readCSS
10 */
11class BoxNoteCall extends GenericInlineBox {
12  var $_note_number;
13  var $_note_content;
14  var $_note_marker_box;
15  var $_note_call_box;
16
17  function offset($dx, $dy) {
18    parent::offset($dx, $dy);
19    $this->_note_call_box->offset($dx, $dy);
20  }
21
22  function BoxNoteCall(&$content, &$pipeline) {
23    $this->GenericInlineBox();
24
25    $this->_note_content =& $content;
26
27    $this->copy_style($content);
28    $this->put_height_constraint(new HCConstraint(null, null, null));
29
30    /**
31     * Prepare ::note-call box
32     */
33
34    $this->_note_call_box = InlineBox::create_from_text(CSSListStyleType::format_number(LST_DECIMAL, 99),
35                                                        WHITESPACE_NORMAL,
36                                                        $pipeline);
37
38    $this->_note_call_box->copy_style($content);
39    $this->_note_call_box->content[0]->copy_style($content);
40
41    $font = $this->_note_call_box->content[0]->get_css_property(CSS_FONT);
42    $font = $font->copy();
43    $font->size->scale(0.75);
44    $this->_note_call_box->content[0]->setCSSProperty(CSS_FONT, $font);
45
46    $this->_note_call_box->content[0]->setCSSProperty(CSS_VERTICAL_ALIGN, VA_SUPER);
47    $this->_note_call_box->content[0]->setCSSProperty(CSS_LINE_HEIGHT, CSS::getDefaultValue(CSS_LINE_HEIGHT));
48
49    /**
50     * Prepare ::marker box
51     */
52
53    $this->_note_marker_box = InlineBox::create_from_text(CSSListStyleType::format_number(LST_DECIMAL, 99),
54                                                          WHITESPACE_NORMAL,
55                                                          $pipeline);
56
57    $this->_note_marker_box->copy_style($content);
58    $this->_note_marker_box->content[0]->copy_style($content);
59
60    $font = $this->_note_marker_box->content[0]->get_css_property(CSS_FONT);
61    $font = $font->copy();
62    $font->size->scale(0.5);
63    $this->_note_marker_box->content[0]->setCSSProperty(CSS_FONT, $font);
64
65    $margin = $this->_note_marker_box->content[0]->get_css_property(CSS_MARGIN);
66    $margin = $margin->copy();
67    $margin->right = Value::fromData(FOOTNOTE_MARKER_MARGIN, UNIT_PT);
68    $this->_note_marker_box->content[0]->setCSSProperty(CSS_MARGIN, $margin);
69
70
71    $this->_note_marker_box->content[0]->setCSSProperty(CSS_VERTICAL_ALIGN, VA_SUPER);
72    $this->_note_marker_box->content[0]->setCSSProperty(CSS_LINE_HEIGHT, CSS::getDefaultValue(CSS_LINE_HEIGHT));
73  }
74
75  function &create(&$content, &$pipeline) {
76    $box = new BoxNoteCall($content, $pipeline);
77
78    return $box;
79  }
80
81  function reflow(&$parent, &$context) {
82    $parent->append_line($this->_note_call_box);
83
84    $body = $parent;
85    while ($body->parent) {
86      $body = $body->parent;
87    };
88
89    /**
90     * Reflow note content
91     */
92    $this->put_full_height(1000);
93    $this->put_full_width($body->get_width());
94
95    $this->_current_x = $this->get_left();
96    $this->_current_y = $this->get_top();
97    $this->_note_content->reflow($this, $context);
98
99    $this->_current_x = $this->get_left();
100    $this->_current_y = $this->get_top();
101    $this->_note_marker_box->reflow($this, $context);
102
103    $this->_current_x = $this->get_left();
104    $this->_current_y = $this->get_top();
105    $this->_note_call_box->reflow($this, $context);
106    // This prevents note-call box from affecting line height
107    $this->_note_call_box->put_full_height(0);
108
109    /**
110     * Reflow note-call itself
111     */
112    $this->put_full_height(0);
113    $this->put_full_width(0);
114    $this->guess_corner($parent);
115    $parent->_current_x += $this->_note_call_box->content[0]->get_width();
116    $this->_note_call_box->put_full_width($this->_note_call_box->content[0]->get_width());
117
118    $this->_note_call_box->moveto($this->get_left(), $this->get_top());
119
120//     $last =& $parent->last_in_line();
121//     $last->note_call = true;
122
123    return true;
124  }
125
126  function reflow_whitespace(&$linebox_started, &$previous_whitespace) {
127    $ls = false;
128    $pw = false;
129    $this->_note_content->reflow_whitespace($ls, $pw);
130  }
131
132  function reflow_text(&$driver) {
133    $this->_note_content->reflow_text($driver);
134    $this->_note_marker_box->reflow_text($driver);
135    $this->_note_call_box->reflow_text($driver);
136    return true;
137  }
138
139  function _getFootnoteHeight(&$driver) {
140    if ($driver->getFootnoteCount() == 0) {
141      $footnote_height =
142        $this->_note_content->get_full_height() +
143        FOOTNOTE_LINE_TOP_GAP +
144        FOOTNOTE_LINE_BOTTOM_GAP;
145    } else {
146      $footnote_height =
147        $this->_note_content->get_full_height() +
148        FOOTNOTE_GAP;
149    };
150
151    return $footnote_height;
152  }
153
154  function show(&$driver) {
155    $footnote_height = $this->_getFootnoteHeight($driver);
156    if (!$driver->willContain($this, $footnote_height)) {
157      return true;
158    };
159
160    $driver->setFootnoteAreaHeight($driver->getFootnoteAreaHeight() + $footnote_height);
161    $driver->setFootnoteCount($driver->getFootnoteCount() + 1);
162
163    /**
164     * Prepare box containing note number
165     */
166    $this->_note_number = $driver->getFootnoteCount();
167
168    /**
169     * Render reference number
170     */
171    $this->_note_call_box->content[0]->words[0] = CSSListStyleType::format_number(LST_DECIMAL,
172                                                                                  $this->_note_number);
173    $this->_note_call_box->show_fixed($driver);
174
175    return true;
176  }
177
178  function show_footnote(&$driver, $x, $y) {
179    /**
180     * Render note reference number
181     */
182    $this->_note_marker_box->content[0]->words[0] = CSSListStyleType::format_number(LST_DECIMAL,
183                                                                                    $this->_note_number);
184    $this->_note_marker_box->moveto($x, $y);
185    $this->_note_marker_box->show_fixed($driver);
186
187    /**
188     * Render note content
189     */
190    $this->_note_content->moveto($x + $this->_note_marker_box->content[0]->get_width()*0.75,
191                                 $y);
192    $this->_note_content->show_fixed($driver);
193
194
195    return $y - $this->_note_content->get_full_height();
196  }
197}
198
199?>