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