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