This file is part of PhpRtf Lite.
PhpRtf Lite is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
PhpRtf Lite is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with PhpRtf Lite. If not, see .
*/
/**
* Class for creating sections of document.
* @package Rtf
* @todo Exception, then columns widths override paper width.
*/
class Section extends Container {
/**#@+
* Internal use.
* @access public
*/
var $bordered;
var $first = false;
var $alignment;
var $oddEvenDifferent;
/**#@-*/
/**#@+
* @access private
*/
var $columnCount = 1;
var $columnsWidths;
var $noBreak = false;
var $lineBetweenColumns = false;
var $spaceBetweenColumns;
var $paperWidth;
var $paperHeight;
var $marginLeft;
var $marginRight;
var $marginTop;
var $marginBottom;
var $gutter;
var $mirrorMargins;
/**#@-*/
/**
* Sets the paper width of pages in section.
* @access public
* @param float $paperWidth Paper width
*/
function setPaperWidth($paperWidth) {
$this->paperWidth = $paperWidth;
}
/**
* Sets the paper height of pages in section.
* @access public
* @param float $paperHeight Paper height
*/
function setPaperHeight($paperHeight) {
$this->paperHeight = $paperHeight;
}
/**
* Sets the margins of pages in section.
* @access public
* @param float $marginLeft Margin left
* @param float $marginTop Margin top
* @param float $marginRight Margin right
* @param float $marginBottom Margin bottom
*/
function setMargins($marginLeft, $marginTop, $marginRight, $marginBottom) {
$this->marginLeft = $marginLeft;
$this->marginTop = $marginTop;
$this->marginRight = $marginRight;
$this->marginBottom = $marginBottom;
}
/**
* Sets the gutter width.
* NOTICE: OpenOficce doesn't understant.
* @access public
* @param float $gutter Gutter width
*/
function setGutter($gutter) {
$this->gutter = $gutter;
}
/**
* Sets the margin definitions on left and right pages.
* Notice: OpenOficce doesn't Understant.
* @access public
*/
function setMirrorMargins() {
$this->mirrorMargins = true;
}
/**
* Gets width of page layout.
* @return float
* @access public
*/
function getLayoutWidth() {
$paperWidth = !empty($this->paperWidth) ? $this->paperWidth : $this->rtf->paperWidth;
$marginLeft = !empty($this->marginLeft) ? $this->marginLeft : $this->rtf->marginLeft;
$marginRight = !empty($this->marginRight) ? $this->marginRight : $this->rtf->marginRight;
return ($paperWidth - $marginLeft - $marginRight);
}
/**
* Sets borders of section pages.
* @param BorderFormat &$borderFormat
* @param boolean $left If false, left border is not set (default true)
* @param boolean $top If false, top border is not set (default true)
* @param boolean $right If false, right border is not set (default true)
* @param boolean $bottom If false, bottom border is not set (default true)
* @access public
*/
function setBorders(&$borderFormat, $left = true, $top = true, $right = true, $bottom = true) {
if (empty($this->bordered)) {
$this->bordered = new Bordered();
}
$this->bordered->setBorders($borderFormat, $left, $top, $right, $bottom);
}
/**
* Sets number of columns in section.
* @access public
* @param integer $columnsCount Number of columns
*/
function setColumnsCount($columnsCount) {
$this->columnsCount = $columnsCount;
unSet($this->columnsWidths);
}
/**
* Sets space (width) between columns.
* @access public
* @param float $spaceBetweenColumns Space between columns
*/
function setSpaceBetweenColumns($spaceBetweenColumns) {
$this->spaceBetweenColumns = $spaceBetweenColumns;
}
/**
* Sets section columns with different widths.
* If you use this function, you shouldn't use {@see SetColumnsNumber}.
* @access public
* @param array $columnsWidths Array with columns widths
* @todo Check if columns width sum doesn't overload paper width.
*/
function setColumns($columnsWidths) {
if (is_array($columnsWidths)) {
$this->columnsCount = count($columnsWidths);
$this->columnsWidths = $columnsWidths;
}
}
/**
* Sets no section break.
* If footnotes are use in different sections, Word always will break sections.
* @access public
*/
function setNoBreak() {
$this->noBreak = true;
}
/**
* Sets line between columns.
* @access public
*/
function setLineBetweenColumns() {
$this->lineBetweenColumns = true;
}
/**
* Sets vertical alignment of text of section.
* @param string $alignment Possible values:
* 'top' => top (default)
* 'center' => center
* 'bottom' => bottom
* 'justify' => justify
* @todo bottom justify don't work
* @accces public
*/
function setVerticalAlignment($alignment) {
switch ($alignment) {
default:
$this->alignment = "\vertalt ";
break;
case 'center':
$this->alignment = "\vertalc ";
break;
case 'bottom':
$this->alignment = "\vertalb ";
break;
case 'justify':
$this->alignment = "\vertalj ";
break;
}
}
/**
* Creates header for section pages.
* @param $type Possible values:
* 'all' => all pages (different odd and even headers/footers must be not set)
* 'left' => left pages (different odd and even headers/footers must be set)
* 'right' => right pages (different odd and even headers/footers must be set)
* 'first' => first page
* @access public
* @return Header
*/
function &addHeader($type = 'all') {
if (empty($this->rtf->oddEvenDifferent) && $type == 'all') {
$header = new Header($this->rtf, $type);
} else if (!empty($this->rtf->oddEvenDifferent)
&& ($type == 'left' || $type == 'right')) {
$header = new Header($this->rtf, $type);
} else if ($type == 'first') {
$header = new Header($this->rtf, $type);
$this->titlepg = 1;
} else {
return;
}
$this->headers[$type] = &$header;
return $header;
}
/**
* Creates footer for section pages.
* @param $type Possible values:
* 'all' => all pages (different odd and even headers/footers must be not set)
* 'left' => left pages (different odd and even headers/footers must be set)
* 'right' => right pages (different odd and even headers/footers must be set)
* 'first' => first page
* @access public
* @return Footer
*/
function &addFooter($type = 'all') {
if (empty($this->rtf->oddEvenDifferent) && $type == 'all') {
$footer = new Footer($this->rtf, $type);
} else if (!empty($this->rtf->oddEvenDifferent)
&& ($type == 'left' || $type == 'right')) {
$footer = new Footer($this->rtf, $type);
} else if ($type == 'first') {
$footer = new Footer($this->rtf, $type);
$this->titlepg = 1;
} else {
return;
}
$this->footers[$type] = &$footer;
return $footer;
}
/**
* Breaks page.
* @since 0.2.0/ This method is used instead of using "page" tag in Container::writeText method.
* @?ccess public.
*/
function insertPageBreak() {
$this->elements[] = "\\page";
}
/**
* Gets rtf code of section. Internal use.
* @return string
* @access public
*/
function getContent() {
$content = '';
if (empty($this->first)) {
$content .= '\sect \sectd ';
}
//headers
if (!empty($this->headers)) {
foreach ($this->headers as $value) {
$content .= $value->getContent();
}
} else {
foreach ($this->rtf->headers as $value) {
$content .= $value->getContent();
}
}
//footers
if (!empty($this->footers)) {
foreach ($this->footers as $value) {
$content .= $value->getContent();
}
} else {
foreach ($this->rtf->footers as $value) {
$content .= $value->getContent();
}
}
//borders
if (!empty($this->bordered)) {
$content .= $this->bordered->getContent($this->rtf, '\pg');
} else if (!empty($this->rtf->bordered)) {
$content .= $this->rtf->bordered->getContent($this->rtf, '\pg');
}
//section properties
if (!empty($this->noBreak)) {
$content .= '\sbknone ';
}
if (!empty($this->columnsCount)) {
$content .= '\cols'.$this->columnsCount.' ';
}
if (empty($this->columnsWidths)) {
if (!empty($this->spaceBetweenColumns)) {
$content .= '\colsx'.round($this->spaceBetweenColumns * TWIPS_IN_CM).' ';
}
} else {
$width = 0;
foreach ($this->columnsWidths as $value) {
$width += $value * TWIPS_IN_CM;
}
$printableWidth = ($this->rtf->paperWidth - $this->rtf->marginLeft - $this->rtf->marginRight);
$space = round(($printableWidth * TWIPS_IN_CM - $width) / (count($this->columnsWidths) - 1));
$i = 1;
foreach ($this->columnsWidths as $key => $value) {
$content .= '\colno'.$i.'\colw'.($value * TWIPS_IN_CM);
if (!empty($this->columnsWidths[$key])) {
$content .= '\colsr'.$space;
}
$i ++;
}
$content .= ' ';
}
if (!empty($this->lineBetweenColumns)) {
$content .= '\linebetcol ';
}
/*---Page part---*/
if (isSet($this->paperWidth)) {
$content .= '\pgwsxn'.round($this->paperWidth * TWIPS_IN_CM).' ';
}
if (isSet($this->paperHeight)) {
$content .= '\pghsxn'.round($this->paperHeight * TWIPS_IN_CM).' ';
}
if (isSet($this->marginLeft)) {
$content .= '\marglsxn'.round($this->marginLeft * TWIPS_IN_CM).' ';
}
if (isSet($this->marginRight)) {
$content .= '\margrsxn'.round($this->marginRight * TWIPS_IN_CM).' ';
}
if (isSet($this->marginTop)) {
$content .= '\margtsxn'.round($this->marginTop * TWIPS_IN_CM).' ';
}
if (isSet($this->marginBottom)) {
$content .= '\margbsxn'.round($this->marginBottom * TWIPS_IN_CM ).' ';
}
if (isSet($this->gutter)) {
$content .= '\guttersxn'.round($this->gutter * TWIPS_IN_CM).' ';
}
if (!empty($this->mirrorMargins)) {
$content .= '\margmirsxn ';
}
//vertical alignment
if (!empty($this->alignment)) {
$content .= $this->alignment;
}
$content .= "\r\n".parent::getContent()."\r\n";
return $content;
}
}
?>