getSelector()) {
case CSS_MARGIN_BOX_SELECTOR_TOP:
$box =& new BoxPageMarginTop($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_TOP_LEFT_CORNER:
$box =& new BoxPageMarginTopLeftCorner($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_TOP_LEFT:
$box =& new BoxPageMarginTopLeft($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_TOP_CENTER:
$box =& new BoxPageMarginTopCenter($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_TOP_RIGHT:
$box =& new BoxPageMarginTopRight($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_TOP_RIGHT_CORNER:
$box =& new BoxPageMarginTopRightCorner($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_BOTTOM:
$box =& new BoxPageMarginBottom($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_BOTTOM_LEFT_CORNER:
$box =& new BoxPageMarginBottomLeftCorner($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_BOTTOM_LEFT:
$box =& new BoxPageMarginBottomLeft($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_BOTTOM_CENTER:
$box =& new BoxPageMarginBottomCenter($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_BOTTOM_RIGHT:
$box =& new BoxPageMarginBottomRight($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_BOTTOM_RIGHT_CORNER:
$box =& new BoxPageMarginBottomRightCorner($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_LEFT_TOP:
$box =& new BoxPageMarginLeftTop($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE:
$box =& new BoxPageMarginLeftMiddle($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM:
$box =& new BoxPageMarginLeftBottom($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_RIGHT_TOP:
$box =& new BoxPageMarginRightTop($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_RIGHT_MIDDLE:
$box =& new BoxPageMarginRightMiddle($pipeline, $at_rule);
break;
case CSS_MARGIN_BOX_SELECTOR_RIGHT_BOTTOM:
$box =& new BoxPageMarginRightBottom($pipeline, $at_rule);
break;
default:
trigger_error("Unknown selector type", E_USER_ERROR);
};
return $box;
}
function BoxPageMargin(&$pipeline, $at_rule) {
$state =& $pipeline->get_current_css_state();
$state->pushDefaultState();
$root = null;
$at_rule->css->apply($root, $state, $pipeline);
$this->GenericContainerBox();
$this->readCSS($state);
$state->pushDefaultstate();
/**
* Check whether 'content' or '-html2ps-html-content' properties had been defined
* (if both properties are defined, -html2ps-html-content takes precedence)
*/
$raw_html_content =& $at_rule->get_css_property(CSS_HTML2PS_HTML_CONTENT);
$html_content = $raw_html_content->render($pipeline->get_counters());
if ($html_content !== '') {
// We should wrap html_content in DIV tag,
// as we treat only the very first box of the resulting DOM tree as margin box content
$html_content = html2xhtml("
".$html_content."
");
$tree = TreeBuilder::build($html_content);
$tree_root = traverse_dom_tree_pdf($tree);
$body_box =& create_pdf_box($tree_root, $pipeline);
$box =& $body_box->content[0];
} else {
$raw_content =& $at_rule->get_css_property(CSS_CONTENT);
$content = $raw_content->render($pipeline->get_counters());
$box =& InlineBox::create_from_text($content,
WHITESPACE_PRE_LINE,
$pipeline);
}
$this->add_child($box);
$state->popState();
$state->popState();
}
function get_cell_baseline() {
return 0;
}
function reflow(&$driver, &$media, $boxes) {
$context = new FlowContext;
$this->_position($media, $boxes, $context);
$this->setCSSProperty(CSS_WIDTH, new WCConstant($this->get_width()));
$this->put_height_constraint(new HCConstraint(array($this->height, false),
null,
null));
$this->reflow_content($context);
/**
* Apply vertical-align (behave like table cell)
*/
$va = CSSVerticalAlign::value2pdf($this->get_css_property(CSS_VERTICAL_ALIGN));
$va->apply_cell($this,$this->get_full_height(),0);
}
function show(&$driver) {
$this->offset(0, $driver->offset);
$this->show_fixed($driver);
}
function _calc_sizes($full_width, $left, $center, $right) {
$context = new FlowContext;
$left_width = $left->get_max_width($context);
$center_width = $center->get_max_width($context);
$right_width = $right->get_max_width($context);
$calculated_left_width = 0;
$calculated_center_width = 0;
$calculated_right_width = 0;
if ($center_width > 0) {
$calculated_center_width = $full_width * $center_width / ($center_width + 2*max($left_width, $right_width));
$calculated_left_width = ($full_width - $calculated_center_width) / 2;
$calculated_right_width = $calculated_left_width;
} elseif ($left_width == 0 && $right_width == 0) {
$calculated_center_width = 0;
$calculated_left_width = 0;
$calculated_right_width = 0;
} elseif ($left_width == 0) {
$calculated_center_width = 0;
$calculated_left_width = 0;
$calculated_right_width = $full_width;
} elseif ($right_width == 0) {
$calculated_center_width = 0;
$calculated_left_width = $full_width;
$calculated_right_width = 0;
} else {
$calculated_center_width = 0;
$calculated_left_width = $full_width * $left_width / ($left_width + $right_width);
$calculated_right_width = $full_width - $calculated_left_width;
};
return array($calculated_left_width,
$calculated_center_width,
$calculated_right_width);
}
}
class BoxPageMarginTop extends BoxPageMargin {
function _position($media, $boxes, $context) {
$this->put_left($this->get_extra_left() + 0);
$this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
$this->put_full_width(mm2pt($media->width()));
$this->put_full_height(mm2pt($media->margins['top']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginTopLeftCorner extends BoxPageMargin {
function _position($media, $boxes, $context) {
$this->put_left($this->get_extra_left() + 0);
$this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
$this->put_full_width(mm2pt($media->margins['left']));
$this->put_full_height(mm2pt($media->margins['top']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginTopLeft extends BoxPageMargin {
function _position($media, $boxes, $context) {
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_LEFT],
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_CENTER],
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_RIGHT]);
$this->put_left($this->get_extra_left() + mm2pt($media->margins['left']));
$this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
$this->put_full_width($left);
$this->put_full_height(mm2pt($media->margins['top']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginTopCenter extends BoxPageMargin {
function _position($media, $boxes, $context) {
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_LEFT],
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_CENTER],
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_RIGHT]);
$this->put_left($this->get_extra_left() + mm2pt($media->margins['left']) + $left);
$this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
$this->put_full_width($center);
$this->put_full_height(mm2pt($media->margins['top']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginTopRight extends BoxPageMargin {
function _position($media, $boxes, $context) {
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_LEFT],
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_CENTER],
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_RIGHT]);
$this->put_left($this->get_extra_left() + mm2pt($media->margins['left']) + $left + $center);
$this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
$this->put_full_width($right);
$this->put_full_height(mm2pt($media->margins['top']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginTopRightCorner extends BoxPageMargin {
function _position($media, $boxes, $context) {
$this->put_left($this->get_extra_left() + mm2pt($media->width() - $media->margins['right']));
$this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
$this->put_full_width(mm2pt($media->margins['right']));
$this->put_full_height(mm2pt($media->margins['top']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginBottomLeftCorner extends BoxPageMargin {
function _position($media, $boxes, $context) {
$this->put_left($this->get_extra_left() + 0);
$this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
$this->put_full_width(mm2pt($media->margins['left']));
$this->put_full_height(mm2pt($media->margins['bottom']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginBottomLeft extends BoxPageMargin {
function _position($media, $boxes, $context) {
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_LEFT],
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_CENTER],
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_RIGHT]);
$this->put_left($this->get_extra_left() + mm2pt($media->margins['left']));
$this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
$this->put_full_width($left);
$this->put_full_height(mm2pt($media->margins['bottom']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginBottomCenter extends BoxPageMargin {
function _position($media, $boxes, $context) {
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_LEFT],
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_CENTER],
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_RIGHT]);
$this->put_left($this->get_extra_left() + mm2pt($media->margins['left']) + $left);
$this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
$this->put_full_width($center);
$this->put_full_height(mm2pt($media->margins['bottom']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginBottomRight extends BoxPageMargin {
function _position($media, $boxes, $context) {
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_LEFT],
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_CENTER],
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_RIGHT]);
$this->put_left($this->get_extra_left() + mm2pt($media->margins['left']) + $left + $center);
$this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
$this->put_full_width($right);
$this->put_full_height(mm2pt($media->margins['bottom']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginBottomRightCorner extends BoxPageMargin {
function _position($media, $boxes, $context) {
$this->put_left($this->get_extra_left() + mm2pt($media->width() - $media->margins['right']));
$this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
$this->put_full_width(mm2pt($media->margins['right']));
$this->put_full_height(mm2pt($media->margins['top']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginBottom extends BoxPageMargin {
function _position($media, $boxes, $context) {
$this->put_left($this->get_extra_left() + 0);
$this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
$this->put_full_width(mm2pt($media->width()));
$this->put_full_height(mm2pt($media->margins['bottom']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginLeftTop extends BoxPageMargin {
function _position($media, $boxes, $context) {
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_TOP],
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE],
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM]);
$this->put_left($this->get_extra_left() + 0);
$this->put_top(-$this->get_extra_top() +mm2pt($media->height() - $media->margins['top']));
$this->put_full_height($left);
$this->put_full_width(mm2pt($media->margins['left']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginLeftMiddle extends BoxPageMargin {
function _position($media, $boxes, $context) {
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_TOP],
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE],
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM]);
$this->put_left($this->get_extra_left() + 0);
$this->put_top(-$this->get_extra_top() +mm2pt($media->height() - $media->margins['top']) - $left);
$this->put_full_height($center);
$this->put_full_width(mm2pt($media->margins['left']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginLeftBottom extends BoxPageMargin {
function _position($media, $boxes, $context) {
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_TOP],
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE],
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM]);
$this->put_left($this->get_extra_left() + 0);
$this->put_top(-$this->get_extra_top() +mm2pt($media->height() - $media->margins['top']) - $left - $center);
$this->put_full_height($right);
$this->put_full_width(mm2pt($media->margins['left']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginRightTop extends BoxPageMargin {
function _position($media, $boxes, $context) {
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
$boxes[CSS_MARGIN_BOX_SELECTOR_RIGHT_TOP],
$boxes[CSS_MARGIN_BOX_SELECTOR_RIGHT_MIDDLE],
$boxes[CSS_MARGIN_BOX_SELECTOR_RIGHT_BOTTOM]);
$this->put_left($this->get_extra_left() + mm2pt($media->width() - $media->margins['right']));
$this->put_top(-$this->get_extra_top() +mm2pt($media->height() - $media->margins['top']));
$this->put_full_height($left);
$this->put_full_width(mm2pt($media->margins['right']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginRightMiddle extends BoxPageMargin {
function _position($media, $boxes, $context) {
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_TOP],
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE],
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM]);
$this->put_left($this->get_extra_left() + mm2pt($media->width() - $media->margins['right']));
$this->put_top(-$this->get_extra_top() +mm2pt($media->height() - $media->margins['top']) - $left);
$this->put_full_height($center);
$this->put_full_width(mm2pt($media->margins['right']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
class BoxPageMarginRightBottom extends BoxPageMargin {
function _position($media, $boxes, $context) {
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_TOP],
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE],
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM]);
$this->put_left($this->get_extra_left() + mm2pt($media->width() - $media->margins['right']));
$this->put_top(-$this->get_extra_top() + mm2pt($media->height() - $media->margins['top']) - $left - $center);
$this->put_full_height($right);
$this->put_full_width(mm2pt($media->margins['right']));
$this->_current_x = $this->get_left();
$this->_current_y = $this->get_top();
}
}
?>