xref: /trunk/main/vcl/source/gdi/print.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_vcl.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #define ENABLE_BYTESTRING_STREAM_OPERATORS
32*cdf0e10cSrcweir #include <list>
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir #include <tools/debug.hxx>
35*cdf0e10cSrcweir #include <tools/resary.hxx>
36*cdf0e10cSrcweir #include <tools/stream.hxx>
37*cdf0e10cSrcweir #include <tools/vcompat.hxx>
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir #include <vcl/unohelp.hxx>
40*cdf0e10cSrcweir #include <vcl/svapp.hxx>
41*cdf0e10cSrcweir #include <vcl/wrkwin.hxx>
42*cdf0e10cSrcweir #include <vcl/virdev.hxx>
43*cdf0e10cSrcweir #include <vcl/window.hxx>
44*cdf0e10cSrcweir #include <vcl/gdimtf.hxx>
45*cdf0e10cSrcweir #include <vcl/metaact.hxx>
46*cdf0e10cSrcweir #include <vcl/print.hxx>
47*cdf0e10cSrcweir 
48*cdf0e10cSrcweir #include <salinst.hxx>
49*cdf0e10cSrcweir #include <salgdi.hxx>
50*cdf0e10cSrcweir #include <salptype.hxx>
51*cdf0e10cSrcweir #include <salprn.hxx>
52*cdf0e10cSrcweir #include <svdata.hxx>
53*cdf0e10cSrcweir #include <svids.hrc>
54*cdf0e10cSrcweir #include <jobset.h>
55*cdf0e10cSrcweir #include <outdev.h>
56*cdf0e10cSrcweir #include <print.h>
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir #include "com/sun/star/beans/XPropertySet.hpp"
61*cdf0e10cSrcweir #include "com/sun/star/container/XNameAccess.hpp"
62*cdf0e10cSrcweir #include "com/sun/star/lang/XMultiServiceFactory.hpp"
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir using namespace com::sun::star::uno;
65*cdf0e10cSrcweir using namespace com::sun::star::lang;
66*cdf0e10cSrcweir using namespace com::sun::star::beans;
67*cdf0e10cSrcweir using namespace com::sun::star::container;
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir int nImplSysDialog = 0;
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir // =======================================================================
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir namespace
74*cdf0e10cSrcweir {
75*cdf0e10cSrcweir     static Paper ImplGetPaperFormat( long nWidth100thMM, long nHeight100thMM )
76*cdf0e10cSrcweir     {
77*cdf0e10cSrcweir         PaperInfo aInfo(nWidth100thMM, nHeight100thMM);
78*cdf0e10cSrcweir         aInfo.doSloppyFit();
79*cdf0e10cSrcweir         return aInfo.getPaper();
80*cdf0e10cSrcweir     }
81*cdf0e10cSrcweir 
82*cdf0e10cSrcweir // -----------------------------------------------------------------------
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir     static const PaperInfo& ImplGetEmptyPaper()
85*cdf0e10cSrcweir     {
86*cdf0e10cSrcweir         static PaperInfo aInfo(PAPER_USER);
87*cdf0e10cSrcweir         return aInfo;
88*cdf0e10cSrcweir     }
89*cdf0e10cSrcweir }
90*cdf0e10cSrcweir 
91*cdf0e10cSrcweir // =======================================================================
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir void ImplUpdateJobSetupPaper( JobSetup& rJobSetup )
94*cdf0e10cSrcweir {
95*cdf0e10cSrcweir 	const ImplJobSetup* pConstData = rJobSetup.ImplGetConstData();
96*cdf0e10cSrcweir 
97*cdf0e10cSrcweir 	if ( !pConstData->mnPaperWidth || !pConstData->mnPaperHeight )
98*cdf0e10cSrcweir 	{
99*cdf0e10cSrcweir 		if ( pConstData->mePaperFormat != PAPER_USER )
100*cdf0e10cSrcweir 		{
101*cdf0e10cSrcweir 			ImplJobSetup* pData  = rJobSetup.ImplGetData();
102*cdf0e10cSrcweir             PaperInfo aInfo(pConstData->mePaperFormat);
103*cdf0e10cSrcweir 			pData->mnPaperWidth  = aInfo.getWidth();
104*cdf0e10cSrcweir 			pData->mnPaperHeight = aInfo.getHeight();
105*cdf0e10cSrcweir 		}
106*cdf0e10cSrcweir 	}
107*cdf0e10cSrcweir 	else if ( pConstData->mePaperFormat == PAPER_USER )
108*cdf0e10cSrcweir 	{
109*cdf0e10cSrcweir 		Paper ePaper = ImplGetPaperFormat( pConstData->mnPaperWidth, pConstData->mnPaperHeight );
110*cdf0e10cSrcweir 		if ( ePaper != PAPER_USER )
111*cdf0e10cSrcweir 			rJobSetup.ImplGetData()->mePaperFormat = ePaper;
112*cdf0e10cSrcweir 	}
113*cdf0e10cSrcweir }
114*cdf0e10cSrcweir 
115*cdf0e10cSrcweir // ------------------
116*cdf0e10cSrcweir // - PrinterOptions -
117*cdf0e10cSrcweir // ------------------
118*cdf0e10cSrcweir 
119*cdf0e10cSrcweir PrinterOptions::PrinterOptions() :
120*cdf0e10cSrcweir     mbReduceTransparency( sal_False ),
121*cdf0e10cSrcweir     meReducedTransparencyMode( PRINTER_TRANSPARENCY_AUTO ),
122*cdf0e10cSrcweir     mbReduceGradients( sal_False ),
123*cdf0e10cSrcweir     meReducedGradientsMode( PRINTER_GRADIENT_STRIPES ),
124*cdf0e10cSrcweir     mnReducedGradientStepCount( 64 ),
125*cdf0e10cSrcweir     mbReduceBitmaps( sal_False ),
126*cdf0e10cSrcweir     meReducedBitmapMode( PRINTER_BITMAP_NORMAL ),
127*cdf0e10cSrcweir     mnReducedBitmapResolution( 200 ),
128*cdf0e10cSrcweir     mbReducedBitmapsIncludeTransparency( sal_True ),
129*cdf0e10cSrcweir     mbConvertToGreyscales( sal_False )
130*cdf0e10cSrcweir {
131*cdf0e10cSrcweir }
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir // -----------------------------------------------------------------------
134*cdf0e10cSrcweir 
135*cdf0e10cSrcweir PrinterOptions::~PrinterOptions()
136*cdf0e10cSrcweir {
137*cdf0e10cSrcweir }
138*cdf0e10cSrcweir 
139*cdf0e10cSrcweir #define	PROPERTYNAME_REDUCETRANSPARENCY	                rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReduceTransparency"))
140*cdf0e10cSrcweir #define	PROPERTYNAME_REDUCEDTRANSPARENCYMODE	        rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedTransparencyMode"))
141*cdf0e10cSrcweir #define	PROPERTYNAME_REDUCEGRADIENTS		            rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReduceGradients"))
142*cdf0e10cSrcweir #define	PROPERTYNAME_REDUCEDGRADIENTMODE		        rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedGradientMode"))
143*cdf0e10cSrcweir #define PROPERTYNAME_REDUCEDGRADIENTSTEPCOUNT           rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedGradientStepCount"))
144*cdf0e10cSrcweir #define PROPERTYNAME_REDUCEBITMAPS                      rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReduceBitmaps"))
145*cdf0e10cSrcweir #define PROPERTYNAME_REDUCEDBITMAPMODE                  rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedBitmapMode"))
146*cdf0e10cSrcweir #define PROPERTYNAME_REDUCEDBITMAPRESOLUTION            rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedBitmapResolution"))
147*cdf0e10cSrcweir #define PROPERTYNAME_REDUCEDBITMAPINCLUDESTRANSPARENCY  rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedBitmapIncludesTransparency"))
148*cdf0e10cSrcweir #define PROPERTYNAME_CONVERTTOGREYSCALES                rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ConvertToGreyscales"))
149*cdf0e10cSrcweir 
150*cdf0e10cSrcweir bool PrinterOptions::ReadFromConfig( bool i_bFile )
151*cdf0e10cSrcweir {
152*cdf0e10cSrcweir     bool bSuccess = false;
153*cdf0e10cSrcweir     // save old state in case something goes wrong
154*cdf0e10cSrcweir     PrinterOptions aOldValues( *this );
155*cdf0e10cSrcweir 
156*cdf0e10cSrcweir     // get the configuration service
157*cdf0e10cSrcweir     Reference< XMultiServiceFactory > xConfigProvider;
158*cdf0e10cSrcweir     Reference< XNameAccess > xConfigAccess;
159*cdf0e10cSrcweir     try
160*cdf0e10cSrcweir     {
161*cdf0e10cSrcweir         // get service provider
162*cdf0e10cSrcweir         Reference< XMultiServiceFactory > xSMgr( comphelper::getProcessServiceFactory() );
163*cdf0e10cSrcweir         // create configuration hierachical access name
164*cdf0e10cSrcweir         if( xSMgr.is() )
165*cdf0e10cSrcweir         {
166*cdf0e10cSrcweir             try
167*cdf0e10cSrcweir             {
168*cdf0e10cSrcweir                 xConfigProvider = Reference< XMultiServiceFactory >(
169*cdf0e10cSrcweir                         xSMgr->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
170*cdf0e10cSrcweir                                         "com.sun.star.configuration.ConfigurationProvider" ))),
171*cdf0e10cSrcweir                         UNO_QUERY );
172*cdf0e10cSrcweir                 if( xConfigProvider.is() )
173*cdf0e10cSrcweir                 {
174*cdf0e10cSrcweir                     Sequence< Any > aArgs(1);
175*cdf0e10cSrcweir                     PropertyValue aVal;
176*cdf0e10cSrcweir                     aVal.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "nodepath" ) );
177*cdf0e10cSrcweir                     if( i_bFile )
178*cdf0e10cSrcweir                         aVal.Value <<= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Common/Print/Option/File" ) );
179*cdf0e10cSrcweir                     else
180*cdf0e10cSrcweir                         aVal.Value <<= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Common/Print/Option/Printer" ) );
181*cdf0e10cSrcweir                     aArgs.getArray()[0] <<= aVal;
182*cdf0e10cSrcweir                     xConfigAccess = Reference< XNameAccess >(
183*cdf0e10cSrcweir                             xConfigProvider->createInstanceWithArguments(
184*cdf0e10cSrcweir                                 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationAccess" )), aArgs ),
185*cdf0e10cSrcweir                                 UNO_QUERY );
186*cdf0e10cSrcweir                     if( xConfigAccess.is() )
187*cdf0e10cSrcweir                     {
188*cdf0e10cSrcweir                         Reference< XPropertySet > xSet( xConfigAccess, UNO_QUERY );
189*cdf0e10cSrcweir                         if( xSet.is() )
190*cdf0e10cSrcweir                         {
191*cdf0e10cSrcweir                             sal_Int32 nValue = 0;
192*cdf0e10cSrcweir                             sal_Bool  bValue = 0;
193*cdf0e10cSrcweir                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCETRANSPARENCY) >>= bValue )
194*cdf0e10cSrcweir                                 SetReduceTransparency( bValue );
195*cdf0e10cSrcweir                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDTRANSPARENCYMODE) >>= nValue )
196*cdf0e10cSrcweir                                 SetReducedTransparencyMode( (PrinterTransparencyMode)nValue );
197*cdf0e10cSrcweir                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEGRADIENTS) >>= bValue )
198*cdf0e10cSrcweir                                 SetReduceGradients( bValue );
199*cdf0e10cSrcweir                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDGRADIENTMODE) >>= nValue )
200*cdf0e10cSrcweir                                 SetReducedGradientMode( (PrinterGradientMode)nValue );
201*cdf0e10cSrcweir                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDGRADIENTSTEPCOUNT) >>= nValue )
202*cdf0e10cSrcweir                                 SetReducedGradientStepCount( (sal_uInt16)nValue );
203*cdf0e10cSrcweir                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEBITMAPS) >>= bValue )
204*cdf0e10cSrcweir                                 SetReduceBitmaps( bValue );
205*cdf0e10cSrcweir                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDBITMAPMODE) >>= nValue )
206*cdf0e10cSrcweir                                 SetReducedBitmapMode( (PrinterBitmapMode)nValue );
207*cdf0e10cSrcweir                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDBITMAPRESOLUTION) >>= nValue )
208*cdf0e10cSrcweir                                 SetReducedBitmapResolution( (sal_uInt16)nValue );
209*cdf0e10cSrcweir                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDBITMAPINCLUDESTRANSPARENCY) >>= bValue )
210*cdf0e10cSrcweir                                 SetReducedBitmapIncludesTransparency( bValue );
211*cdf0e10cSrcweir                             if( xSet->getPropertyValue(PROPERTYNAME_CONVERTTOGREYSCALES) >>= bValue )
212*cdf0e10cSrcweir                                 SetConvertToGreyscales( bValue );
213*cdf0e10cSrcweir 
214*cdf0e10cSrcweir                             bSuccess = true;
215*cdf0e10cSrcweir                         }
216*cdf0e10cSrcweir                     }
217*cdf0e10cSrcweir                 }
218*cdf0e10cSrcweir             }
219*cdf0e10cSrcweir             catch( Exception& )
220*cdf0e10cSrcweir             {
221*cdf0e10cSrcweir             }
222*cdf0e10cSrcweir         }
223*cdf0e10cSrcweir     }
224*cdf0e10cSrcweir     catch( WrappedTargetException& )
225*cdf0e10cSrcweir     {
226*cdf0e10cSrcweir     }
227*cdf0e10cSrcweir 
228*cdf0e10cSrcweir     if( ! bSuccess )
229*cdf0e10cSrcweir         *this = aOldValues;
230*cdf0e10cSrcweir     return bSuccess;
231*cdf0e10cSrcweir }
232*cdf0e10cSrcweir 
233*cdf0e10cSrcweir void Printer::SetPrinterOptions( const PrinterOptions& i_rOptions )
234*cdf0e10cSrcweir {
235*cdf0e10cSrcweir     *mpPrinterOptions = i_rOptions;
236*cdf0e10cSrcweir }
237*cdf0e10cSrcweir 
238*cdf0e10cSrcweir // -------------
239*cdf0e10cSrcweir // - QueueInfo -
240*cdf0e10cSrcweir // -------------
241*cdf0e10cSrcweir 
242*cdf0e10cSrcweir QueueInfo::QueueInfo()
243*cdf0e10cSrcweir {
244*cdf0e10cSrcweir 	mnStatus	= 0;
245*cdf0e10cSrcweir 	mnJobs		= 0;
246*cdf0e10cSrcweir }
247*cdf0e10cSrcweir 
248*cdf0e10cSrcweir // -----------------------------------------------------------------------
249*cdf0e10cSrcweir 
250*cdf0e10cSrcweir QueueInfo::QueueInfo( const QueueInfo& rInfo ) :
251*cdf0e10cSrcweir 	maPrinterName( rInfo.maPrinterName ),
252*cdf0e10cSrcweir 	maDriver( rInfo.maDriver ),
253*cdf0e10cSrcweir 	maLocation( rInfo.maLocation ),
254*cdf0e10cSrcweir 	maComment( rInfo.maComment ),
255*cdf0e10cSrcweir 	mnStatus( rInfo.mnStatus ),
256*cdf0e10cSrcweir 	mnJobs( rInfo.mnJobs )
257*cdf0e10cSrcweir {
258*cdf0e10cSrcweir }
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir // -----------------------------------------------------------------------
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir QueueInfo::~QueueInfo()
263*cdf0e10cSrcweir {
264*cdf0e10cSrcweir }
265*cdf0e10cSrcweir 
266*cdf0e10cSrcweir // -----------------------------------------------------------------------
267*cdf0e10cSrcweir 
268*cdf0e10cSrcweir bool QueueInfo::operator==( const QueueInfo& rInfo ) const
269*cdf0e10cSrcweir {
270*cdf0e10cSrcweir 	return
271*cdf0e10cSrcweir 		maPrinterName	== rInfo.maPrinterName	&&
272*cdf0e10cSrcweir 		maDriver		== rInfo.maDriver		&&
273*cdf0e10cSrcweir 		maLocation		== rInfo.maLocation		&&
274*cdf0e10cSrcweir 		maComment		== rInfo.maComment		&&
275*cdf0e10cSrcweir 		mnStatus		== rInfo.mnStatus		&&
276*cdf0e10cSrcweir 		mnJobs			== rInfo.mnJobs;
277*cdf0e10cSrcweir }
278*cdf0e10cSrcweir 
279*cdf0e10cSrcweir // -----------------------------------------------------------------------
280*cdf0e10cSrcweir 
281*cdf0e10cSrcweir SvStream& operator<<( SvStream& rOStream, const QueueInfo& rInfo )
282*cdf0e10cSrcweir {
283*cdf0e10cSrcweir 	VersionCompat aCompat( rOStream, STREAM_WRITE, 1 );
284*cdf0e10cSrcweir 
285*cdf0e10cSrcweir 	rOStream.WriteByteString( rInfo.maPrinterName, RTL_TEXTENCODING_UTF8 );
286*cdf0e10cSrcweir 	rOStream.WriteByteString( rInfo.maDriver, RTL_TEXTENCODING_UTF8 );
287*cdf0e10cSrcweir 	rOStream.WriteByteString( rInfo.maLocation, RTL_TEXTENCODING_UTF8 );
288*cdf0e10cSrcweir 	rOStream.WriteByteString( rInfo.maComment, RTL_TEXTENCODING_UTF8 );
289*cdf0e10cSrcweir 	rOStream << rInfo.mnStatus;
290*cdf0e10cSrcweir 	rOStream << rInfo.mnJobs;
291*cdf0e10cSrcweir 
292*cdf0e10cSrcweir 	return rOStream;
293*cdf0e10cSrcweir }
294*cdf0e10cSrcweir 
295*cdf0e10cSrcweir // -----------------------------------------------------------------------
296*cdf0e10cSrcweir 
297*cdf0e10cSrcweir SvStream& operator>>( SvStream& rIStream, QueueInfo& rInfo )
298*cdf0e10cSrcweir {
299*cdf0e10cSrcweir 	VersionCompat aCompat( rIStream, STREAM_READ );
300*cdf0e10cSrcweir 
301*cdf0e10cSrcweir 	rIStream.ReadByteString( rInfo.maPrinterName, RTL_TEXTENCODING_UTF8 );
302*cdf0e10cSrcweir 	rIStream.ReadByteString( rInfo.maDriver, RTL_TEXTENCODING_UTF8 );
303*cdf0e10cSrcweir 	rIStream.ReadByteString( rInfo.maLocation, RTL_TEXTENCODING_UTF8 );
304*cdf0e10cSrcweir 	rIStream.ReadByteString( rInfo.maComment, RTL_TEXTENCODING_UTF8 );
305*cdf0e10cSrcweir 	rIStream >> rInfo.mnStatus;
306*cdf0e10cSrcweir 	rIStream >> rInfo.mnJobs;
307*cdf0e10cSrcweir 
308*cdf0e10cSrcweir 	return rIStream;
309*cdf0e10cSrcweir }
310*cdf0e10cSrcweir 
311*cdf0e10cSrcweir // =======================================================================
312*cdf0e10cSrcweir 
313*cdf0e10cSrcweir SalPrinterQueueInfo::SalPrinterQueueInfo()
314*cdf0e10cSrcweir {
315*cdf0e10cSrcweir 	mnStatus	= 0;
316*cdf0e10cSrcweir 	mnJobs		= QUEUE_JOBS_DONTKNOW;
317*cdf0e10cSrcweir 	mpSysData	= NULL;
318*cdf0e10cSrcweir }
319*cdf0e10cSrcweir 
320*cdf0e10cSrcweir // -----------------------------------------------------------------------
321*cdf0e10cSrcweir 
322*cdf0e10cSrcweir SalPrinterQueueInfo::~SalPrinterQueueInfo()
323*cdf0e10cSrcweir {
324*cdf0e10cSrcweir }
325*cdf0e10cSrcweir 
326*cdf0e10cSrcweir // -----------------------------------------------------------------------
327*cdf0e10cSrcweir 
328*cdf0e10cSrcweir ImplPrnQueueList::~ImplPrnQueueList()
329*cdf0e10cSrcweir {
330*cdf0e10cSrcweir 	ImplSVData* 		pSVData = ImplGetSVData();
331*cdf0e10cSrcweir     for( unsigned int i = 0; i < m_aQueueInfos.size(); i++ )
332*cdf0e10cSrcweir     {
333*cdf0e10cSrcweir         delete m_aQueueInfos[i].mpQueueInfo;
334*cdf0e10cSrcweir         pSVData->mpDefInst->DeletePrinterQueueInfo( m_aQueueInfos[i].mpSalQueueInfo );
335*cdf0e10cSrcweir     }
336*cdf0e10cSrcweir }
337*cdf0e10cSrcweir 
338*cdf0e10cSrcweir // -----------------------------------------------------------------------
339*cdf0e10cSrcweir 
340*cdf0e10cSrcweir void ImplPrnQueueList::Add( SalPrinterQueueInfo* pData )
341*cdf0e10cSrcweir {
342*cdf0e10cSrcweir     std::hash_map< rtl::OUString, sal_Int32, rtl::OUStringHash >::iterator it =
343*cdf0e10cSrcweir         m_aNameToIndex.find( pData->maPrinterName );
344*cdf0e10cSrcweir     if( it == m_aNameToIndex.end() )
345*cdf0e10cSrcweir     {
346*cdf0e10cSrcweir         m_aNameToIndex[ pData->maPrinterName ] = m_aQueueInfos.size();
347*cdf0e10cSrcweir         m_aQueueInfos.push_back( ImplPrnQueueData() );
348*cdf0e10cSrcweir         m_aQueueInfos.back().mpQueueInfo = NULL;
349*cdf0e10cSrcweir         m_aQueueInfos.back().mpSalQueueInfo = pData;
350*cdf0e10cSrcweir         m_aPrinterList.push_back( pData->maPrinterName );
351*cdf0e10cSrcweir     }
352*cdf0e10cSrcweir     else // this should not happen, but ...
353*cdf0e10cSrcweir     {
354*cdf0e10cSrcweir         ImplPrnQueueData& rData = m_aQueueInfos[ it->second ];
355*cdf0e10cSrcweir         delete rData.mpQueueInfo;
356*cdf0e10cSrcweir         rData.mpQueueInfo = NULL;
357*cdf0e10cSrcweir         ImplGetSVData()->mpDefInst->DeletePrinterQueueInfo( rData.mpSalQueueInfo );
358*cdf0e10cSrcweir         rData.mpSalQueueInfo = pData;
359*cdf0e10cSrcweir     }
360*cdf0e10cSrcweir }
361*cdf0e10cSrcweir 
362*cdf0e10cSrcweir // -----------------------------------------------------------------------
363*cdf0e10cSrcweir 
364*cdf0e10cSrcweir ImplPrnQueueData* ImplPrnQueueList::Get( const rtl::OUString& rPrinter )
365*cdf0e10cSrcweir {
366*cdf0e10cSrcweir     ImplPrnQueueData* pData = NULL;
367*cdf0e10cSrcweir     std::hash_map<rtl::OUString,sal_Int32,rtl::OUStringHash>::iterator it =
368*cdf0e10cSrcweir         m_aNameToIndex.find( rPrinter );
369*cdf0e10cSrcweir     if( it != m_aNameToIndex.end() )
370*cdf0e10cSrcweir         pData = &m_aQueueInfos[it->second];
371*cdf0e10cSrcweir     return pData;
372*cdf0e10cSrcweir }
373*cdf0e10cSrcweir 
374*cdf0e10cSrcweir // =======================================================================
375*cdf0e10cSrcweir 
376*cdf0e10cSrcweir static void ImplInitPrnQueueList()
377*cdf0e10cSrcweir {
378*cdf0e10cSrcweir 	ImplSVData* pSVData = ImplGetSVData();
379*cdf0e10cSrcweir 
380*cdf0e10cSrcweir 	pSVData->maGDIData.mpPrinterQueueList = new ImplPrnQueueList;
381*cdf0e10cSrcweir 
382*cdf0e10cSrcweir     static const char* pEnv = getenv( "SAL_DISABLE_PRINTERLIST" );
383*cdf0e10cSrcweir     if( !pEnv || !*pEnv )
384*cdf0e10cSrcweir         pSVData->mpDefInst->GetPrinterQueueInfo( pSVData->maGDIData.mpPrinterQueueList );
385*cdf0e10cSrcweir }
386*cdf0e10cSrcweir 
387*cdf0e10cSrcweir // -----------------------------------------------------------------------
388*cdf0e10cSrcweir 
389*cdf0e10cSrcweir void ImplDeletePrnQueueList()
390*cdf0e10cSrcweir {
391*cdf0e10cSrcweir 	ImplSVData* 		pSVData = ImplGetSVData();
392*cdf0e10cSrcweir 	ImplPrnQueueList*	pPrnList = pSVData->maGDIData.mpPrinterQueueList;
393*cdf0e10cSrcweir 
394*cdf0e10cSrcweir 	if ( pPrnList )
395*cdf0e10cSrcweir 	{
396*cdf0e10cSrcweir 		delete pPrnList;
397*cdf0e10cSrcweir 		pSVData->maGDIData.mpPrinterQueueList = NULL;
398*cdf0e10cSrcweir 	}
399*cdf0e10cSrcweir }
400*cdf0e10cSrcweir 
401*cdf0e10cSrcweir // -----------------------------------------------------------------------
402*cdf0e10cSrcweir 
403*cdf0e10cSrcweir const std::vector<rtl::OUString>& Printer::GetPrinterQueues()
404*cdf0e10cSrcweir {
405*cdf0e10cSrcweir 	ImplSVData* 		pSVData = ImplGetSVData();
406*cdf0e10cSrcweir 	if ( !pSVData->maGDIData.mpPrinterQueueList )
407*cdf0e10cSrcweir 		ImplInitPrnQueueList();
408*cdf0e10cSrcweir     return pSVData->maGDIData.mpPrinterQueueList->m_aPrinterList;
409*cdf0e10cSrcweir }
410*cdf0e10cSrcweir 
411*cdf0e10cSrcweir // -----------------------------------------------------------------------
412*cdf0e10cSrcweir const QueueInfo* Printer::GetQueueInfo( const String& rPrinterName, bool bStatusUpdate )
413*cdf0e10cSrcweir {
414*cdf0e10cSrcweir 	ImplSVData* pSVData = ImplGetSVData();
415*cdf0e10cSrcweir 
416*cdf0e10cSrcweir 	if ( !pSVData->maGDIData.mpPrinterQueueList )
417*cdf0e10cSrcweir 		ImplInitPrnQueueList();
418*cdf0e10cSrcweir 
419*cdf0e10cSrcweir     ImplPrnQueueData* pInfo = pSVData->maGDIData.mpPrinterQueueList->Get( rPrinterName );
420*cdf0e10cSrcweir     if( pInfo )
421*cdf0e10cSrcweir     {
422*cdf0e10cSrcweir         if( !pInfo->mpQueueInfo || bStatusUpdate )
423*cdf0e10cSrcweir             pSVData->mpDefInst->GetPrinterQueueState( pInfo->mpSalQueueInfo );
424*cdf0e10cSrcweir 
425*cdf0e10cSrcweir         if ( !pInfo->mpQueueInfo )
426*cdf0e10cSrcweir             pInfo->mpQueueInfo = new QueueInfo;
427*cdf0e10cSrcweir 
428*cdf0e10cSrcweir         pInfo->mpQueueInfo->maPrinterName	= pInfo->mpSalQueueInfo->maPrinterName;
429*cdf0e10cSrcweir         pInfo->mpQueueInfo->maDriver		= pInfo->mpSalQueueInfo->maDriver;
430*cdf0e10cSrcweir         pInfo->mpQueueInfo->maLocation		= pInfo->mpSalQueueInfo->maLocation;
431*cdf0e10cSrcweir         pInfo->mpQueueInfo->maComment		= pInfo->mpSalQueueInfo->maComment;
432*cdf0e10cSrcweir         pInfo->mpQueueInfo->mnStatus		= pInfo->mpSalQueueInfo->mnStatus;
433*cdf0e10cSrcweir         pInfo->mpQueueInfo->mnJobs			= pInfo->mpSalQueueInfo->mnJobs;
434*cdf0e10cSrcweir         return pInfo->mpQueueInfo;
435*cdf0e10cSrcweir     }
436*cdf0e10cSrcweir     return NULL;
437*cdf0e10cSrcweir }
438*cdf0e10cSrcweir 
439*cdf0e10cSrcweir // -----------------------------------------------------------------------
440*cdf0e10cSrcweir 
441*cdf0e10cSrcweir XubString Printer::GetDefaultPrinterName()
442*cdf0e10cSrcweir {
443*cdf0e10cSrcweir     static const char* pEnv = getenv( "SAL_DISABLE_DEFAULTPRINTER" );
444*cdf0e10cSrcweir     if( !pEnv || !*pEnv )
445*cdf0e10cSrcweir     {
446*cdf0e10cSrcweir         ImplSVData* pSVData = ImplGetSVData();
447*cdf0e10cSrcweir 
448*cdf0e10cSrcweir         return pSVData->mpDefInst->GetDefaultPrinter();
449*cdf0e10cSrcweir     }
450*cdf0e10cSrcweir     return XubString();
451*cdf0e10cSrcweir }
452*cdf0e10cSrcweir 
453*cdf0e10cSrcweir // =======================================================================
454*cdf0e10cSrcweir 
455*cdf0e10cSrcweir void Printer::ImplInitData()
456*cdf0e10cSrcweir {
457*cdf0e10cSrcweir 	mbDevOutput 		= sal_False;
458*cdf0e10cSrcweir 	meOutDevType		= OUTDEV_PRINTER;
459*cdf0e10cSrcweir 	mbDefPrinter		= sal_False;
460*cdf0e10cSrcweir 	mnError 			= 0;
461*cdf0e10cSrcweir 	mnCurPage			= 0;
462*cdf0e10cSrcweir 	mnCurPrintPage		= 0;
463*cdf0e10cSrcweir 	mnPageQueueSize 	= 0;
464*cdf0e10cSrcweir 	mnCopyCount 		= 1;
465*cdf0e10cSrcweir 	mbCollateCopy		= sal_False;
466*cdf0e10cSrcweir 	mbPrinting			= sal_False;
467*cdf0e10cSrcweir 	mbJobActive 		= sal_False;
468*cdf0e10cSrcweir 	mbPrintFile 		= sal_False;
469*cdf0e10cSrcweir 	mbInPrintPage		= sal_False;
470*cdf0e10cSrcweir 	mbNewJobSetup		= sal_False;
471*cdf0e10cSrcweir 	mpInfoPrinter		= NULL;
472*cdf0e10cSrcweir 	mpPrinter			= NULL;
473*cdf0e10cSrcweir 	mpDisplayDev		= NULL;
474*cdf0e10cSrcweir 	mbIsQueuePrinter	= sal_False;
475*cdf0e10cSrcweir     mpPrinterOptions    = new PrinterOptions;
476*cdf0e10cSrcweir 
477*cdf0e10cSrcweir 	// Printer in die Liste eintragen
478*cdf0e10cSrcweir 	ImplSVData* pSVData = ImplGetSVData();
479*cdf0e10cSrcweir 	mpNext = pSVData->maGDIData.mpFirstPrinter;
480*cdf0e10cSrcweir 	mpPrev = NULL;
481*cdf0e10cSrcweir 	if ( mpNext )
482*cdf0e10cSrcweir 		mpNext->mpPrev = this;
483*cdf0e10cSrcweir 	else
484*cdf0e10cSrcweir 		pSVData->maGDIData.mpLastPrinter = this;
485*cdf0e10cSrcweir 	pSVData->maGDIData.mpFirstPrinter = this;
486*cdf0e10cSrcweir }
487*cdf0e10cSrcweir 
488*cdf0e10cSrcweir // -----------------------------------------------------------------------
489*cdf0e10cSrcweir 
490*cdf0e10cSrcweir void Printer::ImplInit( SalPrinterQueueInfo* pInfo )
491*cdf0e10cSrcweir {
492*cdf0e10cSrcweir 	ImplSVData* pSVData = ImplGetSVData();
493*cdf0e10cSrcweir     // #i74084# update info for this specific SalPrinterQueueInfo
494*cdf0e10cSrcweir     pSVData->mpDefInst->GetPrinterQueueState( pInfo );
495*cdf0e10cSrcweir 
496*cdf0e10cSrcweir 	// Testen, ob Treiber ueberhaupt mit dem JobSetup uebereinstimmt
497*cdf0e10cSrcweir 	ImplJobSetup* pJobSetup = maJobSetup.ImplGetData();
498*cdf0e10cSrcweir 
499*cdf0e10cSrcweir 	if ( pJobSetup->mpDriverData )
500*cdf0e10cSrcweir 	{
501*cdf0e10cSrcweir 		if ( (pJobSetup->maPrinterName != pInfo->maPrinterName) ||
502*cdf0e10cSrcweir 			 (pJobSetup->maDriver != pInfo->maDriver) )
503*cdf0e10cSrcweir 		{
504*cdf0e10cSrcweir 			rtl_freeMemory( pJobSetup->mpDriverData );
505*cdf0e10cSrcweir 			pJobSetup->mpDriverData = NULL;
506*cdf0e10cSrcweir 			pJobSetup->mnDriverDataLen = 0;
507*cdf0e10cSrcweir 		}
508*cdf0e10cSrcweir 	}
509*cdf0e10cSrcweir 
510*cdf0e10cSrcweir 	// Printernamen merken
511*cdf0e10cSrcweir 	maPrinterName = pInfo->maPrinterName;
512*cdf0e10cSrcweir 	maDriver = pInfo->maDriver;
513*cdf0e10cSrcweir 
514*cdf0e10cSrcweir 	// In JobSetup den Printernamen eintragen
515*cdf0e10cSrcweir 	pJobSetup->maPrinterName = maPrinterName;
516*cdf0e10cSrcweir 	pJobSetup->maDriver = maDriver;
517*cdf0e10cSrcweir 
518*cdf0e10cSrcweir 	mpInfoPrinter	= pSVData->mpDefInst->CreateInfoPrinter( pInfo, pJobSetup );
519*cdf0e10cSrcweir 	mpPrinter		= NULL;
520*cdf0e10cSrcweir 	mpJobGraphics	= NULL;
521*cdf0e10cSrcweir 	ImplUpdateJobSetupPaper( maJobSetup );
522*cdf0e10cSrcweir 
523*cdf0e10cSrcweir 	if ( !mpInfoPrinter )
524*cdf0e10cSrcweir 	{
525*cdf0e10cSrcweir 		ImplInitDisplay( NULL );
526*cdf0e10cSrcweir 		return;
527*cdf0e10cSrcweir 	}
528*cdf0e10cSrcweir 
529*cdf0e10cSrcweir 	// we need a graphics
530*cdf0e10cSrcweir 	if ( !ImplGetGraphics() )
531*cdf0e10cSrcweir 	{
532*cdf0e10cSrcweir 		ImplInitDisplay( NULL );
533*cdf0e10cSrcweir 		return;
534*cdf0e10cSrcweir 	}
535*cdf0e10cSrcweir 
536*cdf0e10cSrcweir 	// Daten initialisieren
537*cdf0e10cSrcweir 	ImplUpdatePageData();
538*cdf0e10cSrcweir 	mpFontList = new ImplDevFontList();
539*cdf0e10cSrcweir 	mpFontCache = new ImplFontCache( sal_True );
540*cdf0e10cSrcweir 	mpGraphics->GetDevFontList( mpFontList );
541*cdf0e10cSrcweir }
542*cdf0e10cSrcweir 
543*cdf0e10cSrcweir // -----------------------------------------------------------------------
544*cdf0e10cSrcweir 
545*cdf0e10cSrcweir void Printer::ImplInitDisplay( const Window* pWindow )
546*cdf0e10cSrcweir {
547*cdf0e10cSrcweir 	ImplSVData* pSVData = ImplGetSVData();
548*cdf0e10cSrcweir 
549*cdf0e10cSrcweir 	mpInfoPrinter		= NULL;
550*cdf0e10cSrcweir 	mpPrinter			= NULL;
551*cdf0e10cSrcweir 	mpJobGraphics		= NULL;
552*cdf0e10cSrcweir 
553*cdf0e10cSrcweir 	if ( pWindow )
554*cdf0e10cSrcweir 		mpDisplayDev = new VirtualDevice( *pWindow );
555*cdf0e10cSrcweir 	else
556*cdf0e10cSrcweir 		mpDisplayDev = new VirtualDevice();
557*cdf0e10cSrcweir 	mpFontList			= pSVData->maGDIData.mpScreenFontList;
558*cdf0e10cSrcweir 	mpFontCache 		= pSVData->maGDIData.mpScreenFontCache;
559*cdf0e10cSrcweir 	mnDPIX				= mpDisplayDev->mnDPIX;
560*cdf0e10cSrcweir 	mnDPIY				= mpDisplayDev->mnDPIY;
561*cdf0e10cSrcweir }
562*cdf0e10cSrcweir 
563*cdf0e10cSrcweir // -----------------------------------------------------------------------
564*cdf0e10cSrcweir 
565*cdf0e10cSrcweir SalPrinterQueueInfo* Printer::ImplGetQueueInfo( const XubString& rPrinterName,
566*cdf0e10cSrcweir 												const XubString* pDriver )
567*cdf0e10cSrcweir {
568*cdf0e10cSrcweir 	ImplSVData* pSVData = ImplGetSVData();
569*cdf0e10cSrcweir 	if ( !pSVData->maGDIData.mpPrinterQueueList )
570*cdf0e10cSrcweir 		ImplInitPrnQueueList();
571*cdf0e10cSrcweir 
572*cdf0e10cSrcweir 	ImplPrnQueueList* pPrnList = pSVData->maGDIData.mpPrinterQueueList;
573*cdf0e10cSrcweir 	if ( pPrnList && pPrnList->m_aQueueInfos.size() )
574*cdf0e10cSrcweir 	{
575*cdf0e10cSrcweir 		// first search for the printer name driectly
576*cdf0e10cSrcweir 		ImplPrnQueueData* pInfo = pPrnList->Get( rPrinterName );
577*cdf0e10cSrcweir 		if( pInfo )
578*cdf0e10cSrcweir 			return pInfo->mpSalQueueInfo;
579*cdf0e10cSrcweir 
580*cdf0e10cSrcweir 		// then search case insensitive
581*cdf0e10cSrcweir         for( unsigned int i = 0; i < pPrnList->m_aQueueInfos.size(); i++ )
582*cdf0e10cSrcweir         {
583*cdf0e10cSrcweir             if( pPrnList->m_aQueueInfos[i].mpSalQueueInfo->maPrinterName.EqualsIgnoreCaseAscii( rPrinterName ) )
584*cdf0e10cSrcweir                 return pPrnList->m_aQueueInfos[i].mpSalQueueInfo;
585*cdf0e10cSrcweir 		}
586*cdf0e10cSrcweir 
587*cdf0e10cSrcweir 		// then search for driver name
588*cdf0e10cSrcweir 		if ( pDriver )
589*cdf0e10cSrcweir 		{
590*cdf0e10cSrcweir             for( unsigned int i = 0; i < pPrnList->m_aQueueInfos.size(); i++ )
591*cdf0e10cSrcweir             {
592*cdf0e10cSrcweir                 if( pPrnList->m_aQueueInfos[i].mpSalQueueInfo->maDriver == *pDriver )
593*cdf0e10cSrcweir                     return pPrnList->m_aQueueInfos[i].mpSalQueueInfo;
594*cdf0e10cSrcweir             }
595*cdf0e10cSrcweir 		}
596*cdf0e10cSrcweir 
597*cdf0e10cSrcweir 		// then the default printer
598*cdf0e10cSrcweir 		pInfo = pPrnList->Get( GetDefaultPrinterName() );
599*cdf0e10cSrcweir         if( pInfo )
600*cdf0e10cSrcweir             return pInfo->mpSalQueueInfo;
601*cdf0e10cSrcweir 
602*cdf0e10cSrcweir         // last chance: the first available printer
603*cdf0e10cSrcweir         return pPrnList->m_aQueueInfos[0].mpSalQueueInfo;
604*cdf0e10cSrcweir 	}
605*cdf0e10cSrcweir 
606*cdf0e10cSrcweir 	return NULL;
607*cdf0e10cSrcweir }
608*cdf0e10cSrcweir 
609*cdf0e10cSrcweir // -----------------------------------------------------------------------
610*cdf0e10cSrcweir 
611*cdf0e10cSrcweir void Printer::ImplUpdatePageData()
612*cdf0e10cSrcweir {
613*cdf0e10cSrcweir 	// we need a graphics
614*cdf0e10cSrcweir 	if ( !ImplGetGraphics() )
615*cdf0e10cSrcweir 		return;
616*cdf0e10cSrcweir 
617*cdf0e10cSrcweir 	mpGraphics->GetResolution( mnDPIX, mnDPIY );
618*cdf0e10cSrcweir 	mpInfoPrinter->GetPageInfo( maJobSetup.ImplGetConstData(),
619*cdf0e10cSrcweir 								mnOutWidth, mnOutHeight,
620*cdf0e10cSrcweir 								maPageOffset.X(), maPageOffset.Y(),
621*cdf0e10cSrcweir 								maPaperSize.Width(), maPaperSize.Height() );
622*cdf0e10cSrcweir     static const char* pDebugOffset = getenv( "SAL_DBG_PAGEOFFSET" );
623*cdf0e10cSrcweir     if( pDebugOffset )
624*cdf0e10cSrcweir     {
625*cdf0e10cSrcweir         rtl::OString aLine( pDebugOffset );
626*cdf0e10cSrcweir         sal_Int32 nIndex = 0;
627*cdf0e10cSrcweir         rtl::OString aToken( aLine.getToken( 0, ',', nIndex ) );
628*cdf0e10cSrcweir         sal_Int32 nLeft = aToken.toInt32();
629*cdf0e10cSrcweir         sal_Int32 nTop = nLeft;
630*cdf0e10cSrcweir         if( nIndex > 0 )
631*cdf0e10cSrcweir         {
632*cdf0e10cSrcweir             aToken = aLine.getToken( 0, ',', nIndex );
633*cdf0e10cSrcweir             nTop = aToken.toInt32();
634*cdf0e10cSrcweir         }
635*cdf0e10cSrcweir         maPageOffset = LogicToPixel( Point( static_cast<long>(nLeft),
636*cdf0e10cSrcweir                                             static_cast<long>(nTop) ),
637*cdf0e10cSrcweir                                      MapMode( MAP_100TH_MM )
638*cdf0e10cSrcweir                                      );
639*cdf0e10cSrcweir         mnOutWidth = maPaperSize.Width() - 2*maPageOffset.X();
640*cdf0e10cSrcweir         mnOutWidth = maPaperSize.Width() - 2*maPageOffset.Y();
641*cdf0e10cSrcweir     }
642*cdf0e10cSrcweir }
643*cdf0e10cSrcweir 
644*cdf0e10cSrcweir // -----------------------------------------------------------------------
645*cdf0e10cSrcweir 
646*cdf0e10cSrcweir void Printer::ImplUpdateFontList()
647*cdf0e10cSrcweir {
648*cdf0e10cSrcweir 	ImplUpdateFontData( sal_True );
649*cdf0e10cSrcweir }
650*cdf0e10cSrcweir 
651*cdf0e10cSrcweir // -----------------------------------------------------------------------
652*cdf0e10cSrcweir 
653*cdf0e10cSrcweir Printer::Printer()
654*cdf0e10cSrcweir {
655*cdf0e10cSrcweir 	ImplInitData();
656*cdf0e10cSrcweir 	SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( GetDefaultPrinterName(), NULL );
657*cdf0e10cSrcweir 	if ( pInfo )
658*cdf0e10cSrcweir 	{
659*cdf0e10cSrcweir 		ImplInit( pInfo );
660*cdf0e10cSrcweir 		if ( !IsDisplayPrinter() )
661*cdf0e10cSrcweir 			mbDefPrinter = sal_True;
662*cdf0e10cSrcweir 	}
663*cdf0e10cSrcweir 	else
664*cdf0e10cSrcweir 		ImplInitDisplay( NULL );
665*cdf0e10cSrcweir }
666*cdf0e10cSrcweir 
667*cdf0e10cSrcweir // -----------------------------------------------------------------------
668*cdf0e10cSrcweir 
669*cdf0e10cSrcweir Printer::Printer( const Window* pWindow )
670*cdf0e10cSrcweir {
671*cdf0e10cSrcweir 	ImplInitData();
672*cdf0e10cSrcweir 	ImplInitDisplay( pWindow );
673*cdf0e10cSrcweir }
674*cdf0e10cSrcweir 
675*cdf0e10cSrcweir // -----------------------------------------------------------------------
676*cdf0e10cSrcweir 
677*cdf0e10cSrcweir Printer::Printer( const JobSetup& rJobSetup ) :
678*cdf0e10cSrcweir 	maJobSetup( rJobSetup )
679*cdf0e10cSrcweir {
680*cdf0e10cSrcweir 	ImplInitData();
681*cdf0e10cSrcweir 	SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( rJobSetup.mpData->maPrinterName,
682*cdf0e10cSrcweir 												   &rJobSetup.mpData->maDriver );
683*cdf0e10cSrcweir 	if ( pInfo )
684*cdf0e10cSrcweir 	{
685*cdf0e10cSrcweir 		ImplInit( pInfo );
686*cdf0e10cSrcweir 		SetJobSetup( rJobSetup );
687*cdf0e10cSrcweir 	}
688*cdf0e10cSrcweir 	else
689*cdf0e10cSrcweir 	{
690*cdf0e10cSrcweir 		ImplInitDisplay( NULL );
691*cdf0e10cSrcweir 		maJobSetup = JobSetup();
692*cdf0e10cSrcweir 	}
693*cdf0e10cSrcweir }
694*cdf0e10cSrcweir 
695*cdf0e10cSrcweir // -----------------------------------------------------------------------
696*cdf0e10cSrcweir 
697*cdf0e10cSrcweir Printer::Printer( const QueueInfo& rQueueInfo )
698*cdf0e10cSrcweir {
699*cdf0e10cSrcweir 	ImplInitData();
700*cdf0e10cSrcweir 	SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( rQueueInfo.GetPrinterName(),
701*cdf0e10cSrcweir 												   &rQueueInfo.GetDriver() );
702*cdf0e10cSrcweir 	if ( pInfo )
703*cdf0e10cSrcweir 		ImplInit( pInfo );
704*cdf0e10cSrcweir 	else
705*cdf0e10cSrcweir 		ImplInitDisplay( NULL );
706*cdf0e10cSrcweir }
707*cdf0e10cSrcweir 
708*cdf0e10cSrcweir // -----------------------------------------------------------------------
709*cdf0e10cSrcweir 
710*cdf0e10cSrcweir Printer::Printer( const XubString& rPrinterName )
711*cdf0e10cSrcweir {
712*cdf0e10cSrcweir 	ImplInitData();
713*cdf0e10cSrcweir 	SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( rPrinterName, NULL );
714*cdf0e10cSrcweir 	if ( pInfo )
715*cdf0e10cSrcweir 		ImplInit( pInfo );
716*cdf0e10cSrcweir 	else
717*cdf0e10cSrcweir 		ImplInitDisplay( NULL );
718*cdf0e10cSrcweir }
719*cdf0e10cSrcweir 
720*cdf0e10cSrcweir // -----------------------------------------------------------------------
721*cdf0e10cSrcweir 
722*cdf0e10cSrcweir Printer::~Printer()
723*cdf0e10cSrcweir {
724*cdf0e10cSrcweir 	DBG_ASSERT( !IsPrinting(), "Printer::~Printer() - Job is printing" );
725*cdf0e10cSrcweir 	DBG_ASSERT( !IsJobActive(), "Printer::~Printer() - Job is active" );
726*cdf0e10cSrcweir 
727*cdf0e10cSrcweir     delete mpPrinterOptions;
728*cdf0e10cSrcweir 
729*cdf0e10cSrcweir 	ImplReleaseGraphics();
730*cdf0e10cSrcweir 	if ( mpInfoPrinter )
731*cdf0e10cSrcweir 		ImplGetSVData()->mpDefInst->DestroyInfoPrinter( mpInfoPrinter );
732*cdf0e10cSrcweir 	if ( mpDisplayDev )
733*cdf0e10cSrcweir 		delete mpDisplayDev;
734*cdf0e10cSrcweir 	else
735*cdf0e10cSrcweir 	{
736*cdf0e10cSrcweir 		// OutputDevice-Dtor versucht das gleiche, deshalb muss hier
737*cdf0e10cSrcweir 		// der FontEntry auch auf NULL gesetzt werden
738*cdf0e10cSrcweir         // TODO: consolidate duplicate cleanup by Printer and OutputDevice
739*cdf0e10cSrcweir 		if ( mpFontEntry )
740*cdf0e10cSrcweir 		{
741*cdf0e10cSrcweir 			mpFontCache->Release( mpFontEntry );
742*cdf0e10cSrcweir 			mpFontEntry = NULL;
743*cdf0e10cSrcweir 		}
744*cdf0e10cSrcweir 		if ( mpGetDevFontList )
745*cdf0e10cSrcweir 		{
746*cdf0e10cSrcweir 			delete mpGetDevFontList;
747*cdf0e10cSrcweir 			mpGetDevFontList = NULL;
748*cdf0e10cSrcweir 		}
749*cdf0e10cSrcweir 		if ( mpGetDevSizeList )
750*cdf0e10cSrcweir 		{
751*cdf0e10cSrcweir 			delete mpGetDevSizeList;
752*cdf0e10cSrcweir 			mpGetDevSizeList = NULL;
753*cdf0e10cSrcweir 		}
754*cdf0e10cSrcweir 		delete mpFontCache;
755*cdf0e10cSrcweir         mpFontCache = NULL;
756*cdf0e10cSrcweir         // font list deleted by OutputDevice dtor
757*cdf0e10cSrcweir 	}
758*cdf0e10cSrcweir 
759*cdf0e10cSrcweir 	// Printer aus der Liste eintragen
760*cdf0e10cSrcweir 	ImplSVData* pSVData = ImplGetSVData();
761*cdf0e10cSrcweir 	if ( mpPrev )
762*cdf0e10cSrcweir 		mpPrev->mpNext = mpNext;
763*cdf0e10cSrcweir 	else
764*cdf0e10cSrcweir 		pSVData->maGDIData.mpFirstPrinter = mpNext;
765*cdf0e10cSrcweir 	if ( mpNext )
766*cdf0e10cSrcweir 		mpNext->mpPrev = mpPrev;
767*cdf0e10cSrcweir 	else
768*cdf0e10cSrcweir 		pSVData->maGDIData.mpLastPrinter = mpPrev;
769*cdf0e10cSrcweir }
770*cdf0e10cSrcweir 
771*cdf0e10cSrcweir // -----------------------------------------------------------------------
772*cdf0e10cSrcweir void Printer::Compat_OldPrinterMetrics( bool bSet )
773*cdf0e10cSrcweir {
774*cdf0e10cSrcweir     // propagate flag
775*cdf0e10cSrcweir     if( mpInfoPrinter )
776*cdf0e10cSrcweir         mpInfoPrinter->m_bCompatMetrics = bSet;
777*cdf0e10cSrcweir 
778*cdf0e10cSrcweir     // get new font data
779*cdf0e10cSrcweir     ImplUpdateFontData( sal_True );
780*cdf0e10cSrcweir }
781*cdf0e10cSrcweir 
782*cdf0e10cSrcweir // -----------------------------------------------------------------------
783*cdf0e10cSrcweir 
784*cdf0e10cSrcweir sal_uLong Printer::GetCapabilities( sal_uInt16 nType ) const
785*cdf0e10cSrcweir {
786*cdf0e10cSrcweir 	if ( IsDisplayPrinter() )
787*cdf0e10cSrcweir 		return sal_False;
788*cdf0e10cSrcweir 
789*cdf0e10cSrcweir     if( mpInfoPrinter )
790*cdf0e10cSrcweir 	    return mpInfoPrinter->GetCapabilities( maJobSetup.ImplGetConstData(), nType );
791*cdf0e10cSrcweir     else
792*cdf0e10cSrcweir         return sal_False;
793*cdf0e10cSrcweir }
794*cdf0e10cSrcweir 
795*cdf0e10cSrcweir // -----------------------------------------------------------------------
796*cdf0e10cSrcweir 
797*cdf0e10cSrcweir sal_Bool Printer::HasSupport( PrinterSupport eFeature ) const
798*cdf0e10cSrcweir {
799*cdf0e10cSrcweir 	switch ( eFeature )
800*cdf0e10cSrcweir 	{
801*cdf0e10cSrcweir 		case SUPPORT_SET_ORIENTATION:
802*cdf0e10cSrcweir 			return (sal_Bool)GetCapabilities( PRINTER_CAPABILITIES_SETORIENTATION );
803*cdf0e10cSrcweir 		case SUPPORT_SET_PAPERBIN:
804*cdf0e10cSrcweir 			return (sal_Bool)GetCapabilities( PRINTER_CAPABILITIES_SETPAPERBIN );
805*cdf0e10cSrcweir 		case SUPPORT_SET_PAPERSIZE:
806*cdf0e10cSrcweir 			return (sal_Bool)GetCapabilities( PRINTER_CAPABILITIES_SETPAPERSIZE );
807*cdf0e10cSrcweir 		case SUPPORT_SET_PAPER:
808*cdf0e10cSrcweir 			return (sal_Bool)GetCapabilities( PRINTER_CAPABILITIES_SETPAPER );
809*cdf0e10cSrcweir 		case SUPPORT_COPY:
810*cdf0e10cSrcweir 			return (GetCapabilities( PRINTER_CAPABILITIES_COPIES ) != 0);
811*cdf0e10cSrcweir 		case SUPPORT_COLLATECOPY:
812*cdf0e10cSrcweir 			return (GetCapabilities( PRINTER_CAPABILITIES_COLLATECOPIES ) != 0);
813*cdf0e10cSrcweir 		case SUPPORT_SETUPDIALOG:
814*cdf0e10cSrcweir 			return (sal_Bool)GetCapabilities( PRINTER_CAPABILITIES_SUPPORTDIALOG );
815*cdf0e10cSrcweir 		case SUPPORT_FAX:
816*cdf0e10cSrcweir 			return (sal_Bool) GetCapabilities( PRINTER_CAPABILITIES_FAX );
817*cdf0e10cSrcweir 		case SUPPORT_PDF:
818*cdf0e10cSrcweir 			return (sal_Bool) GetCapabilities( PRINTER_CAPABILITIES_PDF );
819*cdf0e10cSrcweir 	}
820*cdf0e10cSrcweir 
821*cdf0e10cSrcweir 	return sal_True;
822*cdf0e10cSrcweir }
823*cdf0e10cSrcweir 
824*cdf0e10cSrcweir // -----------------------------------------------------------------------
825*cdf0e10cSrcweir 
826*cdf0e10cSrcweir sal_Bool Printer::SetJobSetup( const JobSetup& rSetup )
827*cdf0e10cSrcweir {
828*cdf0e10cSrcweir 	if ( IsDisplayPrinter() || mbInPrintPage )
829*cdf0e10cSrcweir 		return sal_False;
830*cdf0e10cSrcweir 
831*cdf0e10cSrcweir 	JobSetup aJobSetup = rSetup;
832*cdf0e10cSrcweir 
833*cdf0e10cSrcweir 	ImplReleaseGraphics();
834*cdf0e10cSrcweir 	if ( mpInfoPrinter->SetPrinterData( aJobSetup.ImplGetData() ) )
835*cdf0e10cSrcweir 	{
836*cdf0e10cSrcweir 		ImplUpdateJobSetupPaper( aJobSetup );
837*cdf0e10cSrcweir 		mbNewJobSetup = sal_True;
838*cdf0e10cSrcweir 		maJobSetup = aJobSetup;
839*cdf0e10cSrcweir 		ImplUpdatePageData();
840*cdf0e10cSrcweir 		ImplUpdateFontList();
841*cdf0e10cSrcweir 		return sal_True;
842*cdf0e10cSrcweir 	}
843*cdf0e10cSrcweir 
844*cdf0e10cSrcweir 	return sal_False;
845*cdf0e10cSrcweir }
846*cdf0e10cSrcweir 
847*cdf0e10cSrcweir // -----------------------------------------------------------------------
848*cdf0e10cSrcweir 
849*cdf0e10cSrcweir 
850*cdf0e10cSrcweir sal_Bool Printer::Setup( Window* pWindow )
851*cdf0e10cSrcweir {
852*cdf0e10cSrcweir 	if ( IsDisplayPrinter() )
853*cdf0e10cSrcweir 		return sal_False;
854*cdf0e10cSrcweir 
855*cdf0e10cSrcweir 	if ( IsJobActive() || IsPrinting() )
856*cdf0e10cSrcweir 		return sal_False;
857*cdf0e10cSrcweir 
858*cdf0e10cSrcweir 	JobSetup aJobSetup = maJobSetup;
859*cdf0e10cSrcweir 	SalFrame* pFrame;
860*cdf0e10cSrcweir 	if ( !pWindow )
861*cdf0e10cSrcweir         pWindow = ImplGetDefaultWindow();
862*cdf0e10cSrcweir     if( !pWindow )
863*cdf0e10cSrcweir         return sal_False;
864*cdf0e10cSrcweir 
865*cdf0e10cSrcweir     pFrame = pWindow->ImplGetFrame();
866*cdf0e10cSrcweir 	ImplReleaseGraphics();
867*cdf0e10cSrcweir 	ImplSVData* pSVData = ImplGetSVData();
868*cdf0e10cSrcweir 	pSVData->maAppData.mnModalMode++;
869*cdf0e10cSrcweir 	nImplSysDialog++;
870*cdf0e10cSrcweir 	sal_Bool bSetup = mpInfoPrinter->Setup( pFrame, aJobSetup.ImplGetData() );
871*cdf0e10cSrcweir 	pSVData->maAppData.mnModalMode--;
872*cdf0e10cSrcweir 	nImplSysDialog--;
873*cdf0e10cSrcweir 	if ( bSetup )
874*cdf0e10cSrcweir 	{
875*cdf0e10cSrcweir 		ImplUpdateJobSetupPaper( aJobSetup );
876*cdf0e10cSrcweir 		mbNewJobSetup = sal_True;
877*cdf0e10cSrcweir 		maJobSetup = aJobSetup;
878*cdf0e10cSrcweir 		ImplUpdatePageData();
879*cdf0e10cSrcweir 		ImplUpdateFontList();
880*cdf0e10cSrcweir 		return sal_True;
881*cdf0e10cSrcweir 	}
882*cdf0e10cSrcweir 	return sal_False;
883*cdf0e10cSrcweir }
884*cdf0e10cSrcweir 
885*cdf0e10cSrcweir // -----------------------------------------------------------------------
886*cdf0e10cSrcweir 
887*cdf0e10cSrcweir sal_Bool Printer::SetPrinterProps( const Printer* pPrinter )
888*cdf0e10cSrcweir {
889*cdf0e10cSrcweir 	if ( IsJobActive() || IsPrinting() )
890*cdf0e10cSrcweir 		return sal_False;
891*cdf0e10cSrcweir 
892*cdf0e10cSrcweir 	ImplSVData* pSVData = ImplGetSVData();
893*cdf0e10cSrcweir 
894*cdf0e10cSrcweir 	mbDefPrinter	    = pPrinter->mbDefPrinter;
895*cdf0e10cSrcweir 	maPrintFile 	    = pPrinter->maPrintFile;
896*cdf0e10cSrcweir 	mbPrintFile 	    = pPrinter->mbPrintFile;
897*cdf0e10cSrcweir 	mnCopyCount 	    = pPrinter->mnCopyCount;
898*cdf0e10cSrcweir 	mbCollateCopy	    = pPrinter->mbCollateCopy;
899*cdf0e10cSrcweir 	mnPageQueueSize     = pPrinter->mnPageQueueSize;
900*cdf0e10cSrcweir     *mpPrinterOptions   = *pPrinter->mpPrinterOptions;
901*cdf0e10cSrcweir 
902*cdf0e10cSrcweir 	if ( pPrinter->IsDisplayPrinter() )
903*cdf0e10cSrcweir 	{
904*cdf0e10cSrcweir 		// Alten Printer zerstoeren
905*cdf0e10cSrcweir 		if ( !IsDisplayPrinter() )
906*cdf0e10cSrcweir 		{
907*cdf0e10cSrcweir 			ImplReleaseGraphics();
908*cdf0e10cSrcweir 			pSVData->mpDefInst->DestroyInfoPrinter( mpInfoPrinter );
909*cdf0e10cSrcweir 			if ( mpFontEntry )
910*cdf0e10cSrcweir 			{
911*cdf0e10cSrcweir 				mpFontCache->Release( mpFontEntry );
912*cdf0e10cSrcweir 				mpFontEntry = NULL;
913*cdf0e10cSrcweir 			}
914*cdf0e10cSrcweir 			if ( mpGetDevFontList )
915*cdf0e10cSrcweir 			{
916*cdf0e10cSrcweir 				delete mpGetDevFontList;
917*cdf0e10cSrcweir 				mpGetDevFontList = NULL;
918*cdf0e10cSrcweir 			}
919*cdf0e10cSrcweir 			if ( mpGetDevSizeList )
920*cdf0e10cSrcweir 			{
921*cdf0e10cSrcweir 				delete mpGetDevSizeList;
922*cdf0e10cSrcweir 				mpGetDevSizeList = NULL;
923*cdf0e10cSrcweir 			}
924*cdf0e10cSrcweir             // clean up font list
925*cdf0e10cSrcweir 			delete mpFontCache;
926*cdf0e10cSrcweir 			delete mpFontList;
927*cdf0e10cSrcweir 			mpFontCache = NULL;
928*cdf0e10cSrcweir 			mpFontList = NULL;
929*cdf0e10cSrcweir 
930*cdf0e10cSrcweir 			mbInitFont = sal_True;
931*cdf0e10cSrcweir 			mbNewFont = sal_True;
932*cdf0e10cSrcweir 			mpInfoPrinter = NULL;
933*cdf0e10cSrcweir 		}
934*cdf0e10cSrcweir 
935*cdf0e10cSrcweir 		// Neuen Printer bauen
936*cdf0e10cSrcweir 		ImplInitDisplay( NULL );
937*cdf0e10cSrcweir 		return sal_True;
938*cdf0e10cSrcweir 	}
939*cdf0e10cSrcweir 
940*cdf0e10cSrcweir 	// Alten Printer zerstoeren?
941*cdf0e10cSrcweir 	if ( GetName() != pPrinter->GetName() )
942*cdf0e10cSrcweir 	{
943*cdf0e10cSrcweir 		ImplReleaseGraphics();
944*cdf0e10cSrcweir 		if ( mpDisplayDev )
945*cdf0e10cSrcweir 		{
946*cdf0e10cSrcweir 			delete mpDisplayDev;
947*cdf0e10cSrcweir 			mpDisplayDev = NULL;
948*cdf0e10cSrcweir 		}
949*cdf0e10cSrcweir 		else
950*cdf0e10cSrcweir 		{
951*cdf0e10cSrcweir 			pSVData->mpDefInst->DestroyInfoPrinter( mpInfoPrinter );
952*cdf0e10cSrcweir 
953*cdf0e10cSrcweir 			if ( mpFontEntry )
954*cdf0e10cSrcweir 			{
955*cdf0e10cSrcweir 				mpFontCache->Release( mpFontEntry );
956*cdf0e10cSrcweir 				mpFontEntry = NULL;
957*cdf0e10cSrcweir 			}
958*cdf0e10cSrcweir 			if ( mpGetDevFontList )
959*cdf0e10cSrcweir 			{
960*cdf0e10cSrcweir 				delete mpGetDevFontList;
961*cdf0e10cSrcweir 				mpGetDevFontList = NULL;
962*cdf0e10cSrcweir 			}
963*cdf0e10cSrcweir 			if ( mpGetDevSizeList )
964*cdf0e10cSrcweir 			{
965*cdf0e10cSrcweir 				delete mpGetDevSizeList;
966*cdf0e10cSrcweir 				mpGetDevSizeList = NULL;
967*cdf0e10cSrcweir 			}
968*cdf0e10cSrcweir 			delete mpFontCache;
969*cdf0e10cSrcweir 			delete mpFontList;
970*cdf0e10cSrcweir 			mpFontCache = NULL;
971*cdf0e10cSrcweir 			mpFontList = NULL;
972*cdf0e10cSrcweir 			mbInitFont = sal_True;
973*cdf0e10cSrcweir 			mbNewFont = sal_True;
974*cdf0e10cSrcweir 			mpInfoPrinter = NULL;
975*cdf0e10cSrcweir 		}
976*cdf0e10cSrcweir 
977*cdf0e10cSrcweir 		// Neuen Printer bauen
978*cdf0e10cSrcweir 		XubString aDriver = pPrinter->GetDriverName();
979*cdf0e10cSrcweir 		SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( pPrinter->GetName(), &aDriver );
980*cdf0e10cSrcweir 		if ( pInfo )
981*cdf0e10cSrcweir 		{
982*cdf0e10cSrcweir 			ImplInit( pInfo );
983*cdf0e10cSrcweir 			SetJobSetup( pPrinter->GetJobSetup() );
984*cdf0e10cSrcweir 		}
985*cdf0e10cSrcweir 		else
986*cdf0e10cSrcweir 			ImplInitDisplay( NULL );
987*cdf0e10cSrcweir 	}
988*cdf0e10cSrcweir 	else
989*cdf0e10cSrcweir 		SetJobSetup( pPrinter->GetJobSetup() );
990*cdf0e10cSrcweir 
991*cdf0e10cSrcweir 	return sal_False;
992*cdf0e10cSrcweir }
993*cdf0e10cSrcweir 
994*cdf0e10cSrcweir // -----------------------------------------------------------------------
995*cdf0e10cSrcweir 
996*cdf0e10cSrcweir sal_Bool Printer::SetOrientation( Orientation eOrientation )
997*cdf0e10cSrcweir {
998*cdf0e10cSrcweir 	if ( mbInPrintPage )
999*cdf0e10cSrcweir 		return sal_False;
1000*cdf0e10cSrcweir 
1001*cdf0e10cSrcweir 	if ( maJobSetup.ImplGetConstData()->meOrientation != eOrientation )
1002*cdf0e10cSrcweir 	{
1003*cdf0e10cSrcweir 		JobSetup		aJobSetup = maJobSetup;
1004*cdf0e10cSrcweir 		ImplJobSetup*	pSetupData = aJobSetup.ImplGetData();
1005*cdf0e10cSrcweir 		pSetupData->meOrientation = eOrientation;
1006*cdf0e10cSrcweir 
1007*cdf0e10cSrcweir 		if ( IsDisplayPrinter() )
1008*cdf0e10cSrcweir 		{
1009*cdf0e10cSrcweir 			mbNewJobSetup = sal_True;
1010*cdf0e10cSrcweir 			maJobSetup = aJobSetup;
1011*cdf0e10cSrcweir 			return sal_True;
1012*cdf0e10cSrcweir 		}
1013*cdf0e10cSrcweir 
1014*cdf0e10cSrcweir 		ImplReleaseGraphics();
1015*cdf0e10cSrcweir 		if ( mpInfoPrinter->SetData( SAL_JOBSET_ORIENTATION, pSetupData ) )
1016*cdf0e10cSrcweir 		{
1017*cdf0e10cSrcweir 			ImplUpdateJobSetupPaper( aJobSetup );
1018*cdf0e10cSrcweir 			mbNewJobSetup = sal_True;
1019*cdf0e10cSrcweir 			maJobSetup = aJobSetup;
1020*cdf0e10cSrcweir 			ImplUpdatePageData();
1021*cdf0e10cSrcweir 			ImplUpdateFontList();
1022*cdf0e10cSrcweir 			return sal_True;
1023*cdf0e10cSrcweir 		}
1024*cdf0e10cSrcweir 		else
1025*cdf0e10cSrcweir 			return sal_False;
1026*cdf0e10cSrcweir 	}
1027*cdf0e10cSrcweir 
1028*cdf0e10cSrcweir 	return sal_True;
1029*cdf0e10cSrcweir }
1030*cdf0e10cSrcweir 
1031*cdf0e10cSrcweir // -----------------------------------------------------------------------
1032*cdf0e10cSrcweir 
1033*cdf0e10cSrcweir Orientation Printer::GetOrientation() const
1034*cdf0e10cSrcweir {
1035*cdf0e10cSrcweir 	return maJobSetup.ImplGetConstData()->meOrientation;
1036*cdf0e10cSrcweir }
1037*cdf0e10cSrcweir 
1038*cdf0e10cSrcweir // -----------------------------------------------------------------------
1039*cdf0e10cSrcweir 
1040*cdf0e10cSrcweir sal_Bool Printer::SetPaperBin( sal_uInt16 nPaperBin )
1041*cdf0e10cSrcweir {
1042*cdf0e10cSrcweir 	if ( mbInPrintPage )
1043*cdf0e10cSrcweir 		return sal_False;
1044*cdf0e10cSrcweir 
1045*cdf0e10cSrcweir 	if ( (maJobSetup.ImplGetConstData()->mnPaperBin != nPaperBin) &&
1046*cdf0e10cSrcweir 		 (nPaperBin < GetPaperBinCount()) )
1047*cdf0e10cSrcweir 	{
1048*cdf0e10cSrcweir 		JobSetup		aJobSetup = maJobSetup;
1049*cdf0e10cSrcweir 		ImplJobSetup*	pSetupData = aJobSetup.ImplGetData();
1050*cdf0e10cSrcweir 		pSetupData->mnPaperBin = nPaperBin;
1051*cdf0e10cSrcweir 
1052*cdf0e10cSrcweir 		if ( IsDisplayPrinter() )
1053*cdf0e10cSrcweir 		{
1054*cdf0e10cSrcweir 			mbNewJobSetup = sal_True;
1055*cdf0e10cSrcweir 			maJobSetup = aJobSetup;
1056*cdf0e10cSrcweir 			return sal_True;
1057*cdf0e10cSrcweir 		}
1058*cdf0e10cSrcweir 
1059*cdf0e10cSrcweir 		ImplReleaseGraphics();
1060*cdf0e10cSrcweir 		if ( mpInfoPrinter->SetData( SAL_JOBSET_PAPERBIN, pSetupData ) )
1061*cdf0e10cSrcweir 		{
1062*cdf0e10cSrcweir 			ImplUpdateJobSetupPaper( aJobSetup );
1063*cdf0e10cSrcweir 			mbNewJobSetup = sal_True;
1064*cdf0e10cSrcweir 			maJobSetup = aJobSetup;
1065*cdf0e10cSrcweir 			ImplUpdatePageData();
1066*cdf0e10cSrcweir 			ImplUpdateFontList();
1067*cdf0e10cSrcweir 			return sal_True;
1068*cdf0e10cSrcweir 		}
1069*cdf0e10cSrcweir 		else
1070*cdf0e10cSrcweir 			return sal_False;
1071*cdf0e10cSrcweir 	}
1072*cdf0e10cSrcweir 
1073*cdf0e10cSrcweir 	return sal_True;
1074*cdf0e10cSrcweir }
1075*cdf0e10cSrcweir 
1076*cdf0e10cSrcweir // -----------------------------------------------------------------------
1077*cdf0e10cSrcweir 
1078*cdf0e10cSrcweir sal_uInt16 Printer::GetPaperBin() const
1079*cdf0e10cSrcweir {
1080*cdf0e10cSrcweir 	return maJobSetup.ImplGetConstData()->mnPaperBin;
1081*cdf0e10cSrcweir }
1082*cdf0e10cSrcweir 
1083*cdf0e10cSrcweir // -----------------------------------------------------------------------
1084*cdf0e10cSrcweir 
1085*cdf0e10cSrcweir // Map user paper format to a available printer paper formats
1086*cdf0e10cSrcweir void Printer::ImplFindPaperFormatForUserSize( JobSetup& aJobSetup, bool bMatchNearest )
1087*cdf0e10cSrcweir {
1088*cdf0e10cSrcweir 	ImplJobSetup*	pSetupData = aJobSetup.ImplGetData();
1089*cdf0e10cSrcweir 
1090*cdf0e10cSrcweir 	int		nLandscapeAngle	= GetLandscapeAngle();
1091*cdf0e10cSrcweir 	int		nPaperCount		= GetPaperInfoCount();
1092*cdf0e10cSrcweir     bool    bFound = false;
1093*cdf0e10cSrcweir 
1094*cdf0e10cSrcweir     PaperInfo aInfo(pSetupData->mnPaperWidth, pSetupData->mnPaperHeight);
1095*cdf0e10cSrcweir 
1096*cdf0e10cSrcweir 	// Alle Papierformate vergleichen und ein passendes raussuchen
1097*cdf0e10cSrcweir 	for ( int i = 0; i < nPaperCount; i++ )
1098*cdf0e10cSrcweir 	{
1099*cdf0e10cSrcweir 		const PaperInfo& rPaperInfo = GetPaperInfo( i );
1100*cdf0e10cSrcweir 
1101*cdf0e10cSrcweir 		if ( aInfo.sloppyEqual(rPaperInfo) )
1102*cdf0e10cSrcweir 		{
1103*cdf0e10cSrcweir 			pSetupData->mePaperFormat = ImplGetPaperFormat( rPaperInfo.getWidth(),
1104*cdf0e10cSrcweir 															rPaperInfo.getHeight() );
1105*cdf0e10cSrcweir             pSetupData->meOrientation = ORIENTATION_PORTRAIT;
1106*cdf0e10cSrcweir             bFound = true;
1107*cdf0e10cSrcweir 			break;
1108*cdf0e10cSrcweir 		}
1109*cdf0e10cSrcweir 	}
1110*cdf0e10cSrcweir 
1111*cdf0e10cSrcweir 	// If the printer supports landscape orientation, check paper sizes again
1112*cdf0e10cSrcweir 	// with landscape orientation. This is necessary as a printer driver provides
1113*cdf0e10cSrcweir 	// all paper sizes with portrait orientation only!!
1114*cdf0e10cSrcweir 	if ( pSetupData->mePaperFormat == PAPER_USER &&
1115*cdf0e10cSrcweir 		 nLandscapeAngle != 0 &&
1116*cdf0e10cSrcweir 		 HasSupport( SUPPORT_SET_ORIENTATION ))
1117*cdf0e10cSrcweir 	{
1118*cdf0e10cSrcweir 
1119*cdf0e10cSrcweir         PaperInfo aRotatedInfo(pSetupData->mnPaperHeight, pSetupData->mnPaperWidth);
1120*cdf0e10cSrcweir 
1121*cdf0e10cSrcweir 		for ( int i = 0; i < nPaperCount; i++ )
1122*cdf0e10cSrcweir 		{
1123*cdf0e10cSrcweir 			const PaperInfo& rPaperInfo = GetPaperInfo( i );
1124*cdf0e10cSrcweir 
1125*cdf0e10cSrcweir 			if ( aRotatedInfo.sloppyEqual( rPaperInfo ) )
1126*cdf0e10cSrcweir 			{
1127*cdf0e10cSrcweir 				pSetupData->mePaperFormat = ImplGetPaperFormat( rPaperInfo.getWidth(),
1128*cdf0e10cSrcweir 																rPaperInfo.getHeight() );
1129*cdf0e10cSrcweir                 pSetupData->meOrientation = ORIENTATION_LANDSCAPE;
1130*cdf0e10cSrcweir                 bFound = true;
1131*cdf0e10cSrcweir 				break;
1132*cdf0e10cSrcweir 			}
1133*cdf0e10cSrcweir 		}
1134*cdf0e10cSrcweir 	}
1135*cdf0e10cSrcweir 
1136*cdf0e10cSrcweir     if( ! bFound && bMatchNearest )
1137*cdf0e10cSrcweir     {
1138*cdf0e10cSrcweir          sal_Int64 nBestMatch = SAL_MAX_INT64;
1139*cdf0e10cSrcweir          int nBestIndex = 0;
1140*cdf0e10cSrcweir          Orientation eBestOrientation = ORIENTATION_PORTRAIT;
1141*cdf0e10cSrcweir          for( int i = 0; i < nPaperCount; i++ )
1142*cdf0e10cSrcweir          {
1143*cdf0e10cSrcweir              const PaperInfo& rPaperInfo = GetPaperInfo( i );
1144*cdf0e10cSrcweir 
1145*cdf0e10cSrcweir              // check protrait match
1146*cdf0e10cSrcweir              sal_Int64 nDX = pSetupData->mnPaperWidth - rPaperInfo.getWidth();
1147*cdf0e10cSrcweir              sal_Int64 nDY = pSetupData->mnPaperHeight - rPaperInfo.getHeight();
1148*cdf0e10cSrcweir              sal_Int64 nMatch = nDX*nDX + nDY*nDY;
1149*cdf0e10cSrcweir              if( nMatch < nBestMatch )
1150*cdf0e10cSrcweir              {
1151*cdf0e10cSrcweir                  nBestMatch = nMatch;
1152*cdf0e10cSrcweir                  nBestIndex = i;
1153*cdf0e10cSrcweir                  eBestOrientation = ORIENTATION_PORTRAIT;
1154*cdf0e10cSrcweir              }
1155*cdf0e10cSrcweir 
1156*cdf0e10cSrcweir              // check landscape match
1157*cdf0e10cSrcweir              nDX = pSetupData->mnPaperWidth - rPaperInfo.getHeight();
1158*cdf0e10cSrcweir              nDY = pSetupData->mnPaperHeight - rPaperInfo.getWidth();
1159*cdf0e10cSrcweir              nMatch = nDX*nDX + nDY*nDY;
1160*cdf0e10cSrcweir              if( nMatch < nBestMatch )
1161*cdf0e10cSrcweir              {
1162*cdf0e10cSrcweir                  nBestMatch = nMatch;
1163*cdf0e10cSrcweir                  nBestIndex = i;
1164*cdf0e10cSrcweir                  eBestOrientation = ORIENTATION_LANDSCAPE;
1165*cdf0e10cSrcweir              }
1166*cdf0e10cSrcweir          }
1167*cdf0e10cSrcweir          const PaperInfo& rBestInfo = GetPaperInfo( nBestIndex );
1168*cdf0e10cSrcweir          pSetupData->mePaperFormat = ImplGetPaperFormat( rBestInfo.getWidth(),
1169*cdf0e10cSrcweir                                                          rBestInfo.getHeight() );
1170*cdf0e10cSrcweir          pSetupData->meOrientation = eBestOrientation;
1171*cdf0e10cSrcweir     }
1172*cdf0e10cSrcweir }
1173*cdf0e10cSrcweir 
1174*cdf0e10cSrcweir // -----------------------------------------------------------------------
1175*cdf0e10cSrcweir 
1176*cdf0e10cSrcweir sal_Bool Printer::SetPaper( Paper ePaper )
1177*cdf0e10cSrcweir {
1178*cdf0e10cSrcweir 	if ( mbInPrintPage )
1179*cdf0e10cSrcweir 		return sal_False;
1180*cdf0e10cSrcweir 
1181*cdf0e10cSrcweir 	if ( maJobSetup.ImplGetConstData()->mePaperFormat != ePaper )
1182*cdf0e10cSrcweir 	{
1183*cdf0e10cSrcweir 		JobSetup		aJobSetup = maJobSetup;
1184*cdf0e10cSrcweir 		ImplJobSetup*	pSetupData = aJobSetup.ImplGetData();
1185*cdf0e10cSrcweir 		pSetupData->mePaperFormat = ePaper;
1186*cdf0e10cSrcweir 		if ( ePaper != PAPER_USER )
1187*cdf0e10cSrcweir 		{
1188*cdf0e10cSrcweir             PaperInfo aInfo(ePaper);
1189*cdf0e10cSrcweir 			pSetupData->mnPaperWidth  = aInfo.getWidth();
1190*cdf0e10cSrcweir 			pSetupData->mnPaperHeight = aInfo.getHeight();
1191*cdf0e10cSrcweir 		}
1192*cdf0e10cSrcweir 
1193*cdf0e10cSrcweir 		if ( IsDisplayPrinter() )
1194*cdf0e10cSrcweir 		{
1195*cdf0e10cSrcweir 			mbNewJobSetup = sal_True;
1196*cdf0e10cSrcweir 			maJobSetup = aJobSetup;
1197*cdf0e10cSrcweir 			return sal_True;
1198*cdf0e10cSrcweir 		}
1199*cdf0e10cSrcweir 
1200*cdf0e10cSrcweir 		ImplReleaseGraphics();
1201*cdf0e10cSrcweir 		if ( ePaper == PAPER_USER )
1202*cdf0e10cSrcweir 			ImplFindPaperFormatForUserSize( aJobSetup, false );
1203*cdf0e10cSrcweir 		if ( mpInfoPrinter->SetData( SAL_JOBSET_PAPERSIZE|SAL_JOBSET_ORIENTATION, pSetupData ) )
1204*cdf0e10cSrcweir 		{
1205*cdf0e10cSrcweir 			ImplUpdateJobSetupPaper( aJobSetup );
1206*cdf0e10cSrcweir 			mbNewJobSetup = sal_True;
1207*cdf0e10cSrcweir 			maJobSetup = aJobSetup;
1208*cdf0e10cSrcweir 			ImplUpdatePageData();
1209*cdf0e10cSrcweir 			ImplUpdateFontList();
1210*cdf0e10cSrcweir 			return sal_True;
1211*cdf0e10cSrcweir 		}
1212*cdf0e10cSrcweir 		else
1213*cdf0e10cSrcweir 			return sal_False;
1214*cdf0e10cSrcweir 	}
1215*cdf0e10cSrcweir 
1216*cdf0e10cSrcweir 	return sal_True;
1217*cdf0e10cSrcweir }
1218*cdf0e10cSrcweir 
1219*cdf0e10cSrcweir // -----------------------------------------------------------------------
1220*cdf0e10cSrcweir 
1221*cdf0e10cSrcweir sal_Bool Printer::SetPaperSizeUser( const Size& rSize )
1222*cdf0e10cSrcweir {
1223*cdf0e10cSrcweir     return SetPaperSizeUser( rSize, false );
1224*cdf0e10cSrcweir }
1225*cdf0e10cSrcweir 
1226*cdf0e10cSrcweir sal_Bool Printer::SetPaperSizeUser( const Size& rSize, bool bMatchNearest )
1227*cdf0e10cSrcweir {
1228*cdf0e10cSrcweir 	if ( mbInPrintPage )
1229*cdf0e10cSrcweir 		return sal_False;
1230*cdf0e10cSrcweir 
1231*cdf0e10cSrcweir 	Size	aPixSize = LogicToPixel( rSize );
1232*cdf0e10cSrcweir 	Size	aPageSize = PixelToLogic( aPixSize, MAP_100TH_MM );
1233*cdf0e10cSrcweir 	if ( (maJobSetup.ImplGetConstData()->mePaperFormat != PAPER_USER)		||
1234*cdf0e10cSrcweir 		 (maJobSetup.ImplGetConstData()->mnPaperWidth  != aPageSize.Width()) ||
1235*cdf0e10cSrcweir 		 (maJobSetup.ImplGetConstData()->mnPaperHeight != aPageSize.Height()) )
1236*cdf0e10cSrcweir 	{
1237*cdf0e10cSrcweir 		JobSetup		aJobSetup = maJobSetup;
1238*cdf0e10cSrcweir 		ImplJobSetup*	pSetupData = aJobSetup.ImplGetData();
1239*cdf0e10cSrcweir 		pSetupData->mePaperFormat	= PAPER_USER;
1240*cdf0e10cSrcweir 		pSetupData->mnPaperWidth	= aPageSize.Width();
1241*cdf0e10cSrcweir 		pSetupData->mnPaperHeight	= aPageSize.Height();
1242*cdf0e10cSrcweir 
1243*cdf0e10cSrcweir 		if ( IsDisplayPrinter() )
1244*cdf0e10cSrcweir 		{
1245*cdf0e10cSrcweir 			mbNewJobSetup = sal_True;
1246*cdf0e10cSrcweir 			maJobSetup = aJobSetup;
1247*cdf0e10cSrcweir 			return sal_True;
1248*cdf0e10cSrcweir 		}
1249*cdf0e10cSrcweir 
1250*cdf0e10cSrcweir 		ImplReleaseGraphics();
1251*cdf0e10cSrcweir 		ImplFindPaperFormatForUserSize( aJobSetup, bMatchNearest );
1252*cdf0e10cSrcweir 
1253*cdf0e10cSrcweir 		// Changing the paper size can also change the orientation!
1254*cdf0e10cSrcweir 		if ( mpInfoPrinter->SetData( SAL_JOBSET_PAPERSIZE|SAL_JOBSET_ORIENTATION, pSetupData ) )
1255*cdf0e10cSrcweir 		{
1256*cdf0e10cSrcweir 			ImplUpdateJobSetupPaper( aJobSetup );
1257*cdf0e10cSrcweir 			mbNewJobSetup = sal_True;
1258*cdf0e10cSrcweir 			maJobSetup = aJobSetup;
1259*cdf0e10cSrcweir 			ImplUpdatePageData();
1260*cdf0e10cSrcweir 			ImplUpdateFontList();
1261*cdf0e10cSrcweir 			return sal_True;
1262*cdf0e10cSrcweir 		}
1263*cdf0e10cSrcweir 		else
1264*cdf0e10cSrcweir 			return sal_False;
1265*cdf0e10cSrcweir 	}
1266*cdf0e10cSrcweir 
1267*cdf0e10cSrcweir 	return sal_True;
1268*cdf0e10cSrcweir }
1269*cdf0e10cSrcweir 
1270*cdf0e10cSrcweir // -----------------------------------------------------------------------
1271*cdf0e10cSrcweir 
1272*cdf0e10cSrcweir int Printer::GetPaperInfoCount() const
1273*cdf0e10cSrcweir {
1274*cdf0e10cSrcweir     if( ! mpInfoPrinter )
1275*cdf0e10cSrcweir         return 0;
1276*cdf0e10cSrcweir     if( ! mpInfoPrinter->m_bPapersInit )
1277*cdf0e10cSrcweir         mpInfoPrinter->InitPaperFormats( maJobSetup.ImplGetConstData() );
1278*cdf0e10cSrcweir     return mpInfoPrinter->m_aPaperFormats.size();
1279*cdf0e10cSrcweir }
1280*cdf0e10cSrcweir 
1281*cdf0e10cSrcweir // -----------------------------------------------------------------------
1282*cdf0e10cSrcweir 
1283*cdf0e10cSrcweir rtl::OUString Printer::GetPaperName( Paper ePaper )
1284*cdf0e10cSrcweir {
1285*cdf0e10cSrcweir     ImplSVData* pSVData = ImplGetSVData();
1286*cdf0e10cSrcweir     if( ! pSVData->mpPaperNames )
1287*cdf0e10cSrcweir     {
1288*cdf0e10cSrcweir         pSVData->mpPaperNames = new std::hash_map< int, rtl::OUString >();
1289*cdf0e10cSrcweir         if( ImplGetResMgr() )
1290*cdf0e10cSrcweir         {
1291*cdf0e10cSrcweir             ResStringArray aPaperStrings( VclResId( RID_STR_PAPERNAMES ) );
1292*cdf0e10cSrcweir             static const int PaperIndex[] =
1293*cdf0e10cSrcweir             {
1294*cdf0e10cSrcweir                 PAPER_A0, PAPER_A1, PAPER_A2, PAPER_A3, PAPER_A4, PAPER_A5,
1295*cdf0e10cSrcweir                 PAPER_B4_ISO, PAPER_B5_ISO, PAPER_LETTER, PAPER_LEGAL, PAPER_TABLOID,
1296*cdf0e10cSrcweir                 PAPER_USER, PAPER_B6_ISO, PAPER_ENV_C4, PAPER_ENV_C5, PAPER_ENV_C6, PAPER_ENV_C65,
1297*cdf0e10cSrcweir                 PAPER_ENV_DL, PAPER_SLIDE_DIA, PAPER_SCREEN, PAPER_C, PAPER_D, PAPER_E,
1298*cdf0e10cSrcweir                 PAPER_EXECUTIVE, PAPER_FANFOLD_LEGAL_DE, PAPER_ENV_MONARCH, PAPER_ENV_PERSONAL,
1299*cdf0e10cSrcweir                 PAPER_ENV_9, PAPER_ENV_10, PAPER_ENV_11, PAPER_ENV_12, PAPER_KAI16,
1300*cdf0e10cSrcweir                 PAPER_KAI32, PAPER_KAI32BIG, PAPER_B4_JIS, PAPER_B5_JIS, PAPER_B6_JIS
1301*cdf0e10cSrcweir             };
1302*cdf0e10cSrcweir             OSL_ENSURE( sal_uInt32(sizeof(PaperIndex)/sizeof(PaperIndex[0])) == aPaperStrings.Count(), "localized paper name count wrong" );
1303*cdf0e10cSrcweir             for( int i = 0; i < int(sizeof(PaperIndex)/sizeof(PaperIndex[0])); i++ )
1304*cdf0e10cSrcweir                 (*pSVData->mpPaperNames)[PaperIndex[i]] = aPaperStrings.GetString(i);
1305*cdf0e10cSrcweir         }
1306*cdf0e10cSrcweir     }
1307*cdf0e10cSrcweir 
1308*cdf0e10cSrcweir     std::hash_map<int,rtl::OUString>::const_iterator it = pSVData->mpPaperNames->find( (int)ePaper );
1309*cdf0e10cSrcweir     return (it != pSVData->mpPaperNames->end()) ? it->second : rtl::OUString();
1310*cdf0e10cSrcweir }
1311*cdf0e10cSrcweir 
1312*cdf0e10cSrcweir // -----------------------------------------------------------------------
1313*cdf0e10cSrcweir 
1314*cdf0e10cSrcweir rtl::OUString Printer::GetPaperName( bool i_bPaperUser ) const
1315*cdf0e10cSrcweir {
1316*cdf0e10cSrcweir 	Size  aPageSize = PixelToLogic( GetPaperSizePixel(), MAP_100TH_MM );
1317*cdf0e10cSrcweir 	Paper ePaper    = ImplGetPaperFormat( aPageSize.Width(), aPageSize.Height() );
1318*cdf0e10cSrcweir 	if( ePaper == PAPER_USER )
1319*cdf0e10cSrcweir 	    ePaper = ImplGetPaperFormat( aPageSize.Height(), aPageSize.Width() );
1320*cdf0e10cSrcweir 	return (ePaper != PAPER_USER || i_bPaperUser ) ? GetPaperName( ePaper ) : rtl::OUString();
1321*cdf0e10cSrcweir }
1322*cdf0e10cSrcweir 
1323*cdf0e10cSrcweir // -----------------------------------------------------------------------
1324*cdf0e10cSrcweir 
1325*cdf0e10cSrcweir const PaperInfo& Printer::GetPaperInfo( int nPaper ) const
1326*cdf0e10cSrcweir {
1327*cdf0e10cSrcweir     if( ! mpInfoPrinter )
1328*cdf0e10cSrcweir         return ImplGetEmptyPaper();
1329*cdf0e10cSrcweir     if( ! mpInfoPrinter->m_bPapersInit )
1330*cdf0e10cSrcweir         mpInfoPrinter->InitPaperFormats( maJobSetup.ImplGetConstData() );
1331*cdf0e10cSrcweir     if( mpInfoPrinter->m_aPaperFormats.empty() || nPaper < 0 || nPaper >= int(mpInfoPrinter->m_aPaperFormats.size()) )
1332*cdf0e10cSrcweir         return ImplGetEmptyPaper();
1333*cdf0e10cSrcweir     return mpInfoPrinter->m_aPaperFormats[nPaper];
1334*cdf0e10cSrcweir }
1335*cdf0e10cSrcweir 
1336*cdf0e10cSrcweir // -----------------------------------------------------------------------
1337*cdf0e10cSrcweir 
1338*cdf0e10cSrcweir DuplexMode Printer::GetDuplexMode() const
1339*cdf0e10cSrcweir {
1340*cdf0e10cSrcweir 	return maJobSetup.ImplGetConstData()->meDuplexMode;
1341*cdf0e10cSrcweir }
1342*cdf0e10cSrcweir 
1343*cdf0e10cSrcweir // -----------------------------------------------------------------------
1344*cdf0e10cSrcweir 
1345*cdf0e10cSrcweir sal_Bool Printer::SetDuplexMode( DuplexMode eDuplex )
1346*cdf0e10cSrcweir {
1347*cdf0e10cSrcweir 	if ( mbInPrintPage )
1348*cdf0e10cSrcweir 		return sal_False;
1349*cdf0e10cSrcweir 
1350*cdf0e10cSrcweir 	if ( maJobSetup.ImplGetConstData()->meDuplexMode != eDuplex )
1351*cdf0e10cSrcweir 	{
1352*cdf0e10cSrcweir 		JobSetup		aJobSetup = maJobSetup;
1353*cdf0e10cSrcweir 		ImplJobSetup*	pSetupData = aJobSetup.ImplGetData();
1354*cdf0e10cSrcweir 		pSetupData->meDuplexMode = eDuplex;
1355*cdf0e10cSrcweir 
1356*cdf0e10cSrcweir 		if ( IsDisplayPrinter() )
1357*cdf0e10cSrcweir 		{
1358*cdf0e10cSrcweir 			mbNewJobSetup = sal_True;
1359*cdf0e10cSrcweir 			maJobSetup = aJobSetup;
1360*cdf0e10cSrcweir 			return sal_True;
1361*cdf0e10cSrcweir 		}
1362*cdf0e10cSrcweir 
1363*cdf0e10cSrcweir 		ImplReleaseGraphics();
1364*cdf0e10cSrcweir 		if ( mpInfoPrinter->SetData( SAL_JOBSET_DUPLEXMODE, pSetupData ) )
1365*cdf0e10cSrcweir 		{
1366*cdf0e10cSrcweir 			ImplUpdateJobSetupPaper( aJobSetup );
1367*cdf0e10cSrcweir 			mbNewJobSetup = sal_True;
1368*cdf0e10cSrcweir 			maJobSetup = aJobSetup;
1369*cdf0e10cSrcweir 			ImplUpdatePageData();
1370*cdf0e10cSrcweir 			ImplUpdateFontList();
1371*cdf0e10cSrcweir 			return sal_True;
1372*cdf0e10cSrcweir 		}
1373*cdf0e10cSrcweir 		else
1374*cdf0e10cSrcweir 			return sal_False;
1375*cdf0e10cSrcweir 	}
1376*cdf0e10cSrcweir 
1377*cdf0e10cSrcweir 	return sal_True;
1378*cdf0e10cSrcweir }
1379*cdf0e10cSrcweir 
1380*cdf0e10cSrcweir // -----------------------------------------------------------------------
1381*cdf0e10cSrcweir 
1382*cdf0e10cSrcweir int Printer::GetLandscapeAngle() const
1383*cdf0e10cSrcweir {
1384*cdf0e10cSrcweir     return mpInfoPrinter ? mpInfoPrinter->GetLandscapeAngle( maJobSetup.ImplGetConstData() ) : 900;
1385*cdf0e10cSrcweir }
1386*cdf0e10cSrcweir 
1387*cdf0e10cSrcweir // -----------------------------------------------------------------------
1388*cdf0e10cSrcweir 
1389*cdf0e10cSrcweir Paper Printer::GetPaper() const
1390*cdf0e10cSrcweir {
1391*cdf0e10cSrcweir 	return maJobSetup.ImplGetConstData()->mePaperFormat;
1392*cdf0e10cSrcweir }
1393*cdf0e10cSrcweir 
1394*cdf0e10cSrcweir // -----------------------------------------------------------------------
1395*cdf0e10cSrcweir 
1396*cdf0e10cSrcweir sal_uInt16 Printer::GetPaperBinCount() const
1397*cdf0e10cSrcweir {
1398*cdf0e10cSrcweir 	if ( IsDisplayPrinter() )
1399*cdf0e10cSrcweir 		return 0;
1400*cdf0e10cSrcweir 
1401*cdf0e10cSrcweir 	return (sal_uInt16)mpInfoPrinter->GetPaperBinCount( maJobSetup.ImplGetConstData() );
1402*cdf0e10cSrcweir }
1403*cdf0e10cSrcweir 
1404*cdf0e10cSrcweir // -----------------------------------------------------------------------
1405*cdf0e10cSrcweir 
1406*cdf0e10cSrcweir XubString Printer::GetPaperBinName( sal_uInt16 nPaperBin ) const
1407*cdf0e10cSrcweir {
1408*cdf0e10cSrcweir 	if ( IsDisplayPrinter() )
1409*cdf0e10cSrcweir 		return ImplGetSVEmptyStr();
1410*cdf0e10cSrcweir 
1411*cdf0e10cSrcweir 	if ( nPaperBin < GetPaperBinCount() )
1412*cdf0e10cSrcweir 		return mpInfoPrinter->GetPaperBinName( maJobSetup.ImplGetConstData(), nPaperBin );
1413*cdf0e10cSrcweir 	else
1414*cdf0e10cSrcweir 		return ImplGetSVEmptyStr();
1415*cdf0e10cSrcweir }
1416*cdf0e10cSrcweir 
1417*cdf0e10cSrcweir // -----------------------------------------------------------------------
1418*cdf0e10cSrcweir 
1419*cdf0e10cSrcweir sal_Bool Printer::SetCopyCount( sal_uInt16 nCopy, sal_Bool bCollate )
1420*cdf0e10cSrcweir {
1421*cdf0e10cSrcweir 	mnCopyCount = nCopy;
1422*cdf0e10cSrcweir     mbCollateCopy = bCollate;
1423*cdf0e10cSrcweir 	return sal_True;
1424*cdf0e10cSrcweir }
1425*cdf0e10cSrcweir 
1426*cdf0e10cSrcweir // -----------------------------------------------------------------------
1427*cdf0e10cSrcweir 
1428*cdf0e10cSrcweir void Printer::Error()
1429*cdf0e10cSrcweir {
1430*cdf0e10cSrcweir 	maErrorHdl.Call( this );
1431*cdf0e10cSrcweir }
1432*cdf0e10cSrcweir 
1433*cdf0e10cSrcweir // -----------------------------------------------------------------------
1434*cdf0e10cSrcweir 
1435*cdf0e10cSrcweir 
1436*cdf0e10cSrcweir sal_uLong Printer::ImplSalPrinterErrorCodeToVCL( sal_uLong nError )
1437*cdf0e10cSrcweir {
1438*cdf0e10cSrcweir 	sal_uLong nVCLError;
1439*cdf0e10cSrcweir 	switch ( nError )
1440*cdf0e10cSrcweir 	{
1441*cdf0e10cSrcweir 		case 0:
1442*cdf0e10cSrcweir 			nVCLError = PRINTER_OK;
1443*cdf0e10cSrcweir 			break;
1444*cdf0e10cSrcweir 		case SAL_PRINTER_ERROR_ABORT:
1445*cdf0e10cSrcweir 			nVCLError = PRINTER_ABORT;
1446*cdf0e10cSrcweir 			break;
1447*cdf0e10cSrcweir 		default:
1448*cdf0e10cSrcweir 			nVCLError = PRINTER_GENERALERROR;
1449*cdf0e10cSrcweir 			break;
1450*cdf0e10cSrcweir 	}
1451*cdf0e10cSrcweir 
1452*cdf0e10cSrcweir 	return nVCLError;
1453*cdf0e10cSrcweir }
1454*cdf0e10cSrcweir 
1455*cdf0e10cSrcweir // -----------------------------------------------------------------------
1456*cdf0e10cSrcweir 
1457*cdf0e10cSrcweir void Printer::ImplEndPrint()
1458*cdf0e10cSrcweir {
1459*cdf0e10cSrcweir 	mbPrinting		= sal_False;
1460*cdf0e10cSrcweir 	mnCurPrintPage	= 0;
1461*cdf0e10cSrcweir 	maJobName.Erase();
1462*cdf0e10cSrcweir }
1463*cdf0e10cSrcweir 
1464*cdf0e10cSrcweir // -----------------------------------------------------------------------
1465*cdf0e10cSrcweir 
1466*cdf0e10cSrcweir IMPL_LINK( Printer, ImplDestroyPrinterAsync, void*, pSalPrinter )
1467*cdf0e10cSrcweir {
1468*cdf0e10cSrcweir 	SalPrinter* pPrinter = (SalPrinter*)pSalPrinter;
1469*cdf0e10cSrcweir 	ImplSVData* pSVData = ImplGetSVData();
1470*cdf0e10cSrcweir 	pSVData->mpDefInst->DestroyPrinter( pPrinter );
1471*cdf0e10cSrcweir 	return 0;
1472*cdf0e10cSrcweir }
1473*cdf0e10cSrcweir 
1474*cdf0e10cSrcweir // -----------------------------------------------------------------------
1475*cdf0e10cSrcweir 
1476*cdf0e10cSrcweir sal_Bool Printer::EndJob()
1477*cdf0e10cSrcweir {
1478*cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
1479*cdf0e10cSrcweir 	if ( !IsJobActive() )
1480*cdf0e10cSrcweir 		return bRet;
1481*cdf0e10cSrcweir 
1482*cdf0e10cSrcweir 	DBG_ASSERT( !mbInPrintPage, "Printer::EndJob() - StartPage() without EndPage() called" );
1483*cdf0e10cSrcweir 
1484*cdf0e10cSrcweir 	mbJobActive = sal_False;
1485*cdf0e10cSrcweir 
1486*cdf0e10cSrcweir 	if ( mpPrinter )
1487*cdf0e10cSrcweir 	{
1488*cdf0e10cSrcweir 		ImplReleaseGraphics();
1489*cdf0e10cSrcweir 
1490*cdf0e10cSrcweir 		mnCurPage = 0;
1491*cdf0e10cSrcweir 
1492*cdf0e10cSrcweir 		bRet = sal_True;
1493*cdf0e10cSrcweir 
1494*cdf0e10cSrcweir         mbPrinting		= sal_False;
1495*cdf0e10cSrcweir         mnCurPrintPage	= 0;
1496*cdf0e10cSrcweir         maJobName.Erase();
1497*cdf0e10cSrcweir 
1498*cdf0e10cSrcweir         mbDevOutput = sal_False;
1499*cdf0e10cSrcweir         bRet = mpPrinter->EndJob();
1500*cdf0e10cSrcweir         // Hier den Drucker nicht asyncron zerstoeren, da es
1501*cdf0e10cSrcweir         // W95 nicht verkraftet, wenn gleichzeitig gedruckt wird
1502*cdf0e10cSrcweir         // und ein Druckerobjekt zerstoert wird
1503*cdf0e10cSrcweir         ImplGetSVData()->mpDefInst->DestroyPrinter( mpPrinter );
1504*cdf0e10cSrcweir         mpPrinter = NULL;
1505*cdf0e10cSrcweir 	}
1506*cdf0e10cSrcweir 
1507*cdf0e10cSrcweir 	return bRet;
1508*cdf0e10cSrcweir }
1509*cdf0e10cSrcweir 
1510*cdf0e10cSrcweir // -----------------------------------------------------------------------
1511*cdf0e10cSrcweir 
1512*cdf0e10cSrcweir sal_Bool Printer::AbortJob()
1513*cdf0e10cSrcweir {
1514*cdf0e10cSrcweir 	// Wenn wir einen Queue-Printer haben, kann man diesen noch mit
1515*cdf0e10cSrcweir 	// AbortJob() abbrechen, solange dieser noch am Drucken ist
1516*cdf0e10cSrcweir 	if ( !IsJobActive() && !IsPrinting() )
1517*cdf0e10cSrcweir 		return sal_False;
1518*cdf0e10cSrcweir 
1519*cdf0e10cSrcweir 	mbJobActive 	= sal_False;
1520*cdf0e10cSrcweir 	mbInPrintPage	= sal_False;
1521*cdf0e10cSrcweir 	mpJobGraphics	= NULL;
1522*cdf0e10cSrcweir 
1523*cdf0e10cSrcweir 	if ( mpPrinter )
1524*cdf0e10cSrcweir 	{
1525*cdf0e10cSrcweir 		mbPrinting		= sal_False;
1526*cdf0e10cSrcweir 		mnCurPage		= 0;
1527*cdf0e10cSrcweir 		mnCurPrintPage	= 0;
1528*cdf0e10cSrcweir 		maJobName.Erase();
1529*cdf0e10cSrcweir 
1530*cdf0e10cSrcweir         ImplReleaseGraphics();
1531*cdf0e10cSrcweir         mbDevOutput = sal_False;
1532*cdf0e10cSrcweir         mpPrinter->AbortJob();
1533*cdf0e10cSrcweir         Application::PostUserEvent( LINK( this, Printer, ImplDestroyPrinterAsync ), mpPrinter );
1534*cdf0e10cSrcweir         mpPrinter = NULL;
1535*cdf0e10cSrcweir 
1536*cdf0e10cSrcweir 		return sal_True;
1537*cdf0e10cSrcweir 	}
1538*cdf0e10cSrcweir 
1539*cdf0e10cSrcweir 	return sal_False;
1540*cdf0e10cSrcweir }
1541*cdf0e10cSrcweir 
1542*cdf0e10cSrcweir // -----------------------------------------------------------------------
1543*cdf0e10cSrcweir 
1544*cdf0e10cSrcweir void Printer::ImplStartPage()
1545*cdf0e10cSrcweir {
1546*cdf0e10cSrcweir 	if ( !IsJobActive() )
1547*cdf0e10cSrcweir 		return;
1548*cdf0e10cSrcweir 
1549*cdf0e10cSrcweir 	if ( mpPrinter )
1550*cdf0e10cSrcweir 	{
1551*cdf0e10cSrcweir         SalGraphics* pGraphics = mpPrinter->StartPage( maJobSetup.ImplGetConstData(), mbNewJobSetup );
1552*cdf0e10cSrcweir         if ( pGraphics )
1553*cdf0e10cSrcweir         {
1554*cdf0e10cSrcweir             ImplReleaseGraphics();
1555*cdf0e10cSrcweir             mpJobGraphics = pGraphics;
1556*cdf0e10cSrcweir         }
1557*cdf0e10cSrcweir         mbDevOutput = sal_True;
1558*cdf0e10cSrcweir 
1559*cdf0e10cSrcweir 		// PrintJob not aborted ???
1560*cdf0e10cSrcweir 		if ( IsJobActive() )
1561*cdf0e10cSrcweir 		{
1562*cdf0e10cSrcweir 			mbInPrintPage = sal_True;
1563*cdf0e10cSrcweir 			mnCurPage++;
1564*cdf0e10cSrcweir             mnCurPrintPage++;
1565*cdf0e10cSrcweir 		}
1566*cdf0e10cSrcweir 	}
1567*cdf0e10cSrcweir }
1568*cdf0e10cSrcweir 
1569*cdf0e10cSrcweir // -----------------------------------------------------------------------
1570*cdf0e10cSrcweir 
1571*cdf0e10cSrcweir void Printer::ImplEndPage()
1572*cdf0e10cSrcweir {
1573*cdf0e10cSrcweir 	if ( !IsJobActive() )
1574*cdf0e10cSrcweir 		return;
1575*cdf0e10cSrcweir 
1576*cdf0e10cSrcweir 	mbInPrintPage = sal_False;
1577*cdf0e10cSrcweir 
1578*cdf0e10cSrcweir 	if ( mpPrinter )
1579*cdf0e10cSrcweir 	{
1580*cdf0e10cSrcweir         mpPrinter->EndPage();
1581*cdf0e10cSrcweir         ImplReleaseGraphics();
1582*cdf0e10cSrcweir         mbDevOutput = sal_False;
1583*cdf0e10cSrcweir 
1584*cdf0e10cSrcweir 		mpJobGraphics = NULL;
1585*cdf0e10cSrcweir 		mbNewJobSetup = sal_False;
1586*cdf0e10cSrcweir 	}
1587*cdf0e10cSrcweir }
1588*cdf0e10cSrcweir 
1589*cdf0e10cSrcweir // -----------------------------------------------------------------------
1590*cdf0e10cSrcweir 
1591*cdf0e10cSrcweir void Printer::updatePrinters()
1592*cdf0e10cSrcweir {
1593*cdf0e10cSrcweir 	ImplSVData* 		pSVData = ImplGetSVData();
1594*cdf0e10cSrcweir 	ImplPrnQueueList*	pPrnList = pSVData->maGDIData.mpPrinterQueueList;
1595*cdf0e10cSrcweir 
1596*cdf0e10cSrcweir 	if ( pPrnList )
1597*cdf0e10cSrcweir 	{
1598*cdf0e10cSrcweir         ImplPrnQueueList* pNewList = new ImplPrnQueueList;
1599*cdf0e10cSrcweir         pSVData->mpDefInst->GetPrinterQueueInfo( pNewList );
1600*cdf0e10cSrcweir 
1601*cdf0e10cSrcweir         bool bChanged = pPrnList->m_aQueueInfos.size() != pNewList->m_aQueueInfos.size();
1602*cdf0e10cSrcweir         for( unsigned int i = 0; ! bChanged && i < pPrnList->m_aQueueInfos.size(); i++ )
1603*cdf0e10cSrcweir         {
1604*cdf0e10cSrcweir             ImplPrnQueueData& rInfo     = pPrnList->m_aQueueInfos[i];
1605*cdf0e10cSrcweir             ImplPrnQueueData& rNewInfo  = pNewList->m_aQueueInfos[i];
1606*cdf0e10cSrcweir             if( ! rInfo.mpSalQueueInfo || ! rNewInfo.mpSalQueueInfo || // sanity check
1607*cdf0e10cSrcweir                 rInfo.mpSalQueueInfo->maPrinterName != rNewInfo.mpSalQueueInfo->maPrinterName )
1608*cdf0e10cSrcweir             {
1609*cdf0e10cSrcweir                 bChanged = true;
1610*cdf0e10cSrcweir             }
1611*cdf0e10cSrcweir 		}
1612*cdf0e10cSrcweir         if( bChanged )
1613*cdf0e10cSrcweir         {
1614*cdf0e10cSrcweir             ImplDeletePrnQueueList();
1615*cdf0e10cSrcweir             pSVData->maGDIData.mpPrinterQueueList = pNewList;
1616*cdf0e10cSrcweir 
1617*cdf0e10cSrcweir             Application* pApp = GetpApp();
1618*cdf0e10cSrcweir             if( pApp )
1619*cdf0e10cSrcweir             {
1620*cdf0e10cSrcweir                 DataChangedEvent aDCEvt( DATACHANGED_PRINTER );
1621*cdf0e10cSrcweir                 pApp->DataChanged( aDCEvt );
1622*cdf0e10cSrcweir                 pApp->NotifyAllWindows( aDCEvt );
1623*cdf0e10cSrcweir             }
1624*cdf0e10cSrcweir         }
1625*cdf0e10cSrcweir         else
1626*cdf0e10cSrcweir             delete pNewList;
1627*cdf0e10cSrcweir 	}
1628*cdf0e10cSrcweir }
1629