array ('style:name', 'style', false),
'style-page-usage' => array ('style:page-usage', 'style', false),
);
static $layout_props_fields = array(
// Fields belonging to "style:page-layout-properties"
'width' => array ('fo:page-width', 'props', true),
'height' => array ('fo:page-height', 'props', true),
'num-format' => array ('style:num-format', 'props', true),
'num-letter-sync' => array ('style:num-letter-sync', 'props', true),
'num-prefix' => array ('style:num-prefix', 'props', true),
'num-suffix' => array ('style:num-suffix', 'props', true),
'paper-tray-name' => array ('style:paper-tray-name', 'props', true),
'print-orientation' => array ('style:print-orientation', 'props', true),
'margin-left' => array ('fo:margin-left', 'props', true),
'margin-right' => array ('fo:margin-right', 'props', true),
'margin-top' => array ('fo:margin-top', 'props', true),
'margin-bottom' => array ('fo:margin-bottom', 'props', true),
'margin' => array ('fo:margin', 'props', true),
'border' => array ('fo:border', 'props', true),
'border-top' => array ('fo:border-top', 'props', true),
'border-right' => array ('fo:border-right', 'props', true),
'border-bottom' => array ('fo:border-bottom', 'props', true),
'border-left' => array ('fo:border-left', 'props', true),
'border-line-width' => array ('style:border-line-width', 'props', true),
'border-line-width-top' => array ('style:border-line-width-top', 'props', true),
'border-line-width-bottom' => array ('style:border-line-width-bottom', 'props', true),
'border-line-width-left' => array ('style:border-line-width-left', 'props', true),
'border-line-width-right' => array ('style:border-line-width-right', 'props', true),
'padding' => array ('fo:padding', 'props', true),
'padding-top' => array ('fo:padding-top', 'props', true),
'padding-bottom' => array ('fo:padding-bottom', 'props', true),
'padding-left' => array ('fo:padding-left', 'props', true),
'padding-right' => array ('fo:padding-right', 'props', true),
'shadow' => array ('style:shadow', 'props', true),
'background-color' => array ('fo:background-color', 'props', true),
'register-truth-ref-style-name' => array ('style:register-truth-ref-style-name', 'props', true),
'print' => array ('style:print', 'props', true),
'print-page-order' => array ('style:print-page-order', 'props', true),
'first-page-number' => array ('style:first-page-number', 'props', true),
'scale-to' => array ('style:scale-to', 'props', true),
'scale-to-pages' => array ('style:scale-to-pages', 'props', true),
'table-centering' => array ('style:table-centering', 'props', true),
'footnote-max-height' => array ('style:footnote-max-height', 'props', true),
'writing-mode' => array ('style:writing-mode', 'props', true),
'layout-grid-mode' => array ('style:layout-grid-mode', 'props', true),
'layout-grid-standard-mode' => array ('style:layout-grid-standard-mode', 'props', true),
'layout-grid-base-height' => array ('style:layout-grid-base-height', 'props', true),
'layout-grid-ruby-height' => array ('style:layout-grid-ruby-height', 'props', true),
'layout-grid-lines' => array ('style:layout-grid-lines', 'props', true),
'layout-grid-base-width' => array ('style:layout-grid-base-width', 'props', true),
'layout-grid-color' => array ('style:layout-grid-color', 'props', true),
'layout-grid-ruby-below' => array ('style:layout-grid-ruby-below', 'props', true),
'layout-grid-print' => array ('style:layout-grid-print', 'props', true),
'layout-grid-display' => array ('style:layout-grid-display', 'props', true),
'layout-grid-snap-to' => array ('style:layout-grid-snap-to', 'props', true),
);
static $bgi_fields = array(
// Fields belonging to "style:background-image"
// The content of element "style:background-image" will be saved as is
'repeat' => array ('style:repeat', 'bgi', true),
'position' => array ('style:position', 'bgi', true),
'filter-name' => array ('style:filter-name', 'bgi', true),
'opacity' => array ('draw:opacity', 'bgi', true),
'xlink-type' => array ('xlink:type', 'bgi', true),
'xlink-href' => array ('xlink:href', 'bgi', true),
'xlink-show' => array ('xlink:show', 'bgi', true),
'xlink-actuate' => array ('xlink:actuate', 'bgi', true),
);
static $columns_fields = array(
// Fields belonging to "style:columns"
// The content of element "style:columns" will be saved as is
'column-count' => array ('fo:column-count', 'columns', true),
'column-gap' => array ('fo:column-gap', 'columns', true),
'column-gap' => array ('fo:column-gap', 'columns', true),
);
static $footnote_fields = array(
// Fields belonging to "style:footnote-sep"
'ftsep-width' => array ('style:width', 'ftsep', true),
'ftsep-rel-width' => array ('style:rel-width', 'ftsep', true),
'ftsep-color' => array ('style:color', 'ftsep', true),
'ftsep-line-style' => array ('style:line-style', 'ftsep', true),
'ftsep-adjustment' => array ('style:adjustment', 'ftsep', true),
'ftsep-distance-before-sep' => array ('style:distance-before-sep', 'ftsep', true),
'ftsep-distance-after-sep' => array ('style:distance-after-sep', 'ftsep', true),
);
protected $page_layout_style = array();
protected $layout_props = array();
protected $bgi_props = array();
protected $columns_props = array();
protected $footnote_props = array();
protected $content_bgi = NULL;
protected $content_columns = NULL;
protected $content_header = NULL;
protected $content_footer = NULL;
/**
* Get the element name for the ODT XML encoding of the style.
*/
public function getElementName() {
return 'style:page-layout';
}
/**
* Set style properties by importing values from a properties array.
* Properties might be disabled by setting them in $disabled.
* The style must have been previously created.
*
* @param $properties Properties to be imported
* @param $disabled Properties to be ignored
*/
public function importProperties($properties, $disabled=array()) {
$this->importPropertiesInternal(self::$page_layout_fields, $properties, $disabled, $this->page_layout_style);
$this->importPropertiesInternal(self::$layout_props_fields, $properties, $disabled, $this->layout_props);
$this->importPropertiesInternal(self::$bgi_fields, $properties, $disabled, $this->bgi_props);
$this->importPropertiesInternal(self::$columns_fields, $properties, $disabled, $this->columns_props);
$this->importPropertiesInternal(self::$footnote_props, $properties, $disabled, $this->footnote_fields);
}
/**
* Check if a style is a common style.
*
* @return bool Is common style
*/
public function mustBeCommonStyle() {
return false;
}
/**
* Set a property.
*
* @param $property The name of the property to set
* @param $value New value to set
*/
public function setProperty($property, $value) {
if (array_key_exists ($property, self::$page_layout_fields)) {
$this->setPropertyInternal
($property, self::$page_layout_fields [$property][0], $value, self::$page_layout_fields [$property][1], $this->page_layout_style);
return;
}
if (array_key_exists ($property, self::$layout_props_fields)) {
$this->setPropertyInternal
($property, self::$layout_props_fields [$property][0], $value, self::$layout_props_fields [$property][1], $this->layout_props);
return;
}
if (array_key_exists ($property, self::$bgi_fields)) {
$this->setPropertyInternal
($property, self::$bgi_fields [$property][0], $value, self::$bgi_fields [$property][1], $this->bgi_props);
return;
}
if (array_key_exists ($property, self::$columns_fields)) {
$this->setPropertyInternal
($property, self::$columns_fields [$property][0], $value, self::$columns_fields [$property][1], $this->columns_props);
return;
}
if (array_key_exists ($property, self::$footnote_fields)) {
$this->setPropertyInternal
($property, self::$footnote_fields [$property][0], $value, self::$footnote_fields [$property][1], $this->footnote_props);
return;
}
}
/**
* Get the value of a property.
*
* @param $property The property name
* @return string The current value of the property
*/
public function getProperty($property) {
if (array_key_exists ($property, self::$page_layout_fields)) {
return $this->page_layout_style [$property]['value'];
}
if (array_key_exists ($property, self::$layout_props_fields)) {
return $this->layout_props [$property]['value'];
}
if (array_key_exists ($property, self::$bgi_fields)) {
return $this->bgi_props [$property]['value'];
}
if (array_key_exists ($property, self::$columns_fields)) {
return $this->columns_props [$property]['value'];
}
if (array_key_exists ($property, self::$footnote_fields)) {
return $this->footnote_props [$property]['value'];
}
return NULL;
}
/**
* Create new style by importing ODT style definition.
*
* @param $xmlCode Style definition in ODT XML format
* @return ODTStyle New specific style
*/
static public function importODTStyle($xmlCode) {
$style = new ODTPageLayoutStyle();
// Get attributes for element 'style:master-page'
$open = XMLUtil::getElementOpenTag('style:page-layout', $xmlCode);
if (!empty($open)) {
$style->importODTStyleInternal(self::$page_layout_fields, $open, $style->page_layout_style);
$childs = XMLUtil::getElementContent ('style:page-layout', $xmlCode);
if (!empty($childs)) {
// Get attributes for element 'style:page-layout-properties'
$open = XMLUtil::getElementOpenTag('style:page-layout-properties', $childs);
$style->content_header = XMLUtil::getElement ('style:header-style', $childs);
$style->content_footer = XMLUtil::getElement ('style:footer-style', $childs);
if (!empty($open)) {
$style->importODTStyleInternal(self::$layout_props_fields, $open, $style->layout_props);
$childs = XMLUtil::getElementContent ('style:page-layout-properties', $xmlCode);
if (!empty($childs)) {
// Get 'style:background-image'
$open = XMLUtil::getElementOpenTag('style:background-image', $childs);
if (!empty($open)) {
$style->importODTStyleInternal(self::$bgi_fields, $open, $style->bgi_props);
$style->content_bgi = XMLUtil::getElementContent ('style:background-image', $childs);
}
// Get 'style:columns'
$open = XMLUtil::getElementOpenTag('style:columns', $childs);
if (!empty($open)) {
$style->importODTStyleInternal(self::$columns_fields, $open, $style->columns_props);
$style->content_columns = XMLUtil::getElementContent ('style:columns', $childs);
}
// Get 'style:footnote-sep'
$open = XMLUtil::getElementOpenTag('style:footnote-sep', $childs);
if (!empty($open)) {
$style->importODTStyleInternal(self::$footnote_fields, $open, $style->footnote_props);
}
}
}
}
}
return $style;
}
/**
* Encode current style values in a string and return it.
*
* @return string ODT XML encoded style
*/
public function toString() {
$layout_style = '';
$layout = '';
$bgi = '';
$columns = '';
$footnote = '';
// Get page layout style ODT properties
foreach ($this->page_layout_style as $property => $items) {
$layout_style .= $items ['odt_property'].'="'.$items ['value'].'" ';
}
// Get page layout properties ODT properties
foreach ($this->layout_props as $property => $items) {
$layout .= $items ['odt_property'].'="'.$items ['value'].'" ';
}
// Get background-image ODT properties
foreach ($this->bgi_props as $property => $items) {
$bgi .= $items ['odt_property'].'="'.$items ['value'].'" ';
}
// Get columns ODT properties
foreach ($this->columns_props as $property => $items) {
$columns .= $items ['odt_property'].'="'.$items ['value'].'" ';
}
// Get footnote-sep ODT properties
foreach ($this->footnote_props as $property => $items) {
$footnote .= $items ['odt_property'].'="'.$items ['value'].'" ';
}
// Build style.
$style = '\n";
if ( !empty($layout) || !empty($bgi) || !empty($columns) || !empty($footnote) ||
!empty($this->content_bgi) || !empty($this->content_columns) ) {
$style .= '\n";
if ( !empty($bgi) || !empty($this->content_bgi) ) {
$style .= '\n";
$style .= $this->content_bgi;
$style .= ''."\n";
}
if ( !empty($columns) || !empty($content_columns) ) {
$style .= '\n";
$style .= $this->content_columns;
$style .= ''."\n";
}
if ( !empty($footnote) ) {
$style .= '\n";
}
$style .= ''."\n";
}
$style .= $this->content_header;
$style .= $this->content_footer;
$style .= '\n";
return $style;
}
/**
* This function creates a page layout style with the parameters given in $properies.
*
* The currently supported properties are:
* style-name, width, height, margin-top, margin-bottom, margin-right and margin-left.
* All properties except the style-name are expected to be numeric values.
* The function will add 'cm' itself, so do not add any units.
*
* The function returns the name of the new style or NULL if all relevant properties are empty.
*
* @author LarsDW223
*
* @param $properties
* @param null $disabled_props
* @return ODTUnknownStyle or NULL
*/
public static function createPageLayoutStyle(array $properties, array $disabled_props = NULL) {
// Create style name (if not given).
$style_name = $properties ['style-name'];
if ( empty($style_name) ) {
$style_name = self::getNewStylename ('Page');
$properties ['style-name'] = $style_name;
}
$style = '
';
return self::importODTStyle($style);
}
}