224 lines
6.7 KiB
PHP
224 lines
6.7 KiB
PHP
<?php
|
|
// $Header: /cvsroot/html2ps/box.list-item.php,v 1.34 2006/09/07 18:38:12 Konstantin Exp $
|
|
|
|
class ListItemBox extends BlockBox {
|
|
var $size;
|
|
|
|
function &create(&$root, &$pipeline) {
|
|
$box = new ListItemBox($root, $pipeline);
|
|
$box->readCSS($pipeline->getCurrentCSSState());
|
|
|
|
/**
|
|
* Create text box containing item number
|
|
*/
|
|
$css_state =& $pipeline->getCurrentCSSState();
|
|
$css_state->pushState();
|
|
$css_state->setProperty(CSS_COLOR, CSSColor::parse('transparent'));
|
|
|
|
$list_style = $css_state->getProperty(CSS_LIST_STYLE);
|
|
$box->str_number_box = TextBox::create(CSSListStyleType::format_number($list_style->type,
|
|
$css_state->getProperty(CSS_HTML2PS_LIST_COUNTER)).". ",
|
|
'iso-8859-1',
|
|
$pipeline);
|
|
$box->str_number_box->baseline = $box->str_number_box->default_baseline;
|
|
|
|
$css_state->popState();
|
|
|
|
/**
|
|
* Create nested items
|
|
*/
|
|
$box->create_content($root, $pipeline);
|
|
|
|
return $box;
|
|
}
|
|
|
|
function readCSS(&$state) {
|
|
parent::readCSS($state);
|
|
|
|
$this->_readCSS($state,
|
|
array(CSS_LIST_STYLE));
|
|
|
|
// Pseudo-CSS properties
|
|
// '-list-counter'
|
|
|
|
// increase counter value
|
|
$value = $state->getProperty(CSS_HTML2PS_LIST_COUNTER) + 1;
|
|
$state->setProperty(CSS_HTML2PS_LIST_COUNTER, $value);
|
|
$state->setPropertyOnLevel(CSS_HTML2PS_LIST_COUNTER, CSS_PROPERTY_LEVEL_PARENT, $value);
|
|
|
|
// open the marker image if specified
|
|
$list_style = $this->getCSSProperty(CSS_LIST_STYLE);
|
|
|
|
if (!$list_style->image->is_default()) {
|
|
$this->marker_image = new ImgBox($list_style->image->_image);
|
|
$state->pushDefaultState();
|
|
$this->marker_image->readCSS($state);
|
|
$state->popState();
|
|
$this->marker_image->_setupSize();
|
|
} else {
|
|
$this->marker_image = null;
|
|
};
|
|
}
|
|
|
|
function ListItemBox(&$root, &$pipeline) {
|
|
// Call parent constructor
|
|
$this->BlockBox($root);
|
|
}
|
|
|
|
function reflow(&$parent, &$context) {
|
|
$list_style = $this->getCSSProperty(CSS_LIST_STYLE);
|
|
|
|
// If list-style-position is inside, we'll need to move marker box inside the
|
|
// list-item box and offset all content by its size;
|
|
if ($list_style->position === LSP_INSIDE) {
|
|
// Add marker box width to text-indent value
|
|
$this->_additional_text_indent = $this->get_marker_box_width();
|
|
};
|
|
|
|
// Procees with normal block box flow algorithm
|
|
BlockBox::reflow($parent, $context);
|
|
}
|
|
|
|
function reflow_text(&$driver) {
|
|
if (is_null($this->str_number_box->reflow_text($driver))) {
|
|
return null;
|
|
};
|
|
|
|
return GenericContainerBox::reflow_text($driver);
|
|
}
|
|
|
|
function show(&$viewport) {
|
|
// draw generic block box
|
|
if (is_null(BlockBox::show($viewport))) {
|
|
return null;
|
|
};
|
|
|
|
// Draw marker
|
|
/**
|
|
* Determine the marker box base X coordinate
|
|
* If possible, the marker box should be drawn immediately to the left of the first word in this
|
|
* box; this means that marker should be tied to the first text box, not to the left
|
|
* edge of the list block box
|
|
*/
|
|
$child = $this->get_first_data();
|
|
if (is_null($child)) {
|
|
$x = $this->get_left();
|
|
|
|
$list_style = $this->getCSSProperty(CSS_LIST_STYLE);
|
|
|
|
// If list-style-position is inside, we'll need to move marker box inside the
|
|
// list-item box and offset all content by its size;
|
|
if ($list_style->position === LSP_INSIDE) {
|
|
$x += $this->get_marker_box_width();
|
|
};
|
|
} else {
|
|
$x = $child->get_left();
|
|
};
|
|
|
|
// Determine the base Y coordinate of marker box
|
|
$element = $this->get_first_data();
|
|
|
|
if ($element) {
|
|
$y = $element->get_top() - $element->default_baseline;
|
|
} else {
|
|
$y = $this->get_top();
|
|
}
|
|
|
|
if (!is_null($this->marker_image)) {
|
|
$this->mb_image($viewport, $x, $y);
|
|
} else {
|
|
$list_style = $this->getCSSProperty(CSS_LIST_STYLE);
|
|
|
|
switch ($list_style->type) {
|
|
case LST_NONE:
|
|
// No marker at all
|
|
break;
|
|
case LST_DISC:
|
|
$this->mb_disc($viewport, $x, $y);
|
|
break;
|
|
case LST_CIRCLE:
|
|
$this->mb_circle($viewport, $x, $y);
|
|
break;
|
|
case LST_SQUARE:
|
|
$this->mb_square($viewport, $x, $y);
|
|
break;
|
|
default:
|
|
$this->mb_string($viewport, $x, $y);
|
|
break;
|
|
}
|
|
};
|
|
|
|
return true;
|
|
}
|
|
|
|
function get_marker_box_width() {
|
|
$list_style = $this->getCSSProperty(CSS_LIST_STYLE);
|
|
|
|
switch ($list_style->type) {
|
|
case LST_NONE:
|
|
// no marker box will be rendered at all
|
|
return 0;
|
|
case LST_DISC:
|
|
case LST_CIRCLE:
|
|
case LST_SQUARE:
|
|
// simple graphic marker
|
|
$font = $this->getCSSProperty(CSS_FONT);
|
|
return $font->size->getPoints();
|
|
default:
|
|
// string marker. Return the width of the marker text
|
|
return $this->str_number_box->get_full_width();
|
|
};
|
|
}
|
|
|
|
function mb_string(&$viewport, $x, $y) {
|
|
$this->str_number_box->put_top($y + $this->str_number_box->default_baseline);
|
|
$this->str_number_box->put_left($x - $this->str_number_box->get_full_width());
|
|
|
|
$this->str_number_box->show($viewport);
|
|
}
|
|
|
|
function mb_disc(&$viewport, $x, $y) {
|
|
$color = $this->getCSSProperty(CSS_COLOR);
|
|
$color->apply($viewport);
|
|
|
|
$font = $this->getCSSProperty(CSS_FONT);
|
|
|
|
$viewport->circle( $x - $font->size->getPoints()*0.5, $y + $font->size->getPoints()*0.4*HEIGHT_KOEFF, $font->size->getPoints() * BULLET_SIZE_KOEFF);
|
|
$viewport->fill();
|
|
}
|
|
|
|
function mb_circle(&$viewport, $x, $y) {
|
|
$color = $this->getCSSProperty(CSS_COLOR);
|
|
$color->apply($viewport);
|
|
|
|
$viewport->setlinewidth(0.1);
|
|
|
|
$font = $this->getCSSProperty(CSS_FONT);
|
|
$viewport->circle( $x - $font->size->getPoints()*0.5, $y + $font->size->getPoints()*0.4*HEIGHT_KOEFF, $font->size->getPoints() * BULLET_SIZE_KOEFF);
|
|
$viewport->stroke();
|
|
}
|
|
|
|
function mb_square(&$viewport, $x, $y) {
|
|
$color = $this->getCSSProperty(CSS_COLOR);
|
|
$color->apply($viewport);
|
|
|
|
$font = $this->getCSSProperty(CSS_FONT);
|
|
$viewport->rect($x - $font->size->getPoints()*0.512, $y + $font->size->getPoints()*0.3*HEIGHT_KOEFF, $font->size->getPoints() * 0.25, $font->size->getPoints() * 0.25);
|
|
$viewport->fill();
|
|
}
|
|
|
|
function mb_image(&$viewport, $x, $y) {
|
|
$font = $this->getCSSProperty(CSS_FONT);
|
|
|
|
$imagebox =& $this->marker_image;
|
|
$imagebox->moveto($x - $font->size->getPoints()*0.5 - $imagebox->get_width()/2,
|
|
$y + $font->size->getPoints()*0.4*HEIGHT_KOEFF + $imagebox->get_height()/2);
|
|
$imagebox->show($viewport);
|
|
}
|
|
|
|
function isBlockLevel() {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
?>
|