xref: /aoo4110/main/vcl/inc/impprn.hxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #if 0
25*b1cdbd2cSJim Jagielski #define _SV_IMPPRN_HXX
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <vcl/print.hxx>
28*b1cdbd2cSJim Jagielski #include <vcl/timer.hxx>
29*b1cdbd2cSJim Jagielski #ifndef _VCL_IMPDEL_HXX
30*b1cdbd2cSJim Jagielski #include <vcl/impdel.hxx>
31*b1cdbd2cSJim Jagielski #endif
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <vector>
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski struct QueuePage;
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski // ----------------
38*b1cdbd2cSJim Jagielski // - ImplQPrinter -
39*b1cdbd2cSJim Jagielski // ----------------
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski /*
42*b1cdbd2cSJim Jagielski     ImplQPrinter is on most systems a simple buffer that allows a potential
43*b1cdbd2cSJim Jagielski     lengthy print job to be printed in the background. For this it saves all
44*b1cdbd2cSJim Jagielski     normal drawing operations for each printed page to a metafile, then spooling
45*b1cdbd2cSJim Jagielski     the metafiles timer based to a normal printer. The application can act in the meantime
46*b1cdbd2cSJim Jagielski     including changing the original document without influencing the print job.
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski     On some systems (currently Mac/Aqua Cocoa) ImplQPrinter has the additional
49*b1cdbd2cSJim Jagielski     purpose of adapting to the print system: here theprint systems starts a
50*b1cdbd2cSJim Jagielski     job and will not return from that function until it has ended; to do so
51*b1cdbd2cSJim Jagielski     it queries for each consecutive page to be printed. Also the Cocoa print system
52*b1cdbd2cSJim Jagielski     needs to know the number of pages BEFORE starting a print job. Since our Printer
53*b1cdbd2cSJim Jagielski     does not know that, we need to do the completing spooling to ImplQPrinter before
54*b1cdbd2cSJim Jagielski     we can actually print to the real print system. Let's call this the pull model
55*b1cdbd2cSJim Jagielski     instead of the push model (because the systems pulls the pages).
56*b1cdbd2cSJim Jagielski */
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski class ImplQPrinter : public Printer, public vcl::DeletionNotifier
59*b1cdbd2cSJim Jagielski {
60*b1cdbd2cSJim Jagielski private:
61*b1cdbd2cSJim Jagielski 	Printer*                        mpParent;
62*b1cdbd2cSJim Jagielski 	std::vector< QueuePage* >       maQueue;
63*b1cdbd2cSJim Jagielski 	AutoTimer                       maTimer;
64*b1cdbd2cSJim Jagielski 	bool                            mbAborted;
65*b1cdbd2cSJim Jagielski 	bool                            mbUserCopy;
66*b1cdbd2cSJim Jagielski 	bool                            mbDestroyAllowed;
67*b1cdbd2cSJim Jagielski 	bool                            mbDestroyed;
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski     GDIMetaFile                     maCurPageMetaFile;
70*b1cdbd2cSJim Jagielski     long                            mnMaxBmpDPIX;
71*b1cdbd2cSJim Jagielski     long                            mnMaxBmpDPIY;
72*b1cdbd2cSJim Jagielski     sal_uLong                           mnRestoreDrawMode;
73*b1cdbd2cSJim Jagielski     int                             mnCurCopyCount;
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski 				DECL_LINK( ImplPrintHdl, Timer* );
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski 				~ImplQPrinter();
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski 	void		ImplPrintMtf( GDIMetaFile& rMtf, long nMaxBmpDPIX, long nMaxBmpDPIY );
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski                 ImplQPrinter( const ImplQPrinter& rPrinter );
82*b1cdbd2cSJim Jagielski     Printer&    operator =( const ImplQPrinter& rPrinter );
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski     void        PrePrintPage( QueuePage* );
85*b1cdbd2cSJim Jagielski     void        PostPrintPage();
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski public:
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski 				ImplQPrinter( Printer* pParent );
90*b1cdbd2cSJim Jagielski 	void		Destroy();
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski 	void		StartQueuePrint();
93*b1cdbd2cSJim Jagielski 	void		EndQueuePrint();
94*b1cdbd2cSJim Jagielski 	void		AbortQueuePrint();
95*b1cdbd2cSJim Jagielski 	void		AddQueuePage( GDIMetaFile* pPage, sal_uInt16 nPage, sal_Bool bNewJobSetup );
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski 	bool		IsUserCopy() const { return mbUserCopy; }
98*b1cdbd2cSJim Jagielski 	void		SetUserCopy( bool bSet ) { mbUserCopy = bSet; }
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski     /**
101*b1cdbd2cSJim Jagielski     used by pull implementation to emit the next page
102*b1cdbd2cSJim Jagielski     */
103*b1cdbd2cSJim Jagielski     void        PrintPage( unsigned int nPage );
104*b1cdbd2cSJim Jagielski     /**
105*b1cdbd2cSJim Jagielski     used by pull implementation to get the number of physical pages
106*b1cdbd2cSJim Jagielski     (that is how often PrintNextPage should be called)
107*b1cdbd2cSJim Jagielski     */
108*b1cdbd2cSJim Jagielski     sal_uLong       GetPrintPageCount() const;
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski     /**
111*b1cdbd2cSJim Jagielski     used by pull implementation to get ranges of physical pages that
112*b1cdbd2cSJim Jagielski     are to be printed on the same paper. If bIncludeOrientationChanges is true
113*b1cdbd2cSJim Jagielski     then orientation changes will not break a page run; the implementation has
114*b1cdbd2cSJim Jagielski     to rotate the page contents accordingly in that case.
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski     The returned vector contains all pages indices beginning a new medium and additionally
117*b1cdbd2cSJim Jagielski     the index that of the last page+1 (for convenience, so the length of a range
118*b1cdbd2cSJim Jagielski     is always v[i+1] - v[i])
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski     Example: 5 pages, all A4
121*b1cdbd2cSJim Jagielski     return: [0 5]
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski     Example: 6 pages, beginning A4, switching tol A5 on fourth page, back to A4 on fifth page
124*b1cdbd2cSJim Jagielski     return [0 3 4 6]
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski     returns an false in push model (error condition)
127*b1cdbd2cSJim Jagielski     */
128*b1cdbd2cSJim Jagielski     bool GetPaperRanges( std::vector< sal_uLong >& o_rRanges, bool i_bIncludeOrientationChanges ) const;
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski     /**
131*b1cdbd2cSJim Jagielski     get the jobsetup for a page
132*b1cdbd2cSJim Jagielski     */
133*b1cdbd2cSJim Jagielski     ImplJobSetup* GetPageSetup( unsigned int nPage ) const;
134*b1cdbd2cSJim Jagielski };
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski #endif	// _SV_IMPPRN_HXX
137