19f62ea84SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 39f62ea84SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 49f62ea84SAndrew Rist * or more contributor license agreements. See the NOTICE file 59f62ea84SAndrew Rist * distributed with this work for additional information 69f62ea84SAndrew Rist * regarding copyright ownership. The ASF licenses this file 79f62ea84SAndrew Rist * to you under the Apache License, Version 2.0 (the 89f62ea84SAndrew Rist * "License"); you may not use this file except in compliance 99f62ea84SAndrew Rist * with the License. You may obtain a copy of the License at 109f62ea84SAndrew Rist * 119f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 129f62ea84SAndrew Rist * 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. 199f62ea84SAndrew Rist * 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 { 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 80cdf0e10cSrcweir static const PaperInfo& ImplGetEmptyPaper() 81cdf0e10cSrcweir { 82cdf0e10cSrcweir static PaperInfo aInfo(PAPER_USER); 83cdf0e10cSrcweir return aInfo; 84cdf0e10cSrcweir } 85cdf0e10cSrcweir } 86cdf0e10cSrcweir 87cdf0e10cSrcweir // ======================================================================= 88cdf0e10cSrcweir 89cdf0e10cSrcweir void ImplUpdateJobSetupPaper( JobSetup& rJobSetup ) 90cdf0e10cSrcweir { 91cdf0e10cSrcweir const ImplJobSetup* pConstData = rJobSetup.ImplGetConstData(); 92cdf0e10cSrcweir 93cdf0e10cSrcweir if ( !pConstData->mnPaperWidth || !pConstData->mnPaperHeight ) 94cdf0e10cSrcweir { 95cdf0e10cSrcweir if ( pConstData->mePaperFormat != PAPER_USER ) 96cdf0e10cSrcweir { 97cdf0e10cSrcweir ImplJobSetup* pData = rJobSetup.ImplGetData(); 98cdf0e10cSrcweir PaperInfo aInfo(pConstData->mePaperFormat); 99cdf0e10cSrcweir pData->mnPaperWidth = aInfo.getWidth(); 100cdf0e10cSrcweir pData->mnPaperHeight = aInfo.getHeight(); 101cdf0e10cSrcweir } 102cdf0e10cSrcweir } 103cdf0e10cSrcweir else if ( pConstData->mePaperFormat == PAPER_USER ) 104cdf0e10cSrcweir { 105cdf0e10cSrcweir Paper ePaper = ImplGetPaperFormat( pConstData->mnPaperWidth, pConstData->mnPaperHeight ); 106cdf0e10cSrcweir if ( ePaper != PAPER_USER ) 107cdf0e10cSrcweir rJobSetup.ImplGetData()->mePaperFormat = ePaper; 108cdf0e10cSrcweir } 109cdf0e10cSrcweir } 110cdf0e10cSrcweir 111cdf0e10cSrcweir // ------------------ 112cdf0e10cSrcweir // - PrinterOptions - 113cdf0e10cSrcweir // ------------------ 114cdf0e10cSrcweir 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 131cdf0e10cSrcweir PrinterOptions::~PrinterOptions() 132cdf0e10cSrcweir { 133cdf0e10cSrcweir } 134cdf0e10cSrcweir 135cdf0e10cSrcweir #define PROPERTYNAME_REDUCETRANSPARENCY rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReduceTransparency")) 136cdf0e10cSrcweir #define PROPERTYNAME_REDUCEDTRANSPARENCYMODE rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedTransparencyMode")) 137cdf0e10cSrcweir #define PROPERTYNAME_REDUCEGRADIENTS rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReduceGradients")) 138cdf0e10cSrcweir #define PROPERTYNAME_REDUCEDGRADIENTMODE rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedGradientMode")) 139cdf0e10cSrcweir #define PROPERTYNAME_REDUCEDGRADIENTSTEPCOUNT rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedGradientStepCount")) 140cdf0e10cSrcweir #define PROPERTYNAME_REDUCEBITMAPS rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReduceBitmaps")) 141cdf0e10cSrcweir #define PROPERTYNAME_REDUCEDBITMAPMODE rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedBitmapMode")) 142cdf0e10cSrcweir #define PROPERTYNAME_REDUCEDBITMAPRESOLUTION rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedBitmapResolution")) 143cdf0e10cSrcweir #define PROPERTYNAME_REDUCEDBITMAPINCLUDESTRANSPARENCY rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedBitmapIncludesTransparency")) 144cdf0e10cSrcweir #define PROPERTYNAME_CONVERTTOGREYSCALES rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ConvertToGreyscales")) 145cdf0e10cSrcweir 146cdf0e10cSrcweir bool PrinterOptions::ReadFromConfig( bool i_bFile ) 147cdf0e10cSrcweir { 148cdf0e10cSrcweir bool bSuccess = false; 149cdf0e10cSrcweir // save old state in case something goes wrong 150cdf0e10cSrcweir PrinterOptions aOldValues( *this ); 151cdf0e10cSrcweir 152cdf0e10cSrcweir // get the configuration service 153cdf0e10cSrcweir Reference< XMultiServiceFactory > xConfigProvider; 154cdf0e10cSrcweir Reference< XNameAccess > xConfigAccess; 155cdf0e10cSrcweir try 156cdf0e10cSrcweir { 157cdf0e10cSrcweir // get service provider 158cdf0e10cSrcweir Reference< XMultiServiceFactory > xSMgr( comphelper::getProcessServiceFactory() ); 159*86e1cf34SPedro Giffuni // create configuration hierarchical access name 160cdf0e10cSrcweir if( xSMgr.is() ) 161cdf0e10cSrcweir { 162cdf0e10cSrcweir try 163cdf0e10cSrcweir { 164cdf0e10cSrcweir xConfigProvider = Reference< XMultiServiceFactory >( 165cdf0e10cSrcweir xSMgr->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 166cdf0e10cSrcweir "com.sun.star.configuration.ConfigurationProvider" ))), 167cdf0e10cSrcweir UNO_QUERY ); 168cdf0e10cSrcweir if( xConfigProvider.is() ) 169cdf0e10cSrcweir { 170cdf0e10cSrcweir Sequence< Any > aArgs(1); 171cdf0e10cSrcweir PropertyValue aVal; 172cdf0e10cSrcweir aVal.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "nodepath" ) ); 173cdf0e10cSrcweir if( i_bFile ) 174cdf0e10cSrcweir aVal.Value <<= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Common/Print/Option/File" ) ); 175cdf0e10cSrcweir else 176cdf0e10cSrcweir aVal.Value <<= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Common/Print/Option/Printer" ) ); 177cdf0e10cSrcweir aArgs.getArray()[0] <<= aVal; 178cdf0e10cSrcweir xConfigAccess = Reference< XNameAccess >( 179cdf0e10cSrcweir xConfigProvider->createInstanceWithArguments( 180cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationAccess" )), aArgs ), 181cdf0e10cSrcweir UNO_QUERY ); 182cdf0e10cSrcweir if( xConfigAccess.is() ) 183cdf0e10cSrcweir { 184cdf0e10cSrcweir Reference< XPropertySet > xSet( xConfigAccess, UNO_QUERY ); 185cdf0e10cSrcweir if( xSet.is() ) 186cdf0e10cSrcweir { 187cdf0e10cSrcweir sal_Int32 nValue = 0; 188cdf0e10cSrcweir sal_Bool bValue = 0; 189cdf0e10cSrcweir if( xSet->getPropertyValue(PROPERTYNAME_REDUCETRANSPARENCY) >>= bValue ) 190cdf0e10cSrcweir SetReduceTransparency( bValue ); 191cdf0e10cSrcweir if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDTRANSPARENCYMODE) >>= nValue ) 192cdf0e10cSrcweir SetReducedTransparencyMode( (PrinterTransparencyMode)nValue ); 193cdf0e10cSrcweir if( xSet->getPropertyValue(PROPERTYNAME_REDUCEGRADIENTS) >>= bValue ) 194cdf0e10cSrcweir SetReduceGradients( bValue ); 195cdf0e10cSrcweir if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDGRADIENTMODE) >>= nValue ) 196cdf0e10cSrcweir SetReducedGradientMode( (PrinterGradientMode)nValue ); 197cdf0e10cSrcweir if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDGRADIENTSTEPCOUNT) >>= nValue ) 198cdf0e10cSrcweir SetReducedGradientStepCount( (sal_uInt16)nValue ); 199cdf0e10cSrcweir if( xSet->getPropertyValue(PROPERTYNAME_REDUCEBITMAPS) >>= bValue ) 200cdf0e10cSrcweir SetReduceBitmaps( bValue ); 201cdf0e10cSrcweir if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDBITMAPMODE) >>= nValue ) 202cdf0e10cSrcweir SetReducedBitmapMode( (PrinterBitmapMode)nValue ); 203cdf0e10cSrcweir if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDBITMAPRESOLUTION) >>= nValue ) 204cdf0e10cSrcweir SetReducedBitmapResolution( (sal_uInt16)nValue ); 205cdf0e10cSrcweir if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDBITMAPINCLUDESTRANSPARENCY) >>= bValue ) 206cdf0e10cSrcweir SetReducedBitmapIncludesTransparency( bValue ); 207cdf0e10cSrcweir if( xSet->getPropertyValue(PROPERTYNAME_CONVERTTOGREYSCALES) >>= bValue ) 208cdf0e10cSrcweir SetConvertToGreyscales( bValue ); 209cdf0e10cSrcweir 210cdf0e10cSrcweir bSuccess = true; 211cdf0e10cSrcweir } 212cdf0e10cSrcweir } 213cdf0e10cSrcweir } 214cdf0e10cSrcweir } 215cdf0e10cSrcweir catch( Exception& ) 216cdf0e10cSrcweir { 217cdf0e10cSrcweir } 218cdf0e10cSrcweir } 219cdf0e10cSrcweir } 220cdf0e10cSrcweir catch( WrappedTargetException& ) 221cdf0e10cSrcweir { 222cdf0e10cSrcweir } 223cdf0e10cSrcweir 224cdf0e10cSrcweir if( ! bSuccess ) 225cdf0e10cSrcweir *this = aOldValues; 226cdf0e10cSrcweir return bSuccess; 227cdf0e10cSrcweir } 228cdf0e10cSrcweir 229cdf0e10cSrcweir void Printer::SetPrinterOptions( const PrinterOptions& i_rOptions ) 230cdf0e10cSrcweir { 231cdf0e10cSrcweir *mpPrinterOptions = i_rOptions; 232cdf0e10cSrcweir } 233cdf0e10cSrcweir 234cdf0e10cSrcweir // ------------- 235cdf0e10cSrcweir // - QueueInfo - 236cdf0e10cSrcweir // ------------- 237cdf0e10cSrcweir 238cdf0e10cSrcweir QueueInfo::QueueInfo() 239cdf0e10cSrcweir { 240cdf0e10cSrcweir mnStatus = 0; 241cdf0e10cSrcweir mnJobs = 0; 242cdf0e10cSrcweir } 243cdf0e10cSrcweir 244cdf0e10cSrcweir // ----------------------------------------------------------------------- 245cdf0e10cSrcweir 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 258cdf0e10cSrcweir QueueInfo::~QueueInfo() 259cdf0e10cSrcweir { 260cdf0e10cSrcweir } 261cdf0e10cSrcweir 262cdf0e10cSrcweir // ----------------------------------------------------------------------- 263cdf0e10cSrcweir 264cdf0e10cSrcweir bool QueueInfo::operator==( const QueueInfo& rInfo ) const 265cdf0e10cSrcweir { 266cdf0e10cSrcweir return 267cdf0e10cSrcweir maPrinterName == rInfo.maPrinterName && 268cdf0e10cSrcweir maDriver == rInfo.maDriver && 269cdf0e10cSrcweir maLocation == rInfo.maLocation && 270cdf0e10cSrcweir maComment == rInfo.maComment && 271cdf0e10cSrcweir mnStatus == rInfo.mnStatus && 272cdf0e10cSrcweir mnJobs == rInfo.mnJobs; 273cdf0e10cSrcweir } 274cdf0e10cSrcweir 275cdf0e10cSrcweir // ----------------------------------------------------------------------- 276cdf0e10cSrcweir 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 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 309cdf0e10cSrcweir SalPrinterQueueInfo::SalPrinterQueueInfo() 310cdf0e10cSrcweir { 311cdf0e10cSrcweir mnStatus = 0; 312cdf0e10cSrcweir mnJobs = QUEUE_JOBS_DONTKNOW; 313cdf0e10cSrcweir mpSysData = NULL; 314cdf0e10cSrcweir } 315cdf0e10cSrcweir 316cdf0e10cSrcweir // ----------------------------------------------------------------------- 317cdf0e10cSrcweir 318cdf0e10cSrcweir SalPrinterQueueInfo::~SalPrinterQueueInfo() 319cdf0e10cSrcweir { 320cdf0e10cSrcweir } 321cdf0e10cSrcweir 322cdf0e10cSrcweir // ----------------------------------------------------------------------- 323cdf0e10cSrcweir 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 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 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 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 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 399cdf0e10cSrcweir const std::vector<rtl::OUString>& Printer::GetPrinterQueues() 400cdf0e10cSrcweir { 401cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 402cdf0e10cSrcweir if ( !pSVData->maGDIData.mpPrinterQueueList ) 403cdf0e10cSrcweir ImplInitPrnQueueList(); 404cdf0e10cSrcweir return pSVData->maGDIData.mpPrinterQueueList->m_aPrinterList; 405cdf0e10cSrcweir } 406cdf0e10cSrcweir 407cdf0e10cSrcweir // ----------------------------------------------------------------------- 408cdf0e10cSrcweir const QueueInfo* Printer::GetQueueInfo( const String& rPrinterName, bool bStatusUpdate ) 409cdf0e10cSrcweir { 410cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 411cdf0e10cSrcweir 412cdf0e10cSrcweir if ( !pSVData->maGDIData.mpPrinterQueueList ) 413cdf0e10cSrcweir ImplInitPrnQueueList(); 414cdf0e10cSrcweir 415cdf0e10cSrcweir ImplPrnQueueData* pInfo = pSVData->maGDIData.mpPrinterQueueList->Get( rPrinterName ); 416cdf0e10cSrcweir if( pInfo ) 417cdf0e10cSrcweir { 418cdf0e10cSrcweir if( !pInfo->mpQueueInfo || bStatusUpdate ) 419cdf0e10cSrcweir pSVData->mpDefInst->GetPrinterQueueState( pInfo->mpSalQueueInfo ); 420cdf0e10cSrcweir 421cdf0e10cSrcweir if ( !pInfo->mpQueueInfo ) 422cdf0e10cSrcweir pInfo->mpQueueInfo = new QueueInfo; 423cdf0e10cSrcweir 424cdf0e10cSrcweir pInfo->mpQueueInfo->maPrinterName = pInfo->mpSalQueueInfo->maPrinterName; 425cdf0e10cSrcweir pInfo->mpQueueInfo->maDriver = pInfo->mpSalQueueInfo->maDriver; 426cdf0e10cSrcweir pInfo->mpQueueInfo->maLocation = pInfo->mpSalQueueInfo->maLocation; 427cdf0e10cSrcweir pInfo->mpQueueInfo->maComment = pInfo->mpSalQueueInfo->maComment; 428cdf0e10cSrcweir pInfo->mpQueueInfo->mnStatus = pInfo->mpSalQueueInfo->mnStatus; 429cdf0e10cSrcweir pInfo->mpQueueInfo->mnJobs = pInfo->mpSalQueueInfo->mnJobs; 430cdf0e10cSrcweir return pInfo->mpQueueInfo; 431cdf0e10cSrcweir } 432cdf0e10cSrcweir return NULL; 433cdf0e10cSrcweir } 434cdf0e10cSrcweir 435cdf0e10cSrcweir // ----------------------------------------------------------------------- 436cdf0e10cSrcweir 437cdf0e10cSrcweir XubString Printer::GetDefaultPrinterName() 438cdf0e10cSrcweir { 439cdf0e10cSrcweir static const char* pEnv = getenv( "SAL_DISABLE_DEFAULTPRINTER" ); 440cdf0e10cSrcweir if( !pEnv || !*pEnv ) 441cdf0e10cSrcweir { 442cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 443cdf0e10cSrcweir 444cdf0e10cSrcweir return pSVData->mpDefInst->GetDefaultPrinter(); 445cdf0e10cSrcweir } 446cdf0e10cSrcweir return XubString(); 447cdf0e10cSrcweir } 448cdf0e10cSrcweir 449cdf0e10cSrcweir // ======================================================================= 450cdf0e10cSrcweir 451cdf0e10cSrcweir void Printer::ImplInitData() 452cdf0e10cSrcweir { 453cdf0e10cSrcweir mbDevOutput = sal_False; 454cdf0e10cSrcweir meOutDevType = OUTDEV_PRINTER; 455cdf0e10cSrcweir mbDefPrinter = sal_False; 456cdf0e10cSrcweir mnError = 0; 457cdf0e10cSrcweir mnCurPage = 0; 458cdf0e10cSrcweir mnCurPrintPage = 0; 459cdf0e10cSrcweir mnPageQueueSize = 0; 460cdf0e10cSrcweir mnCopyCount = 1; 461cdf0e10cSrcweir mbCollateCopy = sal_False; 462cdf0e10cSrcweir mbPrinting = sal_False; 463cdf0e10cSrcweir mbJobActive = sal_False; 464cdf0e10cSrcweir mbPrintFile = sal_False; 465cdf0e10cSrcweir mbInPrintPage = sal_False; 466cdf0e10cSrcweir mbNewJobSetup = sal_False; 467cdf0e10cSrcweir mpInfoPrinter = NULL; 468cdf0e10cSrcweir mpPrinter = NULL; 469cdf0e10cSrcweir mpDisplayDev = NULL; 470cdf0e10cSrcweir mbIsQueuePrinter = sal_False; 471cdf0e10cSrcweir mpPrinterOptions = new PrinterOptions; 472cdf0e10cSrcweir 473cdf0e10cSrcweir // Printer in die Liste eintragen 474cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 475cdf0e10cSrcweir mpNext = pSVData->maGDIData.mpFirstPrinter; 476cdf0e10cSrcweir mpPrev = NULL; 477cdf0e10cSrcweir if ( mpNext ) 478cdf0e10cSrcweir mpNext->mpPrev = this; 479cdf0e10cSrcweir else 480cdf0e10cSrcweir pSVData->maGDIData.mpLastPrinter = this; 481cdf0e10cSrcweir pSVData->maGDIData.mpFirstPrinter = this; 482cdf0e10cSrcweir } 483cdf0e10cSrcweir 484cdf0e10cSrcweir // ----------------------------------------------------------------------- 485cdf0e10cSrcweir 486cdf0e10cSrcweir void Printer::ImplInit( SalPrinterQueueInfo* pInfo ) 487cdf0e10cSrcweir { 488cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 489cdf0e10cSrcweir // #i74084# update info for this specific SalPrinterQueueInfo 490cdf0e10cSrcweir pSVData->mpDefInst->GetPrinterQueueState( pInfo ); 491cdf0e10cSrcweir 492cdf0e10cSrcweir // Testen, ob Treiber ueberhaupt mit dem JobSetup uebereinstimmt 493cdf0e10cSrcweir ImplJobSetup* pJobSetup = maJobSetup.ImplGetData(); 494cdf0e10cSrcweir 495cdf0e10cSrcweir if ( pJobSetup->mpDriverData ) 496cdf0e10cSrcweir { 497cdf0e10cSrcweir if ( (pJobSetup->maPrinterName != pInfo->maPrinterName) || 498cdf0e10cSrcweir (pJobSetup->maDriver != pInfo->maDriver) ) 499cdf0e10cSrcweir { 500cdf0e10cSrcweir rtl_freeMemory( pJobSetup->mpDriverData ); 501cdf0e10cSrcweir pJobSetup->mpDriverData = NULL; 502cdf0e10cSrcweir pJobSetup->mnDriverDataLen = 0; 503cdf0e10cSrcweir } 504cdf0e10cSrcweir } 505cdf0e10cSrcweir 506cdf0e10cSrcweir // Printernamen merken 507cdf0e10cSrcweir maPrinterName = pInfo->maPrinterName; 508cdf0e10cSrcweir maDriver = pInfo->maDriver; 509cdf0e10cSrcweir 510cdf0e10cSrcweir // In JobSetup den Printernamen eintragen 511cdf0e10cSrcweir pJobSetup->maPrinterName = maPrinterName; 512cdf0e10cSrcweir pJobSetup->maDriver = maDriver; 513cdf0e10cSrcweir 514cdf0e10cSrcweir mpInfoPrinter = pSVData->mpDefInst->CreateInfoPrinter( pInfo, pJobSetup ); 515cdf0e10cSrcweir mpPrinter = NULL; 516cdf0e10cSrcweir mpJobGraphics = NULL; 517cdf0e10cSrcweir ImplUpdateJobSetupPaper( maJobSetup ); 518cdf0e10cSrcweir 519cdf0e10cSrcweir if ( !mpInfoPrinter ) 520cdf0e10cSrcweir { 521cdf0e10cSrcweir ImplInitDisplay( NULL ); 522cdf0e10cSrcweir return; 523cdf0e10cSrcweir } 524cdf0e10cSrcweir 525cdf0e10cSrcweir // we need a graphics 526cdf0e10cSrcweir if ( !ImplGetGraphics() ) 527cdf0e10cSrcweir { 528cdf0e10cSrcweir ImplInitDisplay( NULL ); 529cdf0e10cSrcweir return; 530cdf0e10cSrcweir } 531cdf0e10cSrcweir 532cdf0e10cSrcweir // Daten initialisieren 533cdf0e10cSrcweir ImplUpdatePageData(); 534cdf0e10cSrcweir mpFontList = new ImplDevFontList(); 535cdf0e10cSrcweir mpFontCache = new ImplFontCache( sal_True ); 536cdf0e10cSrcweir mpGraphics->GetDevFontList( mpFontList ); 537cdf0e10cSrcweir } 538cdf0e10cSrcweir 539cdf0e10cSrcweir // ----------------------------------------------------------------------- 540cdf0e10cSrcweir 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 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 { 571*86e1cf34SPedro 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 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 642cdf0e10cSrcweir void Printer::ImplUpdateFontList() 643cdf0e10cSrcweir { 644cdf0e10cSrcweir ImplUpdateFontData( sal_True ); 645cdf0e10cSrcweir } 646cdf0e10cSrcweir 647cdf0e10cSrcweir // ----------------------------------------------------------------------- 648cdf0e10cSrcweir 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 665cdf0e10cSrcweir Printer::Printer( const Window* pWindow ) 666cdf0e10cSrcweir { 667cdf0e10cSrcweir ImplInitData(); 668cdf0e10cSrcweir ImplInitDisplay( pWindow ); 669cdf0e10cSrcweir } 670cdf0e10cSrcweir 671cdf0e10cSrcweir // ----------------------------------------------------------------------- 672cdf0e10cSrcweir 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 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 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 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 // ----------------------------------------------------------------------- 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 780cdf0e10cSrcweir 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 793cdf0e10cSrcweir 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 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 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 883cdf0e10cSrcweir sal_Bool Printer::SetPrinterProps( const Printer* pPrinter ) 884cdf0e10cSrcweir { 885cdf0e10cSrcweir if ( IsJobActive() || IsPrinting() ) 886cdf0e10cSrcweir return sal_False; 887cdf0e10cSrcweir 888cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 889cdf0e10cSrcweir 890cdf0e10cSrcweir mbDefPrinter = pPrinter->mbDefPrinter; 891cdf0e10cSrcweir maPrintFile = pPrinter->maPrintFile; 892cdf0e10cSrcweir mbPrintFile = pPrinter->mbPrintFile; 893cdf0e10cSrcweir mnCopyCount = pPrinter->mnCopyCount; 894cdf0e10cSrcweir mbCollateCopy = pPrinter->mbCollateCopy; 895cdf0e10cSrcweir mnPageQueueSize = pPrinter->mnPageQueueSize; 896cdf0e10cSrcweir *mpPrinterOptions = *pPrinter->mpPrinterOptions; 897cdf0e10cSrcweir 898cdf0e10cSrcweir if ( pPrinter->IsDisplayPrinter() ) 899cdf0e10cSrcweir { 900cdf0e10cSrcweir // Alten Printer zerstoeren 901cdf0e10cSrcweir if ( !IsDisplayPrinter() ) 902cdf0e10cSrcweir { 903cdf0e10cSrcweir ImplReleaseGraphics(); 904cdf0e10cSrcweir pSVData->mpDefInst->DestroyInfoPrinter( mpInfoPrinter ); 905cdf0e10cSrcweir if ( mpFontEntry ) 906cdf0e10cSrcweir { 907cdf0e10cSrcweir mpFontCache->Release( mpFontEntry ); 908cdf0e10cSrcweir mpFontEntry = NULL; 909cdf0e10cSrcweir } 910cdf0e10cSrcweir if ( mpGetDevFontList ) 911cdf0e10cSrcweir { 912cdf0e10cSrcweir delete mpGetDevFontList; 913cdf0e10cSrcweir mpGetDevFontList = NULL; 914cdf0e10cSrcweir } 915cdf0e10cSrcweir if ( mpGetDevSizeList ) 916cdf0e10cSrcweir { 917cdf0e10cSrcweir delete mpGetDevSizeList; 918cdf0e10cSrcweir mpGetDevSizeList = NULL; 919cdf0e10cSrcweir } 920cdf0e10cSrcweir // clean up font list 921cdf0e10cSrcweir delete mpFontCache; 922cdf0e10cSrcweir delete mpFontList; 923cdf0e10cSrcweir mpFontCache = NULL; 924cdf0e10cSrcweir mpFontList = NULL; 925cdf0e10cSrcweir 926cdf0e10cSrcweir mbInitFont = sal_True; 927cdf0e10cSrcweir mbNewFont = sal_True; 928cdf0e10cSrcweir mpInfoPrinter = NULL; 929cdf0e10cSrcweir } 930cdf0e10cSrcweir 931cdf0e10cSrcweir // Neuen Printer bauen 932cdf0e10cSrcweir ImplInitDisplay( NULL ); 933cdf0e10cSrcweir return sal_True; 934cdf0e10cSrcweir } 935cdf0e10cSrcweir 936cdf0e10cSrcweir // Alten Printer zerstoeren? 937cdf0e10cSrcweir if ( GetName() != pPrinter->GetName() ) 938cdf0e10cSrcweir { 939cdf0e10cSrcweir ImplReleaseGraphics(); 940cdf0e10cSrcweir if ( mpDisplayDev ) 941cdf0e10cSrcweir { 942cdf0e10cSrcweir delete mpDisplayDev; 943cdf0e10cSrcweir mpDisplayDev = NULL; 944cdf0e10cSrcweir } 945cdf0e10cSrcweir else 946cdf0e10cSrcweir { 947cdf0e10cSrcweir pSVData->mpDefInst->DestroyInfoPrinter( mpInfoPrinter ); 948cdf0e10cSrcweir 949cdf0e10cSrcweir if ( mpFontEntry ) 950cdf0e10cSrcweir { 951cdf0e10cSrcweir mpFontCache->Release( mpFontEntry ); 952cdf0e10cSrcweir mpFontEntry = NULL; 953cdf0e10cSrcweir } 954cdf0e10cSrcweir if ( mpGetDevFontList ) 955cdf0e10cSrcweir { 956cdf0e10cSrcweir delete mpGetDevFontList; 957cdf0e10cSrcweir mpGetDevFontList = NULL; 958cdf0e10cSrcweir } 959cdf0e10cSrcweir if ( mpGetDevSizeList ) 960cdf0e10cSrcweir { 961cdf0e10cSrcweir delete mpGetDevSizeList; 962cdf0e10cSrcweir mpGetDevSizeList = NULL; 963cdf0e10cSrcweir } 964cdf0e10cSrcweir delete mpFontCache; 965cdf0e10cSrcweir delete mpFontList; 966cdf0e10cSrcweir mpFontCache = NULL; 967cdf0e10cSrcweir mpFontList = NULL; 968cdf0e10cSrcweir mbInitFont = sal_True; 969cdf0e10cSrcweir mbNewFont = sal_True; 970cdf0e10cSrcweir mpInfoPrinter = NULL; 971cdf0e10cSrcweir } 972cdf0e10cSrcweir 973cdf0e10cSrcweir // Neuen Printer bauen 974cdf0e10cSrcweir XubString aDriver = pPrinter->GetDriverName(); 975cdf0e10cSrcweir SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( pPrinter->GetName(), &aDriver ); 976cdf0e10cSrcweir if ( pInfo ) 977cdf0e10cSrcweir { 978cdf0e10cSrcweir ImplInit( pInfo ); 979cdf0e10cSrcweir SetJobSetup( pPrinter->GetJobSetup() ); 980cdf0e10cSrcweir } 981cdf0e10cSrcweir else 982cdf0e10cSrcweir ImplInitDisplay( NULL ); 983cdf0e10cSrcweir } 984cdf0e10cSrcweir else 985cdf0e10cSrcweir SetJobSetup( pPrinter->GetJobSetup() ); 986cdf0e10cSrcweir 987cdf0e10cSrcweir return sal_False; 988cdf0e10cSrcweir } 989cdf0e10cSrcweir 990cdf0e10cSrcweir // ----------------------------------------------------------------------- 991cdf0e10cSrcweir 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 1029cdf0e10cSrcweir Orientation Printer::GetOrientation() const 1030cdf0e10cSrcweir { 1031cdf0e10cSrcweir return maJobSetup.ImplGetConstData()->meOrientation; 1032cdf0e10cSrcweir } 1033cdf0e10cSrcweir 1034cdf0e10cSrcweir // ----------------------------------------------------------------------- 1035cdf0e10cSrcweir 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 1074cdf0e10cSrcweir 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 1082cdf0e10cSrcweir void Printer::ImplFindPaperFormatForUserSize( JobSetup& aJobSetup, bool bMatchNearest ) 1083cdf0e10cSrcweir { 1084cdf0e10cSrcweir ImplJobSetup* pSetupData = aJobSetup.ImplGetData(); 1085cdf0e10cSrcweir 1086cdf0e10cSrcweir int nLandscapeAngle = GetLandscapeAngle(); 1087cdf0e10cSrcweir int nPaperCount = GetPaperInfoCount(); 1088cdf0e10cSrcweir bool bFound = false; 1089cdf0e10cSrcweir 1090cdf0e10cSrcweir PaperInfo aInfo(pSetupData->mnPaperWidth, pSetupData->mnPaperHeight); 1091cdf0e10cSrcweir 1092cdf0e10cSrcweir // Alle Papierformate vergleichen und ein passendes raussuchen 1093cdf0e10cSrcweir for ( int i = 0; i < nPaperCount; i++ ) 1094cdf0e10cSrcweir { 1095cdf0e10cSrcweir const PaperInfo& rPaperInfo = GetPaperInfo( i ); 1096cdf0e10cSrcweir 1097cdf0e10cSrcweir if ( aInfo.sloppyEqual(rPaperInfo) ) 1098cdf0e10cSrcweir { 1099cdf0e10cSrcweir pSetupData->mePaperFormat = ImplGetPaperFormat( rPaperInfo.getWidth(), 1100cdf0e10cSrcweir rPaperInfo.getHeight() ); 1101cdf0e10cSrcweir pSetupData->meOrientation = ORIENTATION_PORTRAIT; 1102cdf0e10cSrcweir bFound = true; 1103cdf0e10cSrcweir break; 1104cdf0e10cSrcweir } 1105cdf0e10cSrcweir } 1106cdf0e10cSrcweir 1107cdf0e10cSrcweir // If the printer supports landscape orientation, check paper sizes again 1108cdf0e10cSrcweir // with landscape orientation. This is necessary as a printer driver provides 1109cdf0e10cSrcweir // all paper sizes with portrait orientation only!! 1110cdf0e10cSrcweir if ( pSetupData->mePaperFormat == PAPER_USER && 1111cdf0e10cSrcweir nLandscapeAngle != 0 && 1112cdf0e10cSrcweir HasSupport( SUPPORT_SET_ORIENTATION )) 1113cdf0e10cSrcweir { 1114cdf0e10cSrcweir 1115cdf0e10cSrcweir PaperInfo aRotatedInfo(pSetupData->mnPaperHeight, pSetupData->mnPaperWidth); 1116cdf0e10cSrcweir 1117cdf0e10cSrcweir for ( int i = 0; i < nPaperCount; i++ ) 1118cdf0e10cSrcweir { 1119cdf0e10cSrcweir const PaperInfo& rPaperInfo = GetPaperInfo( i ); 1120cdf0e10cSrcweir 1121cdf0e10cSrcweir if ( aRotatedInfo.sloppyEqual( rPaperInfo ) ) 1122cdf0e10cSrcweir { 1123cdf0e10cSrcweir pSetupData->mePaperFormat = ImplGetPaperFormat( rPaperInfo.getWidth(), 1124cdf0e10cSrcweir rPaperInfo.getHeight() ); 1125cdf0e10cSrcweir pSetupData->meOrientation = ORIENTATION_LANDSCAPE; 1126cdf0e10cSrcweir bFound = true; 1127cdf0e10cSrcweir break; 1128cdf0e10cSrcweir } 1129cdf0e10cSrcweir } 1130cdf0e10cSrcweir } 1131cdf0e10cSrcweir 1132cdf0e10cSrcweir if( ! bFound && bMatchNearest ) 1133cdf0e10cSrcweir { 1134cdf0e10cSrcweir sal_Int64 nBestMatch = SAL_MAX_INT64; 1135cdf0e10cSrcweir int nBestIndex = 0; 1136cdf0e10cSrcweir Orientation eBestOrientation = ORIENTATION_PORTRAIT; 1137cdf0e10cSrcweir for( int i = 0; i < nPaperCount; i++ ) 1138cdf0e10cSrcweir { 1139cdf0e10cSrcweir const PaperInfo& rPaperInfo = GetPaperInfo( i ); 1140cdf0e10cSrcweir 1141cdf0e10cSrcweir // check protrait match 1142cdf0e10cSrcweir sal_Int64 nDX = pSetupData->mnPaperWidth - rPaperInfo.getWidth(); 1143cdf0e10cSrcweir sal_Int64 nDY = pSetupData->mnPaperHeight - rPaperInfo.getHeight(); 1144cdf0e10cSrcweir sal_Int64 nMatch = nDX*nDX + nDY*nDY; 1145cdf0e10cSrcweir if( nMatch < nBestMatch ) 1146cdf0e10cSrcweir { 1147cdf0e10cSrcweir nBestMatch = nMatch; 1148cdf0e10cSrcweir nBestIndex = i; 1149cdf0e10cSrcweir eBestOrientation = ORIENTATION_PORTRAIT; 1150cdf0e10cSrcweir } 1151cdf0e10cSrcweir 1152cdf0e10cSrcweir // check landscape match 1153cdf0e10cSrcweir nDX = pSetupData->mnPaperWidth - rPaperInfo.getHeight(); 1154cdf0e10cSrcweir nDY = pSetupData->mnPaperHeight - rPaperInfo.getWidth(); 1155cdf0e10cSrcweir nMatch = nDX*nDX + nDY*nDY; 1156cdf0e10cSrcweir if( nMatch < nBestMatch ) 1157cdf0e10cSrcweir { 1158cdf0e10cSrcweir nBestMatch = nMatch; 1159cdf0e10cSrcweir nBestIndex = i; 1160cdf0e10cSrcweir eBestOrientation = ORIENTATION_LANDSCAPE; 1161cdf0e10cSrcweir } 1162cdf0e10cSrcweir } 1163cdf0e10cSrcweir const PaperInfo& rBestInfo = GetPaperInfo( nBestIndex ); 1164cdf0e10cSrcweir pSetupData->mePaperFormat = ImplGetPaperFormat( rBestInfo.getWidth(), 1165cdf0e10cSrcweir rBestInfo.getHeight() ); 1166cdf0e10cSrcweir pSetupData->meOrientation = eBestOrientation; 1167cdf0e10cSrcweir } 1168cdf0e10cSrcweir } 1169cdf0e10cSrcweir 1170cdf0e10cSrcweir // ----------------------------------------------------------------------- 1171cdf0e10cSrcweir 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 1217cdf0e10cSrcweir sal_Bool Printer::SetPaperSizeUser( const Size& rSize ) 1218cdf0e10cSrcweir { 1219cdf0e10cSrcweir return SetPaperSizeUser( rSize, false ); 1220cdf0e10cSrcweir } 1221cdf0e10cSrcweir 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 1282cdf0e10cSrcweir 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 1293cdf0e10cSrcweir rtl::OUString Printer::GetPaperName( Paper ePaper ) 1294cdf0e10cSrcweir { 1295cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 1296cdf0e10cSrcweir if( ! pSVData->mpPaperNames ) 1297cdf0e10cSrcweir { 1298cdf0e10cSrcweir pSVData->mpPaperNames = new std::hash_map< int, rtl::OUString >(); 1299cdf0e10cSrcweir if( ImplGetResMgr() ) 1300cdf0e10cSrcweir { 1301cdf0e10cSrcweir ResStringArray aPaperStrings( VclResId( RID_STR_PAPERNAMES ) ); 1302cdf0e10cSrcweir static const int PaperIndex[] = 1303cdf0e10cSrcweir { 1304cdf0e10cSrcweir PAPER_A0, PAPER_A1, PAPER_A2, PAPER_A3, PAPER_A4, PAPER_A5, 1305cdf0e10cSrcweir PAPER_B4_ISO, PAPER_B5_ISO, PAPER_LETTER, PAPER_LEGAL, PAPER_TABLOID, 1306cdf0e10cSrcweir PAPER_USER, PAPER_B6_ISO, PAPER_ENV_C4, PAPER_ENV_C5, PAPER_ENV_C6, PAPER_ENV_C65, 1307cdf0e10cSrcweir PAPER_ENV_DL, PAPER_SLIDE_DIA, PAPER_SCREEN, PAPER_C, PAPER_D, PAPER_E, 1308cdf0e10cSrcweir PAPER_EXECUTIVE, PAPER_FANFOLD_LEGAL_DE, PAPER_ENV_MONARCH, PAPER_ENV_PERSONAL, 1309cdf0e10cSrcweir PAPER_ENV_9, PAPER_ENV_10, PAPER_ENV_11, PAPER_ENV_12, PAPER_KAI16, 1310cdf0e10cSrcweir PAPER_KAI32, PAPER_KAI32BIG, PAPER_B4_JIS, PAPER_B5_JIS, PAPER_B6_JIS 1311cdf0e10cSrcweir }; 1312cdf0e10cSrcweir OSL_ENSURE( sal_uInt32(sizeof(PaperIndex)/sizeof(PaperIndex[0])) == aPaperStrings.Count(), "localized paper name count wrong" ); 1313cdf0e10cSrcweir for( int i = 0; i < int(sizeof(PaperIndex)/sizeof(PaperIndex[0])); i++ ) 1314cdf0e10cSrcweir (*pSVData->mpPaperNames)[PaperIndex[i]] = aPaperStrings.GetString(i); 1315cdf0e10cSrcweir } 1316cdf0e10cSrcweir } 1317cdf0e10cSrcweir 1318cdf0e10cSrcweir std::hash_map<int,rtl::OUString>::const_iterator it = pSVData->mpPaperNames->find( (int)ePaper ); 1319cdf0e10cSrcweir return (it != pSVData->mpPaperNames->end()) ? it->second : rtl::OUString(); 1320cdf0e10cSrcweir } 1321cdf0e10cSrcweir 1322cdf0e10cSrcweir // ----------------------------------------------------------------------- 1323cdf0e10cSrcweir 1324cdf0e10cSrcweir 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 1335cdf0e10cSrcweir const PaperInfo& Printer::GetPaperInfo( int nPaper ) const 1336cdf0e10cSrcweir { 1337cdf0e10cSrcweir if( ! mpInfoPrinter ) 1338cdf0e10cSrcweir return ImplGetEmptyPaper(); 1339cdf0e10cSrcweir if( ! mpInfoPrinter->m_bPapersInit ) 1340cdf0e10cSrcweir mpInfoPrinter->InitPaperFormats( maJobSetup.ImplGetConstData() ); 1341cdf0e10cSrcweir if( mpInfoPrinter->m_aPaperFormats.empty() || nPaper < 0 || nPaper >= int(mpInfoPrinter->m_aPaperFormats.size()) ) 1342cdf0e10cSrcweir return ImplGetEmptyPaper(); 1343cdf0e10cSrcweir return mpInfoPrinter->m_aPaperFormats[nPaper]; 1344cdf0e10cSrcweir } 1345cdf0e10cSrcweir 1346cdf0e10cSrcweir // ----------------------------------------------------------------------- 1347cdf0e10cSrcweir 1348cdf0e10cSrcweir DuplexMode Printer::GetDuplexMode() const 1349cdf0e10cSrcweir { 1350cdf0e10cSrcweir return maJobSetup.ImplGetConstData()->meDuplexMode; 1351cdf0e10cSrcweir } 1352cdf0e10cSrcweir 1353cdf0e10cSrcweir // ----------------------------------------------------------------------- 1354cdf0e10cSrcweir 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 1392cdf0e10cSrcweir int Printer::GetLandscapeAngle() const 1393cdf0e10cSrcweir { 1394cdf0e10cSrcweir return mpInfoPrinter ? mpInfoPrinter->GetLandscapeAngle( maJobSetup.ImplGetConstData() ) : 900; 1395cdf0e10cSrcweir } 1396cdf0e10cSrcweir 1397cdf0e10cSrcweir // ----------------------------------------------------------------------- 1398cdf0e10cSrcweir 1399cdf0e10cSrcweir Paper Printer::GetPaper() const 1400cdf0e10cSrcweir { 1401cdf0e10cSrcweir return maJobSetup.ImplGetConstData()->mePaperFormat; 1402cdf0e10cSrcweir } 1403cdf0e10cSrcweir 1404cdf0e10cSrcweir // ----------------------------------------------------------------------- 1405cdf0e10cSrcweir 1406cdf0e10cSrcweir 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 1416cdf0e10cSrcweir 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 1429cdf0e10cSrcweir sal_Bool Printer::SetCopyCount( sal_uInt16 nCopy, sal_Bool bCollate ) 1430cdf0e10cSrcweir { 1431cdf0e10cSrcweir mnCopyCount = nCopy; 1432cdf0e10cSrcweir mbCollateCopy = bCollate; 1433cdf0e10cSrcweir return sal_True; 1434cdf0e10cSrcweir } 1435cdf0e10cSrcweir 1436cdf0e10cSrcweir // ----------------------------------------------------------------------- 1437cdf0e10cSrcweir 1438cdf0e10cSrcweir void Printer::Error() 1439cdf0e10cSrcweir { 1440cdf0e10cSrcweir maErrorHdl.Call( this ); 1441cdf0e10cSrcweir } 1442cdf0e10cSrcweir 1443cdf0e10cSrcweir // ----------------------------------------------------------------------- 1444cdf0e10cSrcweir 1445cdf0e10cSrcweir 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 1467cdf0e10cSrcweir void Printer::ImplEndPrint() 1468cdf0e10cSrcweir { 1469cdf0e10cSrcweir mbPrinting = sal_False; 1470cdf0e10cSrcweir mnCurPrintPage = 0; 1471cdf0e10cSrcweir maJobName.Erase(); 1472cdf0e10cSrcweir } 1473cdf0e10cSrcweir 1474cdf0e10cSrcweir // ----------------------------------------------------------------------- 1475cdf0e10cSrcweir 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 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(); 1510cdf0e10cSrcweir // Hier den Drucker nicht asyncron zerstoeren, da es 1511cdf0e10cSrcweir // W95 nicht verkraftet, wenn gleichzeitig gedruckt wird 1512cdf0e10cSrcweir // und ein Druckerobjekt zerstoert wird 1513cdf0e10cSrcweir ImplGetSVData()->mpDefInst->DestroyPrinter( mpPrinter ); 1514cdf0e10cSrcweir mpPrinter = NULL; 1515cdf0e10cSrcweir } 1516cdf0e10cSrcweir 1517cdf0e10cSrcweir return bRet; 1518cdf0e10cSrcweir } 1519cdf0e10cSrcweir 1520cdf0e10cSrcweir // ----------------------------------------------------------------------- 1521cdf0e10cSrcweir 1522cdf0e10cSrcweir sal_Bool Printer::AbortJob() 1523cdf0e10cSrcweir { 1524cdf0e10cSrcweir // Wenn wir einen Queue-Printer haben, kann man diesen noch mit 1525cdf0e10cSrcweir // AbortJob() abbrechen, solange dieser noch am Drucken ist 1526cdf0e10cSrcweir if ( !IsJobActive() && !IsPrinting() ) 1527cdf0e10cSrcweir return sal_False; 1528cdf0e10cSrcweir 1529cdf0e10cSrcweir mbJobActive = sal_False; 1530cdf0e10cSrcweir mbInPrintPage = sal_False; 1531cdf0e10cSrcweir mpJobGraphics = NULL; 1532cdf0e10cSrcweir 1533cdf0e10cSrcweir if ( mpPrinter ) 1534cdf0e10cSrcweir { 1535cdf0e10cSrcweir mbPrinting = sal_False; 1536cdf0e10cSrcweir mnCurPage = 0; 1537cdf0e10cSrcweir mnCurPrintPage = 0; 1538cdf0e10cSrcweir maJobName.Erase(); 1539cdf0e10cSrcweir 1540cdf0e10cSrcweir ImplReleaseGraphics(); 1541cdf0e10cSrcweir mbDevOutput = sal_False; 1542cdf0e10cSrcweir mpPrinter->AbortJob(); 1543cdf0e10cSrcweir Application::PostUserEvent( LINK( this, Printer, ImplDestroyPrinterAsync ), mpPrinter ); 1544cdf0e10cSrcweir mpPrinter = NULL; 1545cdf0e10cSrcweir 1546cdf0e10cSrcweir return sal_True; 1547cdf0e10cSrcweir } 1548cdf0e10cSrcweir 1549cdf0e10cSrcweir return sal_False; 1550cdf0e10cSrcweir } 1551cdf0e10cSrcweir 1552cdf0e10cSrcweir // ----------------------------------------------------------------------- 1553cdf0e10cSrcweir 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 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 1601cdf0e10cSrcweir void Printer::updatePrinters() 1602cdf0e10cSrcweir { 1603cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 1604cdf0e10cSrcweir ImplPrnQueueList* pPrnList = pSVData->maGDIData.mpPrinterQueueList; 1605cdf0e10cSrcweir 1606cdf0e10cSrcweir if ( pPrnList ) 1607cdf0e10cSrcweir { 1608cdf0e10cSrcweir ImplPrnQueueList* pNewList = new ImplPrnQueueList; 1609cdf0e10cSrcweir pSVData->mpDefInst->GetPrinterQueueInfo( pNewList ); 1610cdf0e10cSrcweir 1611cdf0e10cSrcweir bool bChanged = pPrnList->m_aQueueInfos.size() != pNewList->m_aQueueInfos.size(); 1612cdf0e10cSrcweir for( unsigned int i = 0; ! bChanged && i < pPrnList->m_aQueueInfos.size(); i++ ) 1613cdf0e10cSrcweir { 1614cdf0e10cSrcweir ImplPrnQueueData& rInfo = pPrnList->m_aQueueInfos[i]; 1615cdf0e10cSrcweir ImplPrnQueueData& rNewInfo = pNewList->m_aQueueInfos[i]; 1616cdf0e10cSrcweir if( ! rInfo.mpSalQueueInfo || ! rNewInfo.mpSalQueueInfo || // sanity check 1617cdf0e10cSrcweir rInfo.mpSalQueueInfo->maPrinterName != rNewInfo.mpSalQueueInfo->maPrinterName ) 1618cdf0e10cSrcweir { 1619cdf0e10cSrcweir bChanged = true; 1620cdf0e10cSrcweir } 1621cdf0e10cSrcweir } 1622cdf0e10cSrcweir if( bChanged ) 1623cdf0e10cSrcweir { 1624cdf0e10cSrcweir ImplDeletePrnQueueList(); 1625cdf0e10cSrcweir pSVData->maGDIData.mpPrinterQueueList = pNewList; 1626cdf0e10cSrcweir 1627cdf0e10cSrcweir Application* pApp = GetpApp(); 1628cdf0e10cSrcweir if( pApp ) 1629cdf0e10cSrcweir { 1630cdf0e10cSrcweir DataChangedEvent aDCEvt( DATACHANGED_PRINTER ); 1631cdf0e10cSrcweir pApp->DataChanged( aDCEvt ); 1632cdf0e10cSrcweir pApp->NotifyAllWindows( aDCEvt ); 1633cdf0e10cSrcweir } 1634cdf0e10cSrcweir } 1635cdf0e10cSrcweir else 1636cdf0e10cSrcweir delete pNewList; 1637cdf0e10cSrcweir } 1638cdf0e10cSrcweir } 1639