19f62ea84SAndrew Rist /**************************************************************
2*635e0213SMatthias Seidel *
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
10*635e0213SMatthias Seidel *
119f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*635e0213SMatthias Seidel *
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.
19*635e0213SMatthias Seidel *
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();
98d9b868a3SMatthias Seidel 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
135d9b868a3SMatthias Seidel #define PROPERTYNAME_REDUCETRANSPARENCY rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReduceTransparency"))
136d9b868a3SMatthias Seidel #define PROPERTYNAME_REDUCEDTRANSPARENCYMODE rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedTransparencyMode"))
137d9b868a3SMatthias Seidel #define PROPERTYNAME_REDUCEGRADIENTS rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReduceGradients"))
138d9b868a3SMatthias Seidel #define PROPERTYNAME_REDUCEDGRADIENTMODE rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedGradientMode"))
139d9b868a3SMatthias Seidel #define PROPERTYNAME_REDUCEDGRADIENTSTEPCOUNT rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedGradientStepCount"))
140d9b868a3SMatthias Seidel #define PROPERTYNAME_REDUCEBITMAPS rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReduceBitmaps"))
141d9b868a3SMatthias Seidel #define PROPERTYNAME_REDUCEDBITMAPMODE rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedBitmapMode"))
142d9b868a3SMatthias Seidel #define PROPERTYNAME_REDUCEDBITMAPRESOLUTION rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedBitmapResolution"))
143d9b868a3SMatthias Seidel #define PROPERTYNAME_REDUCEDBITMAPINCLUDESTRANSPARENCY rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedBitmapIncludesTransparency"))
144d9b868a3SMatthias Seidel #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 );
151d9b868a3SMatthias Seidel
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 );
209d9b868a3SMatthias Seidel
210cdf0e10cSrcweir bSuccess = true;
211cdf0e10cSrcweir }
212cdf0e10cSrcweir }
213cdf0e10cSrcweir }
214cdf0e10cSrcweir }
215cdf0e10cSrcweir catch( Exception& )
216cdf0e10cSrcweir {
217cdf0e10cSrcweir }
218cdf0e10cSrcweir }
219cdf0e10cSrcweir }
220cdf0e10cSrcweir catch( WrappedTargetException& )
221cdf0e10cSrcweir {
222cdf0e10cSrcweir }
223d9b868a3SMatthias Seidel
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
267d9b868a3SMatthias Seidel 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 )
403d9b868a3SMatthias Seidel ImplInitPrnQueueList();
404d9b868a3SMatthias Seidel 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 );
420d9b868a3SMatthias Seidel
421cdf0e10cSrcweir if ( !pInfo->mpQueueInfo )
422cdf0e10cSrcweir pInfo->mpQueueInfo = new QueueInfo;
423d9b868a3SMatthias Seidel
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;
429d9b868a3SMatthias Seidel 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();
443d9b868a3SMatthias Seidel
444cdf0e10cSrcweir return pSVData->mpDefInst->GetDefaultPrinter();
445cdf0e10cSrcweir }
446d9b868a3SMatthias Seidel return XubString();
447cdf0e10cSrcweir }
448cdf0e10cSrcweir
449cdf0e10cSrcweir // =======================================================================
450cdf0e10cSrcweir
ImplInitData()451cdf0e10cSrcweir void Printer::ImplInitData()
452cdf0e10cSrcweir {
453d9b868a3SMatthias Seidel mbDevOutput = sal_False;
454cdf0e10cSrcweir meOutDevType = OUTDEV_PRINTER;
455cdf0e10cSrcweir mbDefPrinter = sal_False;
456d9b868a3SMatthias Seidel mnError = 0;
457d9b868a3SMatthias Seidel mnCurPage = 0;
458cdf0e10cSrcweir mnCurPrintPage = 0;
459d9b868a3SMatthias Seidel mnPageQueueSize = 0;
460d9b868a3SMatthias Seidel mnCopyCount = 1;
461cdf0e10cSrcweir mbCollateCopy = sal_False;
462d9b868a3SMatthias Seidel mbPrinting = sal_False;
463d9b868a3SMatthias Seidel mbJobActive = sal_False;
464d9b868a3SMatthias Seidel mbPrintFile = sal_False;
465cdf0e10cSrcweir mbInPrintPage = sal_False;
466cdf0e10cSrcweir mbNewJobSetup = sal_False;
467cdf0e10cSrcweir mpInfoPrinter = NULL;
468d9b868a3SMatthias Seidel mpPrinter = NULL;
469cdf0e10cSrcweir mpDisplayDev = NULL;
470cdf0e10cSrcweir mbIsQueuePrinter = sal_False;
471d9b868a3SMatthias Seidel 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();
489d9b868a3SMatthias Seidel // #i74084# update info for this specific SalPrinterQueueInfo
490d9b868a3SMatthias Seidel 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 );
515d9b868a3SMatthias Seidel 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 }
1131d9b868a3SMatthias Seidel
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 );
1140d9b868a3SMatthias Seidel
1141d9b868a3SMatthias Seidel // check portrait match
1142cdf0e10cSrcweir sal_Int64 nDX = pSetupData->mnPaperWidth - rPaperInfo.getWidth();
1143cdf0e10cSrcweir sal_Int64 nDY = pSetupData->mnPaperHeight - rPaperInfo.getHeight();
1144d9b868a3SMatthias Seidel 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 {
1295*635e0213SMatthias Seidel ImplSVData* pSVData = ImplGetSVData();
1296*635e0213SMatthias Seidel if( ! pSVData->mpPaperNames )
1297*635e0213SMatthias Seidel {
1298*635e0213SMatthias Seidel pSVData->mpPaperNames = new std::hash_map< int, rtl::OUString >();
1299*635e0213SMatthias Seidel if( ImplGetResMgr() )
1300*635e0213SMatthias Seidel {
1301*635e0213SMatthias Seidel ResStringArray aPaperStrings( VclResId( RID_STR_PAPERNAMES ) );
1302*635e0213SMatthias Seidel static const int PaperIndex[] =
1303*635e0213SMatthias Seidel {
1304*635e0213SMatthias Seidel PAPER_A0, PAPER_A1, PAPER_A2, PAPER_A3, PAPER_A4, PAPER_A5,
1305*635e0213SMatthias Seidel PAPER_B4_ISO, PAPER_B5_ISO, PAPER_LETTER, PAPER_LEGAL, PAPER_TABLOID,
1306*635e0213SMatthias Seidel 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,
1310*635e0213SMatthias Seidel PAPER_KAI32, PAPER_KAI32BIG, PAPER_B4_JIS, PAPER_B5_JIS, PAPER_B6_JIS
1311*635e0213SMatthias Seidel };
1312*635e0213SMatthias Seidel OSL_ENSURE( sal_uInt32(sizeof(PaperIndex)/sizeof(PaperIndex[0])) == aPaperStrings.Count(), "localized paper name count wrong" );
1313*635e0213SMatthias Seidel for( int i = 0; i < int(sizeof(PaperIndex)/sizeof(PaperIndex[0])); i++ )
1314*635e0213SMatthias Seidel (*pSVData->mpPaperNames)[PaperIndex[i]] = aPaperStrings.GetString(i);
1315*635e0213SMatthias Seidel }
1316*635e0213SMatthias Seidel }
1317d9b868a3SMatthias Seidel
1318*635e0213SMatthias Seidel std::hash_map<int,rtl::OUString>::const_iterator it = pSVData->mpPaperNames->find( (int)ePaper );
1319*635e0213SMatthias Seidel 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 {
1337d9b868a3SMatthias Seidel if( ! mpInfoPrinter )
1338d9b868a3SMatthias Seidel return ImplGetEmptyPaper();
1339d9b868a3SMatthias Seidel if( ! mpInfoPrinter->m_bPapersInit )
1340d9b868a3SMatthias Seidel mpInfoPrinter->InitPaperFormats( maJobSetup.ImplGetConstData() );
1341d9b868a3SMatthias Seidel if( mpInfoPrinter->m_aPaperFormats.empty() || nPaper < 0 || nPaper >= int(mpInfoPrinter->m_aPaperFormats.size()) )
1342d9b868a3SMatthias Seidel return ImplGetEmptyPaper();
1343d9b868a3SMatthias Seidel 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 {
1394d9b868a3SMatthias Seidel 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;
1432d9b868a3SMatthias Seidel 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
1529d9b868a3SMatthias Seidel mbJobActive = sal_False;
1530cdf0e10cSrcweir mbInPrintPage = sal_False;
1531cdf0e10cSrcweir mpJobGraphics = NULL;
1532cdf0e10cSrcweir
1533cdf0e10cSrcweir if ( mpPrinter )
1534cdf0e10cSrcweir {
1535cdf0e10cSrcweir mbPrinting = sal_False;
1536cdf0e10cSrcweir mnCurPage = 0;
1537d9b868a3SMatthias Seidel 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 );
1610d9b868a3SMatthias Seidel
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