xref: /trunk/main/vcl/source/gdi/print.cxx (revision 635e0213207530aa4afd22a26b395eac0f6ec05a)
19f62ea84SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
39f62ea84SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
49f62ea84SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
59f62ea84SAndrew Rist  * distributed with this work for additional information
69f62ea84SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
79f62ea84SAndrew Rist  * to you under the Apache License, Version 2.0 (the
89f62ea84SAndrew Rist  * "License"); you may not use this file except in compliance
99f62ea84SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
119f62ea84SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
139f62ea84SAndrew Rist  * Unless required by applicable law or agreed to in writing,
149f62ea84SAndrew Rist  * software distributed under the License is distributed on an
159f62ea84SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
169f62ea84SAndrew Rist  * KIND, either express or implied.  See the License for the
179f62ea84SAndrew Rist  * specific language governing permissions and limitations
189f62ea84SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
209f62ea84SAndrew Rist  *************************************************************/
219f62ea84SAndrew Rist 
229f62ea84SAndrew 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() );
15986e1cf34SPedro Giffuni         // create configuration hierarchical 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 
492d9b868a3SMatthias Seidel     // Testen, ob Treiber überhaupt mit dem JobSetup übereinstimmt
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 
525d9b868a3SMatthias Seidel     // we need a graphic
526cdf0e10cSrcweir     if ( !ImplGetGraphics() )
527cdf0e10cSrcweir     {
528cdf0e10cSrcweir         ImplInitDisplay( NULL );
529cdf0e10cSrcweir         return;
530cdf0e10cSrcweir     }
531cdf0e10cSrcweir 
532d9b868a3SMatthias Seidel     // initialize data
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     {
57186e1cf34SPedro Giffuni         // first search for the printer name directly
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     {
900d9b868a3SMatthias Seidel         // Alten Printer zerstören
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 
936d9b868a3SMatthias Seidel     // Alten Printer zerstören?
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
1109d9b868a3SMatthias Seidel     // 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 
1141d9b868a3SMatthias Seidel              // check portrait 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 
1227d7e5dbc3SArmin Le Grand     const Size aPixSize = LogicToPixel( rSize );
1228d7e5dbc3SArmin Le Grand     const Size aPageSize = PixelToLogic( aPixSize, MAP_100TH_MM );
1229d7e5dbc3SArmin Le Grand     bool bNeedToChange(maJobSetup.ImplGetConstData()->mnPaperWidth != aPageSize.Width() ||
1230d7e5dbc3SArmin Le Grand         maJobSetup.ImplGetConstData()->mnPaperHeight != aPageSize.Height());
1231d7e5dbc3SArmin Le Grand 
1232d7e5dbc3SArmin Le Grand     if(!bNeedToChange)
1233d7e5dbc3SArmin Le Grand     {
1234d7e5dbc3SArmin Le Grand         // #122984# only need to change when Paper is different from PAPER_USER and
1235d7e5dbc3SArmin Le Grand         // the mapped Paper which will created below in the call to ImplFindPaperFormatForUserSize
1236d7e5dbc3SArmin Le Grand         // and will replace maJobSetup.ImplGetConstData()->mePaperFormat. This leads to
1237d7e5dbc3SArmin Le Grand         // unnecessary JobSetups, e.g. when printing a multi-page fax, but also with
1238d7e5dbc3SArmin Le Grand         // normal print
1239d7e5dbc3SArmin Le Grand         const Paper aPaper = ImplGetPaperFormat(aPageSize.Width(), aPageSize.Height());
1240d7e5dbc3SArmin Le Grand 
1241d7e5dbc3SArmin Le Grand         bNeedToChange = maJobSetup.ImplGetConstData()->mePaperFormat != PAPER_USER &&
1242d7e5dbc3SArmin Le Grand             maJobSetup.ImplGetConstData()->mePaperFormat != aPaper;
1243d7e5dbc3SArmin Le Grand     }
1244d7e5dbc3SArmin Le Grand 
1245d7e5dbc3SArmin Le Grand     if(bNeedToChange)
1246cdf0e10cSrcweir     {
1247cdf0e10cSrcweir         JobSetup        aJobSetup = maJobSetup;
1248cdf0e10cSrcweir         ImplJobSetup*   pSetupData = aJobSetup.ImplGetData();
1249cdf0e10cSrcweir         pSetupData->mePaperFormat   = PAPER_USER;
1250cdf0e10cSrcweir         pSetupData->mnPaperWidth    = aPageSize.Width();
1251cdf0e10cSrcweir         pSetupData->mnPaperHeight   = aPageSize.Height();
1252cdf0e10cSrcweir 
1253cdf0e10cSrcweir         if ( IsDisplayPrinter() )
1254cdf0e10cSrcweir         {
1255cdf0e10cSrcweir             mbNewJobSetup = sal_True;
1256cdf0e10cSrcweir             maJobSetup = aJobSetup;
1257cdf0e10cSrcweir             return sal_True;
1258cdf0e10cSrcweir         }
1259cdf0e10cSrcweir 
1260cdf0e10cSrcweir         ImplReleaseGraphics();
1261cdf0e10cSrcweir         ImplFindPaperFormatForUserSize( aJobSetup, bMatchNearest );
1262cdf0e10cSrcweir 
1263cdf0e10cSrcweir         // Changing the paper size can also change the orientation!
1264cdf0e10cSrcweir         if ( mpInfoPrinter->SetData( SAL_JOBSET_PAPERSIZE|SAL_JOBSET_ORIENTATION, pSetupData ) )
1265cdf0e10cSrcweir         {
1266cdf0e10cSrcweir             ImplUpdateJobSetupPaper( aJobSetup );
1267cdf0e10cSrcweir             mbNewJobSetup = sal_True;
1268cdf0e10cSrcweir             maJobSetup = aJobSetup;
1269cdf0e10cSrcweir             ImplUpdatePageData();
1270cdf0e10cSrcweir             ImplUpdateFontList();
1271cdf0e10cSrcweir             return sal_True;
1272cdf0e10cSrcweir         }
1273cdf0e10cSrcweir         else
1274cdf0e10cSrcweir             return sal_False;
1275cdf0e10cSrcweir     }
1276cdf0e10cSrcweir 
1277cdf0e10cSrcweir     return sal_True;
1278cdf0e10cSrcweir }
1279cdf0e10cSrcweir 
1280cdf0e10cSrcweir // -----------------------------------------------------------------------
1281cdf0e10cSrcweir 
GetPaperInfoCount() const1282cdf0e10cSrcweir int Printer::GetPaperInfoCount() const
1283cdf0e10cSrcweir {
1284cdf0e10cSrcweir     if( ! mpInfoPrinter )
1285cdf0e10cSrcweir         return 0;
1286cdf0e10cSrcweir     if( ! mpInfoPrinter->m_bPapersInit )
1287cdf0e10cSrcweir         mpInfoPrinter->InitPaperFormats( maJobSetup.ImplGetConstData() );
1288cdf0e10cSrcweir     return mpInfoPrinter->m_aPaperFormats.size();
1289cdf0e10cSrcweir }
1290cdf0e10cSrcweir 
1291cdf0e10cSrcweir // -----------------------------------------------------------------------
1292cdf0e10cSrcweir 
GetPaperName(Paper ePaper)1293cdf0e10cSrcweir rtl::OUString Printer::GetPaperName( Paper ePaper )
1294cdf0e10cSrcweir {
1295cdf0e10cSrcweir     ImplSVData* pSVData = ImplGetSVData();
1296cdf0e10cSrcweir     if( ! pSVData->mpPaperNames )
1297cdf0e10cSrcweir     {
1298cdf0e10cSrcweir         pSVData->mpPaperNames = new std::hash_map< int, rtl::OUString >();
1299cdf0e10cSrcweir         if( ImplGetResMgr() )
1300cdf0e10cSrcweir         {
1301cdf0e10cSrcweir             ResStringArray aPaperStrings( VclResId( RID_STR_PAPERNAMES ) );
1302cdf0e10cSrcweir             static const int PaperIndex[] =
1303cdf0e10cSrcweir             {
1304cdf0e10cSrcweir                 PAPER_A0, PAPER_A1, PAPER_A2, PAPER_A3, PAPER_A4, PAPER_A5,
1305cdf0e10cSrcweir                 PAPER_B4_ISO, PAPER_B5_ISO, PAPER_LETTER, PAPER_LEGAL, PAPER_TABLOID,
1306cdf0e10cSrcweir                 PAPER_USER, PAPER_B6_ISO, PAPER_ENV_C4, PAPER_ENV_C5, PAPER_ENV_C6, PAPER_ENV_C65,
1307*635e0213SMatthias Seidel                 PAPER_ENV_DL, PAPER_SLIDE_DIA, PAPER_SCREEN_4_BY_3, PAPER_SCREEN_16_BY_9, PAPER_SCREEN_16_BY_10,
1308*635e0213SMatthias Seidel                 PAPER_C, PAPER_D, PAPER_E, PAPER_EXECUTIVE, PAPER_FANFOLD_LEGAL_DE, PAPER_ENV_MONARCH,
1309*635e0213SMatthias Seidel                 PAPER_ENV_PERSONAL, PAPER_ENV_9, PAPER_ENV_10, PAPER_ENV_11, PAPER_ENV_12, PAPER_KAI16,
1310cdf0e10cSrcweir                 PAPER_KAI32, PAPER_KAI32BIG, PAPER_B4_JIS, PAPER_B5_JIS, PAPER_B6_JIS
1311cdf0e10cSrcweir             };
1312cdf0e10cSrcweir             OSL_ENSURE( sal_uInt32(sizeof(PaperIndex)/sizeof(PaperIndex[0])) == aPaperStrings.Count(), "localized paper name count wrong" );
1313cdf0e10cSrcweir             for( int i = 0; i < int(sizeof(PaperIndex)/sizeof(PaperIndex[0])); i++ )
1314cdf0e10cSrcweir             (*pSVData->mpPaperNames)[PaperIndex[i]] = aPaperStrings.GetString(i);
1315cdf0e10cSrcweir         }
1316cdf0e10cSrcweir     }
1317cdf0e10cSrcweir 
1318cdf0e10cSrcweir     std::hash_map<int,rtl::OUString>::const_iterator it = pSVData->mpPaperNames->find( (int)ePaper );
1319cdf0e10cSrcweir     return (it != pSVData->mpPaperNames->end()) ? it->second : rtl::OUString();
1320cdf0e10cSrcweir }
1321cdf0e10cSrcweir 
1322cdf0e10cSrcweir // -----------------------------------------------------------------------
1323cdf0e10cSrcweir 
GetPaperName(bool i_bPaperUser) const1324cdf0e10cSrcweir rtl::OUString Printer::GetPaperName( bool i_bPaperUser ) const
1325cdf0e10cSrcweir {
1326cdf0e10cSrcweir     Size  aPageSize = PixelToLogic( GetPaperSizePixel(), MAP_100TH_MM );
1327cdf0e10cSrcweir     Paper ePaper    = ImplGetPaperFormat( aPageSize.Width(), aPageSize.Height() );
1328cdf0e10cSrcweir     if( ePaper == PAPER_USER )
1329cdf0e10cSrcweir         ePaper = ImplGetPaperFormat( aPageSize.Height(), aPageSize.Width() );
1330cdf0e10cSrcweir     return (ePaper != PAPER_USER || i_bPaperUser ) ? GetPaperName( ePaper ) : rtl::OUString();
1331cdf0e10cSrcweir }
1332cdf0e10cSrcweir 
1333cdf0e10cSrcweir // -----------------------------------------------------------------------
1334cdf0e10cSrcweir 
GetPaperInfo(int nPaper) const1335cdf0e10cSrcweir const PaperInfo& Printer::GetPaperInfo( int nPaper ) const
1336cdf0e10cSrcweir {
1337cdf0e10cSrcweir     if( ! mpInfoPrinter )
1338cdf0e10cSrcweir         return ImplGetEmptyPaper();
1339cdf0e10cSrcweir     if( ! mpInfoPrinter->m_bPapersInit )
1340cdf0e10cSrcweir         mpInfoPrinter->InitPaperFormats( maJobSetup.ImplGetConstData() );
1341cdf0e10cSrcweir     if( mpInfoPrinter->m_aPaperFormats.empty() || nPaper < 0 || nPaper >= int(mpInfoPrinter->m_aPaperFormats.size()) )
1342cdf0e10cSrcweir         return ImplGetEmptyPaper();
1343cdf0e10cSrcweir     return mpInfoPrinter->m_aPaperFormats[nPaper];
1344cdf0e10cSrcweir }
1345cdf0e10cSrcweir 
1346cdf0e10cSrcweir // -----------------------------------------------------------------------
1347cdf0e10cSrcweir 
GetDuplexMode() const1348cdf0e10cSrcweir DuplexMode Printer::GetDuplexMode() const
1349cdf0e10cSrcweir {
1350cdf0e10cSrcweir     return maJobSetup.ImplGetConstData()->meDuplexMode;
1351cdf0e10cSrcweir }
1352cdf0e10cSrcweir 
1353cdf0e10cSrcweir // -----------------------------------------------------------------------
1354cdf0e10cSrcweir 
SetDuplexMode(DuplexMode eDuplex)1355cdf0e10cSrcweir sal_Bool Printer::SetDuplexMode( DuplexMode eDuplex )
1356cdf0e10cSrcweir {
1357cdf0e10cSrcweir     if ( mbInPrintPage )
1358cdf0e10cSrcweir         return sal_False;
1359cdf0e10cSrcweir 
1360cdf0e10cSrcweir     if ( maJobSetup.ImplGetConstData()->meDuplexMode != eDuplex )
1361cdf0e10cSrcweir     {
1362cdf0e10cSrcweir         JobSetup        aJobSetup = maJobSetup;
1363cdf0e10cSrcweir         ImplJobSetup*   pSetupData = aJobSetup.ImplGetData();
1364cdf0e10cSrcweir         pSetupData->meDuplexMode = eDuplex;
1365cdf0e10cSrcweir 
1366cdf0e10cSrcweir         if ( IsDisplayPrinter() )
1367cdf0e10cSrcweir         {
1368cdf0e10cSrcweir             mbNewJobSetup = sal_True;
1369cdf0e10cSrcweir             maJobSetup = aJobSetup;
1370cdf0e10cSrcweir             return sal_True;
1371cdf0e10cSrcweir         }
1372cdf0e10cSrcweir 
1373cdf0e10cSrcweir         ImplReleaseGraphics();
1374cdf0e10cSrcweir         if ( mpInfoPrinter->SetData( SAL_JOBSET_DUPLEXMODE, pSetupData ) )
1375cdf0e10cSrcweir         {
1376cdf0e10cSrcweir             ImplUpdateJobSetupPaper( aJobSetup );
1377cdf0e10cSrcweir             mbNewJobSetup = sal_True;
1378cdf0e10cSrcweir             maJobSetup = aJobSetup;
1379cdf0e10cSrcweir             ImplUpdatePageData();
1380cdf0e10cSrcweir             ImplUpdateFontList();
1381cdf0e10cSrcweir             return sal_True;
1382cdf0e10cSrcweir         }
1383cdf0e10cSrcweir         else
1384cdf0e10cSrcweir             return sal_False;
1385cdf0e10cSrcweir     }
1386cdf0e10cSrcweir 
1387cdf0e10cSrcweir     return sal_True;
1388cdf0e10cSrcweir }
1389cdf0e10cSrcweir 
1390cdf0e10cSrcweir // -----------------------------------------------------------------------
1391cdf0e10cSrcweir 
GetLandscapeAngle() const1392cdf0e10cSrcweir int Printer::GetLandscapeAngle() const
1393cdf0e10cSrcweir {
1394cdf0e10cSrcweir     return mpInfoPrinter ? mpInfoPrinter->GetLandscapeAngle( maJobSetup.ImplGetConstData() ) : 900;
1395cdf0e10cSrcweir }
1396cdf0e10cSrcweir 
1397cdf0e10cSrcweir // -----------------------------------------------------------------------
1398cdf0e10cSrcweir 
GetPaper() const1399cdf0e10cSrcweir Paper Printer::GetPaper() const
1400cdf0e10cSrcweir {
1401cdf0e10cSrcweir     return maJobSetup.ImplGetConstData()->mePaperFormat;
1402cdf0e10cSrcweir }
1403cdf0e10cSrcweir 
1404cdf0e10cSrcweir // -----------------------------------------------------------------------
1405cdf0e10cSrcweir 
GetPaperBinCount() const1406cdf0e10cSrcweir sal_uInt16 Printer::GetPaperBinCount() const
1407cdf0e10cSrcweir {
1408cdf0e10cSrcweir     if ( IsDisplayPrinter() )
1409cdf0e10cSrcweir         return 0;
1410cdf0e10cSrcweir 
1411cdf0e10cSrcweir     return (sal_uInt16)mpInfoPrinter->GetPaperBinCount( maJobSetup.ImplGetConstData() );
1412cdf0e10cSrcweir }
1413cdf0e10cSrcweir 
1414cdf0e10cSrcweir // -----------------------------------------------------------------------
1415cdf0e10cSrcweir 
GetPaperBinName(sal_uInt16 nPaperBin) const1416cdf0e10cSrcweir XubString Printer::GetPaperBinName( sal_uInt16 nPaperBin ) const
1417cdf0e10cSrcweir {
1418cdf0e10cSrcweir     if ( IsDisplayPrinter() )
1419cdf0e10cSrcweir         return ImplGetSVEmptyStr();
1420cdf0e10cSrcweir 
1421cdf0e10cSrcweir     if ( nPaperBin < GetPaperBinCount() )
1422cdf0e10cSrcweir         return mpInfoPrinter->GetPaperBinName( maJobSetup.ImplGetConstData(), nPaperBin );
1423cdf0e10cSrcweir     else
1424cdf0e10cSrcweir         return ImplGetSVEmptyStr();
1425cdf0e10cSrcweir }
1426cdf0e10cSrcweir 
1427cdf0e10cSrcweir // -----------------------------------------------------------------------
1428cdf0e10cSrcweir 
SetCopyCount(sal_uInt16 nCopy,sal_Bool bCollate)1429cdf0e10cSrcweir sal_Bool Printer::SetCopyCount( sal_uInt16 nCopy, sal_Bool bCollate )
1430cdf0e10cSrcweir {
1431cdf0e10cSrcweir     mnCopyCount = nCopy;
1432cdf0e10cSrcweir     mbCollateCopy = bCollate;
1433cdf0e10cSrcweir     return sal_True;
1434cdf0e10cSrcweir }
1435cdf0e10cSrcweir 
1436cdf0e10cSrcweir // -----------------------------------------------------------------------
1437cdf0e10cSrcweir 
Error()1438cdf0e10cSrcweir void Printer::Error()
1439cdf0e10cSrcweir {
1440cdf0e10cSrcweir     maErrorHdl.Call( this );
1441cdf0e10cSrcweir }
1442cdf0e10cSrcweir 
1443cdf0e10cSrcweir // -----------------------------------------------------------------------
1444cdf0e10cSrcweir 
1445cdf0e10cSrcweir 
ImplSalPrinterErrorCodeToVCL(sal_uLong nError)1446cdf0e10cSrcweir sal_uLong Printer::ImplSalPrinterErrorCodeToVCL( sal_uLong nError )
1447cdf0e10cSrcweir {
1448cdf0e10cSrcweir     sal_uLong nVCLError;
1449cdf0e10cSrcweir     switch ( nError )
1450cdf0e10cSrcweir     {
1451cdf0e10cSrcweir         case 0:
1452cdf0e10cSrcweir             nVCLError = PRINTER_OK;
1453cdf0e10cSrcweir             break;
1454cdf0e10cSrcweir         case SAL_PRINTER_ERROR_ABORT:
1455cdf0e10cSrcweir             nVCLError = PRINTER_ABORT;
1456cdf0e10cSrcweir             break;
1457cdf0e10cSrcweir         default:
1458cdf0e10cSrcweir             nVCLError = PRINTER_GENERALERROR;
1459cdf0e10cSrcweir             break;
1460cdf0e10cSrcweir     }
1461cdf0e10cSrcweir 
1462cdf0e10cSrcweir     return nVCLError;
1463cdf0e10cSrcweir }
1464cdf0e10cSrcweir 
1465cdf0e10cSrcweir // -----------------------------------------------------------------------
1466cdf0e10cSrcweir 
ImplEndPrint()1467cdf0e10cSrcweir void Printer::ImplEndPrint()
1468cdf0e10cSrcweir {
1469cdf0e10cSrcweir     mbPrinting      = sal_False;
1470cdf0e10cSrcweir     mnCurPrintPage  = 0;
1471cdf0e10cSrcweir     maJobName.Erase();
1472cdf0e10cSrcweir }
1473cdf0e10cSrcweir 
1474cdf0e10cSrcweir // -----------------------------------------------------------------------
1475cdf0e10cSrcweir 
IMPL_LINK(Printer,ImplDestroyPrinterAsync,void *,pSalPrinter)1476cdf0e10cSrcweir IMPL_LINK( Printer, ImplDestroyPrinterAsync, void*, pSalPrinter )
1477cdf0e10cSrcweir {
1478cdf0e10cSrcweir     SalPrinter* pPrinter = (SalPrinter*)pSalPrinter;
1479cdf0e10cSrcweir     ImplSVData* pSVData = ImplGetSVData();
1480cdf0e10cSrcweir     pSVData->mpDefInst->DestroyPrinter( pPrinter );
1481cdf0e10cSrcweir     return 0;
1482cdf0e10cSrcweir }
1483cdf0e10cSrcweir 
1484cdf0e10cSrcweir // -----------------------------------------------------------------------
1485cdf0e10cSrcweir 
EndJob()1486cdf0e10cSrcweir sal_Bool Printer::EndJob()
1487cdf0e10cSrcweir {
1488cdf0e10cSrcweir     sal_Bool bRet = sal_False;
1489cdf0e10cSrcweir     if ( !IsJobActive() )
1490cdf0e10cSrcweir         return bRet;
1491cdf0e10cSrcweir 
1492cdf0e10cSrcweir     DBG_ASSERT( !mbInPrintPage, "Printer::EndJob() - StartPage() without EndPage() called" );
1493cdf0e10cSrcweir 
1494cdf0e10cSrcweir     mbJobActive = sal_False;
1495cdf0e10cSrcweir 
1496cdf0e10cSrcweir     if ( mpPrinter )
1497cdf0e10cSrcweir     {
1498cdf0e10cSrcweir         ImplReleaseGraphics();
1499cdf0e10cSrcweir 
1500cdf0e10cSrcweir         mnCurPage = 0;
1501cdf0e10cSrcweir 
1502cdf0e10cSrcweir         bRet = sal_True;
1503cdf0e10cSrcweir 
1504cdf0e10cSrcweir         mbPrinting      = sal_False;
1505cdf0e10cSrcweir         mnCurPrintPage  = 0;
1506cdf0e10cSrcweir         maJobName.Erase();
1507cdf0e10cSrcweir 
1508cdf0e10cSrcweir         mbDevOutput = sal_False;
1509cdf0e10cSrcweir         bRet = mpPrinter->EndJob();
1510d9b868a3SMatthias Seidel         // Hier den Drucker nicht asyncron zerstören, da es
1511cdf0e10cSrcweir         // W95 nicht verkraftet, wenn gleichzeitig gedruckt wird
1512d9b868a3SMatthias Seidel         // und ein Druckerobjekt zerstört wird
1513cdf0e10cSrcweir         ImplGetSVData()->mpDefInst->DestroyPrinter( mpPrinter );
1514cdf0e10cSrcweir         mpPrinter = NULL;
1515cdf0e10cSrcweir     }
1516cdf0e10cSrcweir 
1517cdf0e10cSrcweir     return bRet;
1518cdf0e10cSrcweir }
1519cdf0e10cSrcweir 
1520cdf0e10cSrcweir // -----------------------------------------------------------------------
1521cdf0e10cSrcweir 
AbortJob()1522cdf0e10cSrcweir sal_Bool Printer::AbortJob()
1523cdf0e10cSrcweir {
1524cdf0e10cSrcweir     // Wenn wir einen Queue-Printer haben, kann man diesen noch mit
1525cdf0e10cSrcweir     // AbortJob() abbrechen, solange dieser noch am Drucken ist
1526cdf0e10cSrcweir     if ( !IsJobActive() && !IsPrinting() )
1527cdf0e10cSrcweir         return sal_False;
1528cdf0e10cSrcweir 
1529cdf0e10cSrcweir     mbJobActive = sal_False;
1530cdf0e10cSrcweir     mbInPrintPage   = sal_False;
1531cdf0e10cSrcweir     mpJobGraphics   = NULL;
1532cdf0e10cSrcweir 
1533cdf0e10cSrcweir     if ( mpPrinter )
1534cdf0e10cSrcweir     {
1535cdf0e10cSrcweir         mbPrinting      = sal_False;
1536cdf0e10cSrcweir         mnCurPage       = 0;
1537cdf0e10cSrcweir         mnCurPrintPage      = 0;
1538cdf0e10cSrcweir         maJobName.Erase();
1539cdf0e10cSrcweir 
1540cdf0e10cSrcweir         ImplReleaseGraphics();
1541cdf0e10cSrcweir         mbDevOutput = sal_False;
1542cdf0e10cSrcweir         mpPrinter->AbortJob();
1543cdf0e10cSrcweir         Application::PostUserEvent( LINK( this, Printer, ImplDestroyPrinterAsync ), mpPrinter );
1544cdf0e10cSrcweir         mpPrinter = NULL;
1545cdf0e10cSrcweir 
1546cdf0e10cSrcweir         return sal_True;
1547cdf0e10cSrcweir     }
1548cdf0e10cSrcweir 
1549cdf0e10cSrcweir     return sal_False;
1550cdf0e10cSrcweir }
1551cdf0e10cSrcweir 
1552cdf0e10cSrcweir // -----------------------------------------------------------------------
1553cdf0e10cSrcweir 
ImplStartPage()1554cdf0e10cSrcweir void Printer::ImplStartPage()
1555cdf0e10cSrcweir {
1556cdf0e10cSrcweir     if ( !IsJobActive() )
1557cdf0e10cSrcweir         return;
1558cdf0e10cSrcweir 
1559cdf0e10cSrcweir     if ( mpPrinter )
1560cdf0e10cSrcweir     {
1561cdf0e10cSrcweir         SalGraphics* pGraphics = mpPrinter->StartPage( maJobSetup.ImplGetConstData(), mbNewJobSetup );
1562cdf0e10cSrcweir         if ( pGraphics )
1563cdf0e10cSrcweir         {
1564cdf0e10cSrcweir             ImplReleaseGraphics();
1565cdf0e10cSrcweir             mpJobGraphics = pGraphics;
1566cdf0e10cSrcweir         }
1567cdf0e10cSrcweir         mbDevOutput = sal_True;
1568cdf0e10cSrcweir 
1569cdf0e10cSrcweir         // PrintJob not aborted ???
1570cdf0e10cSrcweir         if ( IsJobActive() )
1571cdf0e10cSrcweir         {
1572cdf0e10cSrcweir             mbInPrintPage = sal_True;
1573cdf0e10cSrcweir             mnCurPage++;
1574cdf0e10cSrcweir             mnCurPrintPage++;
1575cdf0e10cSrcweir         }
1576cdf0e10cSrcweir     }
1577cdf0e10cSrcweir }
1578cdf0e10cSrcweir 
1579cdf0e10cSrcweir // -----------------------------------------------------------------------
1580cdf0e10cSrcweir 
ImplEndPage()1581cdf0e10cSrcweir void Printer::ImplEndPage()
1582cdf0e10cSrcweir {
1583cdf0e10cSrcweir     if ( !IsJobActive() )
1584cdf0e10cSrcweir         return;
1585cdf0e10cSrcweir 
1586cdf0e10cSrcweir     mbInPrintPage = sal_False;
1587cdf0e10cSrcweir 
1588cdf0e10cSrcweir     if ( mpPrinter )
1589cdf0e10cSrcweir     {
1590cdf0e10cSrcweir         mpPrinter->EndPage();
1591cdf0e10cSrcweir         ImplReleaseGraphics();
1592cdf0e10cSrcweir         mbDevOutput = sal_False;
1593cdf0e10cSrcweir 
1594cdf0e10cSrcweir         mpJobGraphics = NULL;
1595cdf0e10cSrcweir         mbNewJobSetup = sal_False;
1596cdf0e10cSrcweir     }
1597cdf0e10cSrcweir }
1598cdf0e10cSrcweir 
1599cdf0e10cSrcweir // -----------------------------------------------------------------------
1600cdf0e10cSrcweir 
updatePrinters()1601cdf0e10cSrcweir void Printer::updatePrinters()
1602cdf0e10cSrcweir {
1603cdf0e10cSrcweir     ImplSVData*         pSVData = ImplGetSVData();
1604cdf0e10cSrcweir     ImplPrnQueueList*   pPrnList = pSVData->maGDIData.mpPrinterQueueList;
1605cdf0e10cSrcweir 
1606cdf0e10cSrcweir     if ( pPrnList )
1607cdf0e10cSrcweir     {
1608cdf0e10cSrcweir         ImplPrnQueueList* pNewList = new ImplPrnQueueList;
1609cdf0e10cSrcweir         pSVData->mpDefInst->GetPrinterQueueInfo( pNewList );
1610cdf0e10cSrcweir 
1611cdf0e10cSrcweir         bool bChanged = pPrnList->m_aQueueInfos.size() != pNewList->m_aQueueInfos.size();
1612cdf0e10cSrcweir         for( unsigned int i = 0; ! bChanged && i < pPrnList->m_aQueueInfos.size(); i++ )
1613cdf0e10cSrcweir         {
1614cdf0e10cSrcweir             ImplPrnQueueData& rInfo     = pPrnList->m_aQueueInfos[i];
1615cdf0e10cSrcweir             ImplPrnQueueData& rNewInfo  = pNewList->m_aQueueInfos[i];
1616cdf0e10cSrcweir             if( ! rInfo.mpSalQueueInfo || ! rNewInfo.mpSalQueueInfo || // sanity check
1617cdf0e10cSrcweir                 rInfo.mpSalQueueInfo->maPrinterName != rNewInfo.mpSalQueueInfo->maPrinterName )
1618cdf0e10cSrcweir             {
1619cdf0e10cSrcweir                 bChanged = true;
1620cdf0e10cSrcweir             }
1621cdf0e10cSrcweir         }
1622cdf0e10cSrcweir         if( bChanged )
1623cdf0e10cSrcweir         {
1624cdf0e10cSrcweir             ImplDeletePrnQueueList();
1625cdf0e10cSrcweir             pSVData->maGDIData.mpPrinterQueueList = pNewList;
1626cdf0e10cSrcweir 
1627cdf0e10cSrcweir             Application* pApp = GetpApp();
1628cdf0e10cSrcweir             if( pApp )
1629cdf0e10cSrcweir             {
1630cdf0e10cSrcweir                 DataChangedEvent aDCEvt( DATACHANGED_PRINTER );
1631cdf0e10cSrcweir                 pApp->DataChanged( aDCEvt );
1632cdf0e10cSrcweir                 pApp->NotifyAllWindows( aDCEvt );
1633cdf0e10cSrcweir             }
1634cdf0e10cSrcweir         }
1635cdf0e10cSrcweir         else
1636cdf0e10cSrcweir             delete pNewList;
1637cdf0e10cSrcweir     }
1638cdf0e10cSrcweir }
1639