File : printRoute/RoutePrinter.js

1
/*
2
Copyright - 2020 - wwwouaiebe - Contact: http//www.ouaie.be/
3
4
This  program is free software;
5
you can redistribute it and/or modify it under the terms of the
6
GNU General Public License as published by the Free Software Foundation;
7
either version 3 of the License, or any later version.
8
9
This program is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
GNU General Public License for more details.
13
14
You should have received a copy of the GNU General Public License
15
along with this program; if not, write to the Free Software
16
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
*/
18
/*
19
Changes:
20
    - v4.0.0:
21
        - created from v3.6.0
22
Doc reviewed 202208
23
 */
24
25
import theErrorsUI from '../uis/errorsUI/ErrorsUI.js';
26
import theHTMLElementsFactory from '../core/uiLib/HTMLElementsFactory.js';
27
import theTravelNotesData from '../data/TravelNotesData.js';
28
import theDataSearchEngine from '../data/DataSearchEngine.js';
29
import theGeometry from '../core/lib/Geometry.js';
30
import theConfig from '../data/Config.js';
31
import theTranslator from '../core/uiLib/Translator.js';
32
import PrintViewsFactory from './PrintViewsFactory.js';
33
import ViewSize from './ViewSize.js';
34
import PrintPageBuilder from './PrintPageBuilder.js';
35
36
import { ZERO, TWO, LAT, LNG } from '../main/Constants.js';
37
38
/* ------------------------------------------------------------------------------------------------------------------------- */
39
/**
40
This class manages the print of a route
41
*/
42
/* ------------------------------------------------------------------------------------------------------------------------- */
43
44
class RoutePrinter {
45
46
    /**
47
    The number of tiles needed for printing a page
48
    @type {Number}
49
    */
50
51
    #tilesPerPage = ZERO;
52
53
    /**
54
    The tiles dimension in pixel
55
    @type {Number}
56
    */
57
58
    // eslint-disable-next-line no-magic-numbers
59
    static get #TILE_SIZE ( ) { return 256; }
60
61
    /**
62
    Compute the view size in lat and lng transforming the dimension given in mm by the user.
63
    @param {PrintRouteMapOptions} printRouteMapOptions the print options returned by the PrintRouteMapDialog
64
    */
65
66
    #computeMaxViewSize ( printRouteMapOptions ) {
67
68
        // creating a dummy HTMLElement to compute the view size
69
        const dummyDiv = theHTMLElementsFactory.create ( 'div', { }, document.body );
70
        dummyDiv.style.position = 'absolute';
71
        dummyDiv.style.top = '0';
72
        dummyDiv.style.left = '0';
73
        dummyDiv.style.width = String ( printRouteMapOptions.paperWidth - ( TWO * printRouteMapOptions.borderWidth ) ) + 'mm';
74
        dummyDiv.style.height = String ( printRouteMapOptions.paperHeight - ( TWO * printRouteMapOptions.borderWidth ) ) + 'mm';
75
76
        // transform the screen coordinates to lat and lng
77
        const topLeftScreen = theGeometry.screenCoordToLatLng ( ZERO, ZERO );
78
        const bottomRightScreen = theGeometry.screenCoordToLatLng (
79
            dummyDiv.clientWidth,
80
            dummyDiv.clientHeight
81
        );
82
83
        // computing the tiles needed for a page
84
        this.#tilesPerPage =
85
            Math.ceil ( dummyDiv.clientWidth / RoutePrinter.#TILE_SIZE ) *
86
            Math.ceil ( dummyDiv.clientHeight / RoutePrinter.#TILE_SIZE );
87
88
        document.body.removeChild ( dummyDiv );
89
90
        // computing the scale
91
        const scale = theTravelNotesData.map.getZoomScale (
92
            theTravelNotesData.map.getZoom ( ),
93
            printRouteMapOptions.zoomFactor
94
        );
95
96
        // computing the size and return.
97
        return new ViewSize (
98
            Math.abs ( topLeftScreen [ LNG ] - bottomRightScreen [ LNG ] ) * scale,
99
            Math.abs ( topLeftScreen [ LAT ] - bottomRightScreen [ LAT ] ) * scale
100
        );
101
    }
102
103
    /**
104
    The constructor
105
    */
106
107
    constructor ( ) {
108
        Object.freeze ( this );
109
    }
110
111
    /**
112
    Modify the main page, creating views on the page, so the page can be printed easily
113
    @param {PrintRouteMapOptions} printRouteMapOptions the PrintRouteMapOptions returned by the PrintRouteMapDialog
114
    @param {Number} routeObjId The objId of the route to print
115
    */
116
117
    print ( printRouteMapOptions, routeObjId ) {
118
119
        const route = theDataSearchEngine.getRoute ( routeObjId );
120
        if ( ! route ) {
121
            return;
122
        }
123
124
        // Computing the needed views
125
        const printViewsFactory = new PrintViewsFactory (
126
            route,
127
            this.#computeMaxViewSize ( printRouteMapOptions )
128
        );
129
130
        // Remain for debugging
131
        /*
132
        printViewsFactory.printViews.forEach (
133
            view => new LeafletRectangle ( [ view.bottomLeft, view.upperRight ] ).addTo ( theTravelNotesData.map )
134
        );
135
        console.log ( 'views :' + printViewsFactory.printViews.length );
136
        */
137
        // Verify the tiles needed and stop the command if too mutch tiles needed
138
139
        if ( theConfig.printRouteMap.maxTiles < printViewsFactory.printViews.length * this.#tilesPerPage ) {
140
            theErrorsUI.showError ( theTranslator.getText ( 'RoutePrinter - The maximum of allowed pages is reached.' ) );
141
            return;
142
        }
143
144
        // Prepare the main page, for printing, hidding the map, adding the views and a print toolbar
145
        const printPageBuilder = new PrintPageBuilder (
146
            route,
147
            printViewsFactory.printViews,
148
            printRouteMapOptions
149
        );
150
        printPageBuilder.preparePage ( );
151
    }
152
}
153
154
export default RoutePrinter;
155
156
/* --- End of file --------------------------------------------------------------------------------------------------------- */
157