source: pmb4.2/trunk/fuentes/pmb/classes/rtf/Section.php @ 815

Last change on this file since 815 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 11.4 KB
Line 
1<?php
2/*
3        PhpRtf Lite
4        Copyright 2007-2008 Denis Slaveckij <info@phprtf.com>   
5
6        This file is part of PhpRtf Lite.
7
8    PhpRtf Lite is free software: you can redistribute it and/or modify
9    it under the terms of the GNU Lesser General Public License as published by
10    the Free Software Foundation, either version 3 of the License, or
11    (at your option) any later version.
12
13    PhpRtf Lite is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU Lesser General Public License for more details.
17
18    You should have received a copy of the GNU Lesser General Public License
19    along with PhpRtf Lite.  If not, see <http://www.gnu.org/licenses/>.
20*/
21
22/**
23 * Class for creating sections of document.
24 * @package Rtf
25 * @todo Exception, then columns widths override paper width.
26 */
27class Section extends Container {
28       
29        /**#@+
30         * Internal use.
31         * @access public
32         */     
33        var $bordered;
34         
35        var $first = false;     
36       
37        var $alignment;
38       
39        var $oddEvenDifferent;         
40        /**#@-*/       
41       
42        /**#@+   
43         * @access private
44         */ 
45        var $columnCount = 1;
46       
47        var $columnsWidths;
48       
49        var $noBreak = false;
50       
51        var $lineBetweenColumns = false;
52       
53        var $spaceBetweenColumns;
54         
55        var $paperWidth;       
56       
57        var $paperHeight;
58               
59        var $marginLeft;
60       
61        var $marginRight;
62       
63        var $marginTop;
64       
65        var $marginBottom;
66       
67        var $gutter;
68               
69        var $mirrorMargins;     
70        /**#@-*/       
71               
72        /**
73     * Sets the paper width of pages in section.
74     * @access public
75     * @param float $paperWidth Paper width
76     */         
77        function setPaperWidth($paperWidth) {       
78            $this->paperWidth = $paperWidth;
79        }
80       
81        /**
82     * Sets the paper height of pages in section.   
83     * @access public
84     * @param float $paperHeight Paper height
85     */         
86        function setPaperHeight($paperHeight) {     
87            $this->paperHeight = $paperHeight;
88        }
89       
90        /**
91     * Sets the margins of pages in section.   
92     * @access public
93     * @param float $marginLeft Margin left
94     * @param float $marginTop Margin top
95     * @param float $marginRight Margin right
96     * @param float $marginBottom Margin bottom
97     */
98        function setMargins($marginLeft, $marginTop, $marginRight, $marginBottom) {       
99                $this->marginLeft = $marginLeft; 
100                $this->marginTop = $marginTop;
101                $this->marginRight = $marginRight;
102                $this->marginBottom = $marginBottom;
103        }
104       
105        /**
106     * Sets the gutter width. <br>   
107     * NOTICE: OpenOficce doesn't understant.
108     * @access public
109     * @param float $gutter Gutter width
110     */         
111        function setGutter($gutter) {       
112            $this->gutter = $gutter;
113        }
114       
115        /**
116     * Sets the margin definitions on left and right pages.   
117     * Notice: OpenOficce doesn't Understant.
118     * @access public
119     */         
120        function setMirrorMargins() {       
121            $this->mirrorMargins = true;
122        }       
123       
124        /**
125         * Gets width of page layout.
126         * @return float
127         * @access public
128         */
129        function getLayoutWidth() {
130                $paperWidth = !empty($this->paperWidth) ? $this->paperWidth : $this->rtf->paperWidth;
131                $marginLeft = !empty($this->marginLeft) ? $this->marginLeft : $this->rtf->marginLeft;
132                $marginRight = !empty($this->marginRight) ? $this->marginRight : $this->rtf->marginRight;
133               
134                return ($paperWidth - $marginLeft - $marginRight);
135        }
136       
137        /**
138     * Sets borders of section pages.
139     * @param BorderFormat &$borderFormat
140     * @param boolean $left If false, left border is not set (default true)
141     * @param boolean $top If false, top border is not set (default true)
142     * @param boolean $right If false, right border is not set (default true)
143     * @param boolean $bottom If false, bottom border is not set (default true)
144     * @access public   
145     */ 
146        function setBorders(&$borderFormat, $left = true, $top = true, $right = true, $bottom = true) {   
147                if (empty($this->bordered)) {             
148                        $this->bordered = new Bordered();
149                }
150               
151                $this->bordered->setBorders($borderFormat, $left, $top, $right, $bottom);
152        }
153                       
154        /**
155         * Sets number of columns in section.
156         * @access public
157         * @param integer $columnsCount Number of columns
158         */
159        function setColumnsCount($columnsCount) {         
160                $this->columnsCount = $columnsCount;
161                unSet($this->columnsWidths);
162        }
163       
164        /**
165         * Sets space (width) between columns.
166         * @access public
167         * @param float $spaceBetweenColumns Space between columns
168         */
169        function setSpaceBetweenColumns($spaceBetweenColumns) {         
170                $this->spaceBetweenColumns = $spaceBetweenColumns;
171        }
172       
173        /**
174         * Sets section columns with different widths. <br>
175         * If you use this function, you shouldn't use {@see SetColumnsNumber}.
176         * @access public
177         * @param array $columnsWidths Array with columns widths
178         * @todo Check if columns width sum doesn't overload paper width.
179         */
180        function setColumns($columnsWidths) {     
181                if (is_array($columnsWidths)) {             
182                        $this->columnsCount = count($columnsWidths);
183                        $this->columnsWidths = $columnsWidths; 
184                }
185        }
186       
187        /**
188         * Sets no section break.
189         * If footnotes are use in different sections, Word always will break sections.
190         * @access public
191         */
192        function setNoBreak() {   
193                $this->noBreak = true;
194        }
195       
196        /**
197         * Sets line between columns.
198         * @access public       
199         */
200        function setLineBetweenColumns() {       
201                $this->lineBetweenColumns = true;       
202        }               
203               
204        /**
205         * Sets vertical alignment of text of section.
206         * @param string $alignment Possible values: <br>
207         * 'top' => top (default)<br>
208         * 'center' => center <br>
209         * 'bottom' => bottom <br>
210         * 'justify' => justify <br>
211         * @todo bottom justify don't work
212         * @accces public
213         */
214        function setVerticalAlignment($alignment) {       
215                switch ($alignment) {               
216                    default:               
217                        $this->alignment = "\vertalt ";
218                    break;
219                   
220                    case 'center':                     
221                        $this->alignment = "\vertalc ";
222                    break;
223                   
224                    case 'bottom':                     
225                        $this->alignment = "\vertalb ";
226                    break;                 
227                   
228                    case 'justify':                     
229                        $this->alignment = "\vertalj ";
230                    break;
231                }
232        }
233               
234        /**
235         * Creates header for section pages.
236         * @param $type Possible values: <br>
237         * 'all' => all pages (different odd and even headers/footers must be not set) <br>
238         * 'left' => left pages (different odd and even headers/footers must be set) <br>
239         * 'right' => right pages (different odd and even headers/footers must be set)  <br>
240         * 'first' => first page         
241         * @access public
242         * @return Header
243         */
244        function &addHeader($type = 'all') {
245                if (empty($this->rtf->oddEvenDifferent) && $type == 'all') {
246                    $header = new Header($this->rtf, $type);
247                } else if (!empty($this->rtf->oddEvenDifferent) 
248                                                && ($type == 'left' || $type == 'right')) {               
249                        $header = new Header($this->rtf, $type);       
250                } else if ($type == 'first') {
251                        $header = new Header($this->rtf, $type);       
252                        $this->titlepg = 1;
253                } else {                       
254                        return;
255                }               
256
257                $this->headers[$type] = &$header;
258                return $header;         
259        }       
260       
261        /**
262         * Creates footer for section pages.
263         * @param $type Possible values: <br>
264         * 'all' => all pages (different odd and even headers/footers must be not set) <br>
265         * 'left' => left pages (different odd and even headers/footers must be set) <br>
266         * 'right' => right pages (different odd and even headers/footers must be set)  <br>
267         * 'first' => first page         
268         * @access public
269         * @return Footer
270         */
271        function &addFooter($type = 'all') {
272                if (empty($this->rtf->oddEvenDifferent) && $type == 'all') {
273                    $footer = new Footer($this->rtf, $type);
274                } else if (!empty($this->rtf->oddEvenDifferent) 
275                                                && ($type == 'left' || $type == 'right')) {               
276                        $footer = new Footer($this->rtf, $type);       
277                } else if ($type == 'first') {
278                        $footer = new Footer($this->rtf, $type);       
279                        $this->titlepg = 1;
280                } else {                               
281                        return;
282                }               
283
284                $this->footers[$type] = &$footer;
285                return $footer;         
286        } 
287       
288        /**
289         * Breaks page.
290         * @since 0.2.0/ This method is used instead of using "page" tag in Container::writeText method.
291         * @?ccess public.
292         */
293        function insertPageBreak() {
294                $this->elements[] = "\\page";
295        }
296               
297        /**
298         * Gets rtf code of section. Internal use.
299         * @return string
300         * @access public
301         */
302        function getContent() {   
303                $content = '';
304                               
305                if (empty($this->first)) {     
306                        $content .= '\sect \sectd ';
307                }               
308                               
309                //headers
310                if (!empty($this->headers)) {
311                        foreach ($this->headers as $value) {             
312                                $content .= $value->getContent();
313                        }
314                } else {
315                        foreach ($this->rtf->headers as $value) {                 
316                                $content .= $value->getContent();
317                        }
318                }
319               
320                //footers
321                if (!empty($this->footers)) {
322                        foreach ($this->footers as $value) {             
323                                $content .= $value->getContent();
324                        }
325                } else {
326                        foreach ($this->rtf->footers as $value) {                 
327                                $content .= $value->getContent();
328                        }
329                }
330               
331                //borders
332                if (!empty($this->bordered)) {
333                        $content .= $this->bordered->getContent($this->rtf, '\pg');
334                } else if (!empty($this->rtf->bordered)) {     
335                        $content .= $this->rtf->bordered->getContent($this->rtf, '\pg');
336                }               
337               
338                //section properties
339                if (!empty($this->noBreak)) {           
340                        $content .= '\sbknone ';       
341                }
342               
343                if (!empty($this->columnsCount)) {                 
344                        $content .= '\cols'.$this->columnsCount.' '; 
345                }
346               
347                if (empty($this->columnsWidths)) {                             
348                        if (!empty($this->spaceBetweenColumns)) {                         
349                                $content .= '\colsx'.round($this->spaceBetweenColumns * TWIPS_IN_CM).' ';
350                        }                       
351                } else {                 
352                        $width = 0;
353                        foreach ($this->columnsWidths as $value) {                       
354                                $width += $value * TWIPS_IN_CM;
355                        }
356                       
357                        $printableWidth = ($this->rtf->paperWidth - $this->rtf->marginLeft - $this->rtf->marginRight);                 
358                        $space = round(($printableWidth * TWIPS_IN_CM - $width) / (count($this->columnsWidths) - 1));
359                                               
360                        $i = 1;
361                        foreach ($this->columnsWidths as $key => $value) {
362                                $content .= '\colno'.$i.'\colw'.($value * TWIPS_IN_CM);                         
363                                if (!empty($this->columnsWidths[$key])) {                                 
364                                        $content .= '\colsr'.$space;
365                                }
366                                $i ++;
367                        }                 
368                        $content .= ' ';
369                }
370                                       
371                if (!empty($this->lineBetweenColumns)) {                 
372                        $content .= '\linebetcol ';
373                }
374                               
375                /*---Page part---*/                             
376                if (isSet($this->paperWidth)) {           
377                        $content .= '\pgwsxn'.round($this->paperWidth * TWIPS_IN_CM).' ';
378                }
379               
380                if (isSet($this->paperHeight)) {                 
381                        $content .= '\pghsxn'.round($this->paperHeight * TWIPS_IN_CM).' ';
382                } 
383               
384                if (isSet($this->marginLeft)) {           
385                        $content .= '\marglsxn'.round($this->marginLeft * TWIPS_IN_CM).' ';
386                } 
387               
388                if (isSet($this->marginRight)) {                 
389                        $content .= '\margrsxn'.round($this->marginRight * TWIPS_IN_CM).' ';
390                }
391               
392                if (isSet($this->marginTop)) {           
393                        $content .= '\margtsxn'.round($this->marginTop * TWIPS_IN_CM).' ';
394                }
395               
396                if (isSet($this->marginBottom)) {                 
397                        $content .= '\margbsxn'.round($this->marginBottom * TWIPS_IN_CM ).' ';
398                }
399               
400                if (isSet($this->gutter)) {                     
401                        $content .= '\guttersxn'.round($this->gutter * TWIPS_IN_CM).' '; 
402                }
403               
404                if (!empty($this->mirrorMargins)) {                     
405                        $content .= '\margmirsxn '; 
406                }                               
407               
408                //vertical alignment                           
409                if (!empty($this->alignment)) {           
410                        $content .= $this->alignment;     
411                }                       
412               
413                $content .= "\r\n".parent::getContent()."\r\n";         
414               
415                return $content;
416        } 
417}
418?>
Note: See TracBrowser for help on using the repository browser.