1<?php
2
3class StrategyWidthMax {
4  var $_limit;
5  var $_maxw;
6  var $_cmaxw;
7
8  function StrategyWidthMax($limit = 10E6) {
9    $this->_limit = $limit;
10  }
11
12  function add_width($delta) {
13    if ($this->_cmaxw + $delta > $this->_limit) {
14      $this->line_break();
15    };
16    $this->_cmaxw += $delta;
17  }
18
19  function line_break() {
20    $this->_maxw  = max($this->_maxw, $this->_cmaxw);
21    $this->_cmaxw = 0;
22  }
23
24  function apply(&$box, &$context) {
25    $this->_maxw = 0;
26
27    // We need to add text indent to the max width
28    $text_indent = $box->get_css_property(CSS_TEXT_INDENT);
29    $this->_cmaxw = $text_indent->calculate($box);
30
31    for ($i=0, $size = count($box->content); $i<$size; $i++) {
32      $child =& $box->content[$i];
33
34      if ($child->isLineBreak()) {
35        $this->line_break();
36
37      } elseif (!$child->out_of_flow()) {
38        if (is_inline($child) ||
39            $child->get_css_property(CSS_FLOAT) !== FLOAT_NONE) {
40          $this->add_width($child->get_max_width($context, $this->_limit));
41        } else {
42          $this->line_break();
43          $this->add_width($child->get_max_width($context, $this->_limit));
44
45          // Process special case with percentage constrained table
46          $item_wc = $child->get_css_property(CSS_WIDTH);
47
48          if (is_a($child,    "TableBox") &&
49              is_a($item_wc, "WCFraction")) {
50            $this->_cmaxw = max($this->_cmaxw,
51                                $item_wc->apply($box->get_width(),
52                                                $box->parent->get_expandable_width()));
53          };
54          $this->line_break();
55        };
56      };
57    }
58
59    // Check if last line have maximal width
60    //
61    $this->line_break();
62
63    // Note that max width cannot differ from constrained width,
64    // if any width constraints apply
65    //
66    $wc = $box->get_css_property(CSS_WIDTH);
67    if ($wc->applicable($box)) {
68      if ($box->parent) {
69        $this->_maxw = $wc->apply($this->_maxw, $box->parent->get_width());
70      } else {
71        $this->_maxw = $wc->apply($this->_maxw, $this->_maxw);
72      };
73    };
74
75    return $this->_maxw + $box->_get_hor_extra();
76  }
77}
78
79?>