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