xref: /webtrees/app/Report/ReportPdfCell.php (revision 3d75b35668268b7fca01f0f1781d0b33a78257ed)
1a25f0a04SGreg Roach<?php
2a25f0a04SGreg Roach/**
3a25f0a04SGreg Roach * webtrees: online genealogy
41062a142SGreg Roach * Copyright (C) 2018 webtrees development team
5a25f0a04SGreg Roach * This program is free software: you can redistribute it and/or modify
6a25f0a04SGreg Roach * it under the terms of the GNU General Public License as published by
7a25f0a04SGreg Roach * the Free Software Foundation, either version 3 of the License, or
8a25f0a04SGreg Roach * (at your option) any later version.
9a25f0a04SGreg Roach * This program is distributed in the hope that it will be useful,
10a25f0a04SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
11a25f0a04SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12a25f0a04SGreg Roach * GNU General Public License for more details.
13a25f0a04SGreg Roach * You should have received a copy of the GNU General Public License
14a25f0a04SGreg Roach * along with this program. If not, see <http://www.gnu.org/licenses/>.
15a25f0a04SGreg Roach */
16e7f56f2aSGreg Roachdeclare(strict_types=1);
17e7f56f2aSGreg Roach
1876692c8bSGreg Roachnamespace Fisharebest\Webtrees\Report;
1976692c8bSGreg Roach
203d7a8a4cSGreg Roachuse Fisharebest\Webtrees\Functions\FunctionsRtl;
21a25f0a04SGreg Roach
22a25f0a04SGreg Roach/**
23a25f0a04SGreg Roach * Class ReportPdfCell
24a25f0a04SGreg Roach */
25c1010edaSGreg Roachclass ReportPdfCell extends ReportBaseCell
26c1010edaSGreg Roach{
27a25f0a04SGreg Roach    /**
28a25f0a04SGreg Roach     * PDF Cell renderer
29a25f0a04SGreg Roach     *
30adc8b18aSGreg Roach     * @param ReportTcpdf $renderer
31c7ff4153SGreg Roach     *
32c7ff4153SGreg Roach     * @return void
33a25f0a04SGreg Roach     */
34c1010edaSGreg Roach    public function render($renderer)
35c1010edaSGreg Roach    {
36a25f0a04SGreg Roach
37a25f0a04SGreg Roach        // Set up the text style
38a25f0a04SGreg Roach        if (($renderer->getCurrentStyle()) != ($this->styleName)) {
39a25f0a04SGreg Roach            $renderer->setCurrentStyle($this->styleName);
40a25f0a04SGreg Roach        }
41*3d75b356SGreg Roach        $temptext = str_replace('#PAGENUM#', (string) $renderer->PageNo(), $this->text);
42a25f0a04SGreg Roach        // underline «title» part of Source item
43c1010edaSGreg Roach        $temptext = str_replace([
44c1010edaSGreg Roach            '«',
45c1010edaSGreg Roach            '»',
46c1010edaSGreg Roach        ], [
47c1010edaSGreg Roach            '<u>',
48c1010edaSGreg Roach            '</u>',
49c1010edaSGreg Roach        ], $temptext);
5013abd6f3SGreg Roach        $match = [];
51a25f0a04SGreg Roach        // Indicates if the cell background must be painted (1) or transparent (0)
52a25f0a04SGreg Roach        if ($this->fill == 1) {
53a25f0a04SGreg Roach            if (!empty($this->bgcolor)) {
54a25f0a04SGreg Roach                // HTML color to RGB
557a6ee1acSGreg Roach                if (preg_match('/#?(..)(..)(..)/', $this->bgcolor, $match)) {
56a25f0a04SGreg Roach                    $r = hexdec($match[1]);
57a25f0a04SGreg Roach                    $g = hexdec($match[2]);
58a25f0a04SGreg Roach                    $b = hexdec($match[3]);
59a25f0a04SGreg Roach                    $renderer->SetFillColor($r, $g, $b);
60a25f0a04SGreg Roach                }
61ce15a17aSGreg Roach            } else {
62ce15a17aSGreg Roach                // If no color set then don't fill
63a25f0a04SGreg Roach                $this->fill = 0;
64a25f0a04SGreg Roach            }
65a25f0a04SGreg Roach        }
66a25f0a04SGreg Roach        // Paint the Border color if set
67a25f0a04SGreg Roach        if (!empty($this->bocolor)) {
68a25f0a04SGreg Roach            // HTML color to RGB
697a6ee1acSGreg Roach            if (preg_match('/#?(..)(..)(..)/', $this->bocolor, $match)) {
70a25f0a04SGreg Roach                $r = hexdec($match[1]);
71a25f0a04SGreg Roach                $g = hexdec($match[2]);
72a25f0a04SGreg Roach                $b = hexdec($match[3]);
73a25f0a04SGreg Roach                $renderer->SetDrawColor($r, $g, $b);
74a25f0a04SGreg Roach            }
75a25f0a04SGreg Roach        }
76a25f0a04SGreg Roach        // Paint the text color or they might use inherited colors by the previous function
777a6ee1acSGreg Roach        if (preg_match('/#?(..)(..)(..)/', $this->tcolor, $match)) {
78a25f0a04SGreg Roach            $r = hexdec($match[1]);
79a25f0a04SGreg Roach            $g = hexdec($match[2]);
80a25f0a04SGreg Roach            $b = hexdec($match[3]);
81a25f0a04SGreg Roach            $renderer->SetTextColor($r, $g, $b);
82a25f0a04SGreg Roach        } else {
83a25f0a04SGreg Roach            $renderer->SetTextColor(0, 0, 0);
84a25f0a04SGreg Roach        }
85a25f0a04SGreg Roach
86a25f0a04SGreg Roach        // If current position (left)
87c21bdddcSGreg Roach        if ($this->left === ReportBaseElement::CURRENT_POSITION) {
88a25f0a04SGreg Roach            $cX = $renderer->GetX();
89ce15a17aSGreg Roach        } else {
90ce15a17aSGreg Roach            // For static position add margin (also updates X)
91a25f0a04SGreg Roach            $cX = $renderer->addMarginX($this->left);
92a25f0a04SGreg Roach        }
93a25f0a04SGreg Roach
94a25f0a04SGreg Roach        // Check the width if set to page wide OR set by xml to larger then page wide
95a25f0a04SGreg Roach        if ($this->width == 0 || $this->width > $renderer->getRemainingWidthPDF()) {
96a25f0a04SGreg Roach            $this->width = $renderer->getRemainingWidthPDF();
97a25f0a04SGreg Roach        }
98a25f0a04SGreg Roach        // For current position
99c21bdddcSGreg Roach        if ($this->top === ReportBaseElement::CURRENT_POSITION) {
100a25f0a04SGreg Roach            $this->top = $renderer->GetY();
101a25f0a04SGreg Roach        } else {
102a25f0a04SGreg Roach            $renderer->SetY($this->top);
103a25f0a04SGreg Roach        }
104a25f0a04SGreg Roach
105a25f0a04SGreg Roach        // Check the last cell height and adjust the current cell height if needed
106a25f0a04SGreg Roach        if ($renderer->lastCellHeight > $this->height) {
107a25f0a04SGreg Roach            $this->height = $renderer->lastCellHeight;
108a25f0a04SGreg Roach        }
109a25f0a04SGreg Roach        // Check for pagebreak
110a25f0a04SGreg Roach        if (!empty($temptext)) {
111a25f0a04SGreg Roach            $cHT = $renderer->getNumLines($temptext, $this->width);
112a25f0a04SGreg Roach            $cHT = $cHT * $renderer->getCellHeightRatio() * $renderer->getCurrentStyleHeight();
113a25f0a04SGreg Roach            $cM  = $renderer->getMargins();
114a25f0a04SGreg Roach            // Add padding
115a25f0a04SGreg Roach            if (is_array($cM['cell'])) {
116a25f0a04SGreg Roach                $cHT += ($cM['padding_bottom'] + $cM['padding_top']);
117a25f0a04SGreg Roach            } else {
118a25f0a04SGreg Roach                $cHT += ($cM['cell'] * 2);
119a25f0a04SGreg Roach            }
120a25f0a04SGreg Roach            // Add a new page if needed
121a25f0a04SGreg Roach            if ($renderer->checkPageBreakPDF($cHT)) {
122a25f0a04SGreg Roach                $this->top = $renderer->GetY();
123a25f0a04SGreg Roach            }
12479b2f823SGreg Roach            $temptext = FunctionsRtl::spanLtrRtl($temptext);
125a25f0a04SGreg Roach        }
126a25f0a04SGreg Roach        // HTML ready - last value is true
127a25f0a04SGreg Roach        $renderer->MultiCell(
128a25f0a04SGreg Roach            $this->width,
129a25f0a04SGreg Roach            $this->height,
130a25f0a04SGreg Roach            $temptext,
131a25f0a04SGreg Roach            $this->border,
132a25f0a04SGreg Roach            $this->align,
133a25f0a04SGreg Roach            $this->fill,
134a25f0a04SGreg Roach            $this->newline,
135a25f0a04SGreg Roach            $cX,
136a25f0a04SGreg Roach            $this->top,
137a25f0a04SGreg Roach            $this->reseth,
138a25f0a04SGreg Roach            $this->stretch,
139a25f0a04SGreg Roach            true
140a25f0a04SGreg Roach        );
141a25f0a04SGreg Roach        // Reset the last cell height for the next line
142a25f0a04SGreg Roach        if ($this->newline >= 1) {
143a25f0a04SGreg Roach            $renderer->lastCellHeight = 0;
144ce15a17aSGreg Roach        } elseif ($renderer->lastCellHeight < $renderer->getLastH()) {
145ce15a17aSGreg Roach            // OR save the last height if heigher then before
146a25f0a04SGreg Roach            $renderer->lastCellHeight = $renderer->getLastH();
147a25f0a04SGreg Roach        }
148a25f0a04SGreg Roach
149a25f0a04SGreg Roach        // Set up the url link if exists ontop of the cell
150a25f0a04SGreg Roach        if (!empty($this->url)) {
151a25f0a04SGreg Roach            $renderer->Link($cX, $this->top, $this->width, $this->height, $this->url);
152a25f0a04SGreg Roach        }
153a25f0a04SGreg Roach        // Reset the border and the text color to black or they will be inherited
154a25f0a04SGreg Roach        $renderer->SetDrawColor(0, 0, 0);
155a25f0a04SGreg Roach        $renderer->SetTextColor(0, 0, 0);
156a25f0a04SGreg Roach    }
157a25f0a04SGreg Roach}
158