get_real_full_height()) / 2);
$old_top = $cell->get_top();
$cell->offset(0, -$delta);
$cell->put_top($old_top);
}
}
class VerticalAlignBottom {
function apply_cell(&$cell, $row_height, $row_baseline) {
$delta = ($row_height - $cell->get_real_full_height());
$old_top = $cell->get_top();
$cell->offset(0, -$delta);
$cell->put_top($old_top);
}
}
class VerticalAlignBaseline {
function apply_cell(&$cell, $row_height, $row_baseline) {
$delta = ($row_baseline - $cell->get_cell_baseline());
$old_top = $cell->get_top();
$cell->offset(0, -$delta);
$cell->put_top($old_top);
}
}
class VerticalAlignTextTop {
function apply_cell(&$cell, $row_height, $row_baseline) {
return; // Do nothing
}
}
class VerticalAlignTextBottom {
function apply_cell(&$cell, $row_height, $row_baseline) {
$delta = ($row_baseline - $cell->get_cell_baseline());
$old_top = $cell->get_top();
$cell->offset(0, -$delta);
$cell->put_top($old_top);
}
}
class CSSVerticalAlign extends CSSPropertyHandler {
function CSSVerticalAlign() {
// Note that in general, parameters 'true' and 'false' are non meaningful in out case,
// as we anyway override 'inherit' and 'inherit_text' in this class.
$this->CSSPropertyHandler(true, true);
}
function inherit($old_state, &$new_state) {
// Determine parent 'display' value
$parent_display = $old_state[CSS_DISPLAY];
// Inherit vertical-align from table-rows
if ($parent_display === "table-row") {
$this->replace_array($this->get($old_state),
$new_state);
return;
}
if (is_inline_element($parent_display)) {
$this->replace_array($this->get($old_state), $new_state);
return;
};
$this->replace_array($this->default_value(), $new_state);
return;
}
function inherit_text($old_state, &$new_state) {
// Determine parent 'display' value
$parent_display = $old_state[CSS_DISPLAY];
$this->replace_array(is_inline_element($parent_display) ? $this->get($old_state) : $this->default_value(),
$new_state);
}
function default_value() { return VA_BASELINE; }
function parse($value) {
if ($value === 'inherit') {
return CSS_PROPERTY_INHERIT;
};
// Convert value to lower case, as html allows values
// in both cases to be entered
$value = strtolower($value);
if ($value === 'baseline') { return VA_BASELINE; };
if ($value === 'sub') { return VA_SUB; };
if ($value === 'super') { return VA_SUPER; };
if ($value === 'top') { return VA_TOP; };
if ($value === 'middle') { return VA_MIDDLE; };
// As some brainless designers sometimes use 'center' instead of 'middle',
// we'll add support for it
if ($value === 'center') { return VA_MIDDLE; }
if ($value === 'bottom') { return VA_BOTTOM; };
if ($value === 'text-top') { return VA_TEXT_TOP; };
if ($value === 'text-bottom') { return VA_TEXT_BOTTOM; };
return $this->default_value();
}
function value2pdf($value) {
if ($value === VA_SUPER) { return new VerticalAlignSuper; }
if ($value === VA_SUB) { return new VerticalAlignSub; }
if ($value === VA_TOP) { return new VerticalAlignTop; }
if ($value === VA_MIDDLE) { return new VerticalAlignMiddle; }
if ($value === VA_BOTTOM) { return new VerticalAlignBottom; }
if ($value === VA_BASELINE) { return new VerticalAlignBaseline; }
if ($value === VA_TEXT_TOP) { return new VerticalAlignTextTop; }
if ($value === VA_TEXT_BOTTOM) { return new VerticalAlignTextBottom; }
return new VerticalAlignBaseline;
}
function applicable($css_state) {
$handler =& CSS::get_handler(CSS_DISPLAY);
$display = $handler->get($css_state->getState());
return
$display === 'table-cell' ||
$display === 'table-row' ||
is_inline_element($display);
}
function get_property_code() {
return CSS_VERTICAL_ALIGN;
}
function get_property_name() {
return 'vertical-align';
}
}
CSS::register_css_property(new CSSVerticalAlign);
?>