2000-09-18 16:07:07 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 07:54:12 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2010-02-12 15:01:35 +01:00
|
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 07:54:12 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 07:54:12 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 07:54:12 +00:00
|
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
* only, as published by the Free Software Foundation.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 07:54:12 +00:00
|
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Lesser General Public License version 3 for more details
|
|
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 07:54:12 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
|
|
* <http://www.openoffice.org/license.html>
|
|
|
|
* for a copy of the LGPLv3 License.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-09-17 11:09:37 +00:00
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_vcl.hxx"
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
#define ENABLE_BYTESTRING_STREAM_OPERATORS
|
2001-11-05 12:42:43 +00:00
|
|
|
#include <list>
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
#ifndef _SV_SVSYS_HXX
|
|
|
|
#include <svsys.h>
|
|
|
|
#endif
|
2007-06-27 19:22:20 +00:00
|
|
|
#include <vcl/salinst.hxx>
|
|
|
|
#include <vcl/salgdi.hxx>
|
|
|
|
#include <vcl/salptype.hxx>
|
|
|
|
#include <vcl/salprn.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2007-06-27 19:22:20 +00:00
|
|
|
#include <vcl/unohelp.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
#include <tools/debug.hxx>
|
|
|
|
#include <tools/stream.hxx>
|
|
|
|
#include <tools/vcompat.hxx>
|
2007-06-27 19:22:20 +00:00
|
|
|
#include <vcl/svdata.hxx>
|
|
|
|
#include <vcl/svapp.hxx>
|
|
|
|
#include <vcl/wrkwin.hxx>
|
|
|
|
#include <vcl/jobset.h>
|
2007-07-24 09:14:12 +00:00
|
|
|
#include <vcl/outdev.h>
|
2007-06-27 19:22:20 +00:00
|
|
|
#include <vcl/virdev.hxx>
|
|
|
|
#include <vcl/window.hxx>
|
|
|
|
#include <vcl/print.h>
|
|
|
|
#include <vcl/gdimtf.hxx>
|
|
|
|
#include <vcl/metaact.hxx>
|
|
|
|
#include <vcl/print.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2001-10-25 08:23:25 +00:00
|
|
|
#include <comphelper/processfactory.hxx>
|
|
|
|
|
|
|
|
using namespace com::sun::star::uno;
|
|
|
|
using namespace com::sun::star::lang;
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
int nImplSysDialog = 0;
|
|
|
|
|
|
|
|
// =======================================================================
|
|
|
|
|
2009-06-12 09:36:34 +00:00
|
|
|
namespace
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2009-06-12 09:36:34 +00:00
|
|
|
static Paper ImplGetPaperFormat( long nWidth100thMM, long nHeight100thMM )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2009-06-12 09:36:34 +00:00
|
|
|
PaperInfo aInfo(nWidth100thMM, nHeight100thMM);
|
|
|
|
aInfo.doSloppyFit();
|
|
|
|
return aInfo.getPaper();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2009-06-12 09:36:34 +00:00
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
static const PaperInfo& ImplGetEmptyPaper()
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2009-06-12 09:36:34 +00:00
|
|
|
static PaperInfo aInfo(PAPER_USER);
|
|
|
|
return aInfo;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// =======================================================================
|
|
|
|
|
|
|
|
void ImplUpdateJobSetupPaper( JobSetup& rJobSetup )
|
|
|
|
{
|
|
|
|
const ImplJobSetup* pConstData = rJobSetup.ImplGetConstData();
|
|
|
|
|
|
|
|
if ( !pConstData->mnPaperWidth || !pConstData->mnPaperHeight )
|
|
|
|
{
|
|
|
|
if ( pConstData->mePaperFormat != PAPER_USER )
|
|
|
|
{
|
|
|
|
ImplJobSetup* pData = rJobSetup.ImplGetData();
|
2009-06-12 09:36:34 +00:00
|
|
|
PaperInfo aInfo(pConstData->mePaperFormat);
|
|
|
|
pData->mnPaperWidth = aInfo.getWidth();
|
|
|
|
pData->mnPaperHeight = aInfo.getHeight();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ( pConstData->mePaperFormat == PAPER_USER )
|
|
|
|
{
|
|
|
|
Paper ePaper = ImplGetPaperFormat( pConstData->mnPaperWidth, pConstData->mnPaperHeight );
|
|
|
|
if ( ePaper != PAPER_USER )
|
|
|
|
rJobSetup.ImplGetData()->mePaperFormat = ePaper;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-04-26 18:41:50 +00:00
|
|
|
// ------------------
|
|
|
|
// - PrinterOptions -
|
|
|
|
// ------------------
|
|
|
|
|
|
|
|
PrinterOptions::PrinterOptions() :
|
2010-09-29 15:46:40 +08:00
|
|
|
mbReduceTransparency( sal_False ),
|
2001-04-26 18:41:50 +00:00
|
|
|
meReducedTransparencyMode( PRINTER_TRANSPARENCY_AUTO ),
|
2010-09-29 15:46:40 +08:00
|
|
|
mbReduceGradients( sal_False ),
|
2001-04-26 18:41:50 +00:00
|
|
|
meReducedGradientsMode( PRINTER_GRADIENT_STRIPES ),
|
|
|
|
mnReducedGradientStepCount( 64 ),
|
2010-09-29 15:46:40 +08:00
|
|
|
mbReduceBitmaps( sal_False ),
|
2001-05-07 09:35:52 +00:00
|
|
|
meReducedBitmapMode( PRINTER_BITMAP_NORMAL ),
|
2001-04-26 18:41:50 +00:00
|
|
|
mnReducedBitmapResolution( 200 ),
|
2010-09-29 15:46:40 +08:00
|
|
|
mbReducedBitmapsIncludeTransparency( sal_True ),
|
|
|
|
mbConvertToGreyscales( sal_False )
|
2001-04-26 18:41:50 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
PrinterOptions::~PrinterOptions()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
// -------------
|
|
|
|
// - QueueInfo -
|
|
|
|
// -------------
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
QueueInfo::QueueInfo()
|
|
|
|
{
|
|
|
|
mnStatus = 0;
|
|
|
|
mnJobs = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
QueueInfo::QueueInfo( const QueueInfo& rInfo ) :
|
|
|
|
maPrinterName( rInfo.maPrinterName ),
|
|
|
|
maDriver( rInfo.maDriver ),
|
|
|
|
maLocation( rInfo.maLocation ),
|
|
|
|
maComment( rInfo.maComment ),
|
|
|
|
mnStatus( rInfo.mnStatus ),
|
|
|
|
mnJobs( rInfo.mnJobs )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
QueueInfo::~QueueInfo()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2006-12-20 17:32:13 +00:00
|
|
|
bool QueueInfo::operator==( const QueueInfo& rInfo ) const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2006-12-20 17:32:13 +00:00
|
|
|
return
|
|
|
|
maPrinterName == rInfo.maPrinterName &&
|
|
|
|
maDriver == rInfo.maDriver &&
|
|
|
|
maLocation == rInfo.maLocation &&
|
|
|
|
maComment == rInfo.maComment &&
|
|
|
|
mnStatus == rInfo.mnStatus &&
|
|
|
|
mnJobs == rInfo.mnJobs;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
SvStream& operator<<( SvStream& rOStream, const QueueInfo& rInfo )
|
|
|
|
{
|
|
|
|
VersionCompat aCompat( rOStream, STREAM_WRITE, 1 );
|
|
|
|
|
|
|
|
rOStream.WriteByteString( rInfo.maPrinterName, RTL_TEXTENCODING_UTF8 );
|
|
|
|
rOStream.WriteByteString( rInfo.maDriver, RTL_TEXTENCODING_UTF8 );
|
|
|
|
rOStream.WriteByteString( rInfo.maLocation, RTL_TEXTENCODING_UTF8 );
|
|
|
|
rOStream.WriteByteString( rInfo.maComment, RTL_TEXTENCODING_UTF8 );
|
|
|
|
rOStream << rInfo.mnStatus;
|
|
|
|
rOStream << rInfo.mnJobs;
|
|
|
|
|
|
|
|
return rOStream;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
SvStream& operator>>( SvStream& rIStream, QueueInfo& rInfo )
|
|
|
|
{
|
|
|
|
VersionCompat aCompat( rIStream, STREAM_READ );
|
|
|
|
|
|
|
|
rIStream.ReadByteString( rInfo.maPrinterName, RTL_TEXTENCODING_UTF8 );
|
|
|
|
rIStream.ReadByteString( rInfo.maDriver, RTL_TEXTENCODING_UTF8 );
|
|
|
|
rIStream.ReadByteString( rInfo.maLocation, RTL_TEXTENCODING_UTF8 );
|
|
|
|
rIStream.ReadByteString( rInfo.maComment, RTL_TEXTENCODING_UTF8 );
|
|
|
|
rIStream >> rInfo.mnStatus;
|
|
|
|
rIStream >> rInfo.mnJobs;
|
|
|
|
|
|
|
|
return rIStream;
|
|
|
|
}
|
|
|
|
|
|
|
|
// =======================================================================
|
|
|
|
|
|
|
|
SalPrinterQueueInfo::SalPrinterQueueInfo()
|
|
|
|
{
|
|
|
|
mnStatus = 0;
|
|
|
|
mnJobs = QUEUE_JOBS_DONTKNOW;
|
|
|
|
mpSysData = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
SalPrinterQueueInfo::~SalPrinterQueueInfo()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2006-12-20 17:32:13 +00:00
|
|
|
ImplPrnQueueList::~ImplPrnQueueList()
|
|
|
|
{
|
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
|
|
|
for( unsigned int i = 0; i < m_aQueueInfos.size(); i++ )
|
|
|
|
{
|
|
|
|
delete m_aQueueInfos[i].mpQueueInfo;
|
|
|
|
pSVData->mpDefInst->DeletePrinterQueueInfo( m_aQueueInfos[i].mpSalQueueInfo );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
void ImplPrnQueueList::Add( SalPrinterQueueInfo* pData )
|
|
|
|
{
|
2006-12-20 17:32:13 +00:00
|
|
|
std::hash_map< rtl::OUString, sal_Int32, rtl::OUStringHash >::iterator it =
|
|
|
|
m_aNameToIndex.find( pData->maPrinterName );
|
|
|
|
if( it == m_aNameToIndex.end() )
|
|
|
|
{
|
|
|
|
m_aNameToIndex[ pData->maPrinterName ] = m_aQueueInfos.size();
|
|
|
|
m_aQueueInfos.push_back( ImplPrnQueueData() );
|
|
|
|
m_aQueueInfos.back().mpQueueInfo = NULL;
|
|
|
|
m_aQueueInfos.back().mpSalQueueInfo = pData;
|
|
|
|
m_aPrinterList.push_back( pData->maPrinterName );
|
|
|
|
}
|
|
|
|
else // this should not happen, but ...
|
|
|
|
{
|
|
|
|
ImplPrnQueueData& rData = m_aQueueInfos[ it->second ];
|
|
|
|
delete rData.mpQueueInfo;
|
|
|
|
rData.mpQueueInfo = NULL;
|
|
|
|
ImplGetSVData()->mpDefInst->DeletePrinterQueueInfo( rData.mpSalQueueInfo );
|
|
|
|
rData.mpSalQueueInfo = pData;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
ImplPrnQueueData* ImplPrnQueueList::Get( const rtl::OUString& rPrinter )
|
|
|
|
{
|
|
|
|
ImplPrnQueueData* pData = NULL;
|
|
|
|
std::hash_map<rtl::OUString,sal_Int32,rtl::OUStringHash>::iterator it =
|
|
|
|
m_aNameToIndex.find( rPrinter );
|
|
|
|
if( it != m_aNameToIndex.end() )
|
|
|
|
pData = &m_aQueueInfos[it->second];
|
|
|
|
return pData;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// =======================================================================
|
|
|
|
|
|
|
|
static void ImplInitPrnQueueList()
|
|
|
|
{
|
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
|
|
|
|
|
|
|
pSVData->maGDIData.mpPrinterQueueList = new ImplPrnQueueList;
|
|
|
|
|
2009-11-18 17:23:09 +01:00
|
|
|
static const char* pEnv = getenv( "SAL_DISABLE_PRINTERLIST" );
|
|
|
|
if( !pEnv || !*pEnv )
|
|
|
|
pSVData->mpDefInst->GetPrinterQueueInfo( pSVData->maGDIData.mpPrinterQueueList );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ImplDeletePrnQueueList()
|
|
|
|
{
|
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
|
|
|
ImplPrnQueueList* pPrnList = pSVData->maGDIData.mpPrinterQueueList;
|
|
|
|
|
|
|
|
if ( pPrnList )
|
|
|
|
{
|
|
|
|
delete pPrnList;
|
|
|
|
pSVData->maGDIData.mpPrinterQueueList = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2006-12-20 17:32:13 +00:00
|
|
|
const std::vector<rtl::OUString>& Printer::GetPrinterQueues()
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2006-12-20 17:32:13 +00:00
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( !pSVData->maGDIData.mpPrinterQueueList )
|
|
|
|
ImplInitPrnQueueList();
|
2006-12-20 17:32:13 +00:00
|
|
|
return pSVData->maGDIData.mpPrinterQueueList->m_aPrinterList;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
2006-12-20 17:32:13 +00:00
|
|
|
const QueueInfo* Printer::GetQueueInfo( const String& rPrinterName, bool bStatusUpdate )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
|
|
|
|
|
|
|
if ( !pSVData->maGDIData.mpPrinterQueueList )
|
|
|
|
ImplInitPrnQueueList();
|
|
|
|
|
2006-12-20 17:32:13 +00:00
|
|
|
ImplPrnQueueData* pInfo = pSVData->maGDIData.mpPrinterQueueList->Get( rPrinterName );
|
|
|
|
if( pInfo )
|
|
|
|
{
|
|
|
|
if( !pInfo->mpQueueInfo || bStatusUpdate )
|
|
|
|
pSVData->mpDefInst->GetPrinterQueueState( pInfo->mpSalQueueInfo );
|
|
|
|
|
|
|
|
if ( !pInfo->mpQueueInfo )
|
|
|
|
pInfo->mpQueueInfo = new QueueInfo;
|
|
|
|
|
|
|
|
pInfo->mpQueueInfo->maPrinterName = pInfo->mpSalQueueInfo->maPrinterName;
|
|
|
|
pInfo->mpQueueInfo->maDriver = pInfo->mpSalQueueInfo->maDriver;
|
|
|
|
pInfo->mpQueueInfo->maLocation = pInfo->mpSalQueueInfo->maLocation;
|
|
|
|
pInfo->mpQueueInfo->maComment = pInfo->mpSalQueueInfo->maComment;
|
|
|
|
pInfo->mpQueueInfo->mnStatus = pInfo->mpSalQueueInfo->mnStatus;
|
|
|
|
pInfo->mpQueueInfo->mnJobs = pInfo->mpSalQueueInfo->mnJobs;
|
|
|
|
return pInfo->mpQueueInfo;
|
|
|
|
}
|
|
|
|
return NULL;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
XubString Printer::GetDefaultPrinterName()
|
|
|
|
{
|
2009-11-18 17:23:09 +01:00
|
|
|
static const char* pEnv = getenv( "SAL_DISABLE_DEFAULTPRINTER" );
|
|
|
|
if( !pEnv || !*pEnv )
|
|
|
|
{
|
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2009-11-18 17:23:09 +01:00
|
|
|
return pSVData->mpDefInst->GetDefaultPrinter();
|
|
|
|
}
|
|
|
|
return XubString();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// =======================================================================
|
|
|
|
|
|
|
|
void Printer::ImplInitData()
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbDevOutput = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
meOutDevType = OUTDEV_PRINTER;
|
2010-09-29 15:46:40 +08:00
|
|
|
mbDefPrinter = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
mnError = 0;
|
|
|
|
mnCurPage = 0;
|
|
|
|
mnCurPrintPage = 0;
|
|
|
|
mnPageQueueSize = 0;
|
|
|
|
mnCopyCount = 1;
|
2010-09-29 15:46:40 +08:00
|
|
|
mbCollateCopy = sal_False;
|
|
|
|
mbPrinting = sal_False;
|
|
|
|
mbJobActive = sal_False;
|
|
|
|
mbPrintFile = sal_False;
|
|
|
|
mbInPrintPage = sal_False;
|
|
|
|
mbNewJobSetup = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
mpInfoPrinter = NULL;
|
|
|
|
mpPrinter = NULL;
|
|
|
|
mpDisplayDev = NULL;
|
2010-09-29 15:46:40 +08:00
|
|
|
mbIsQueuePrinter = sal_False;
|
2001-04-26 18:41:50 +00:00
|
|
|
mpPrinterOptions = new PrinterOptions;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// Printer in die Liste eintragen
|
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
|
|
|
mpNext = pSVData->maGDIData.mpFirstPrinter;
|
|
|
|
mpPrev = NULL;
|
|
|
|
if ( mpNext )
|
|
|
|
mpNext->mpPrev = this;
|
|
|
|
else
|
|
|
|
pSVData->maGDIData.mpLastPrinter = this;
|
|
|
|
pSVData->maGDIData.mpFirstPrinter = this;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void Printer::ImplInit( SalPrinterQueueInfo* pInfo )
|
|
|
|
{
|
2007-02-12 13:51:31 +00:00
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
|
|
|
// #i74084# update info for this specific SalPrinterQueueInfo
|
|
|
|
pSVData->mpDefInst->GetPrinterQueueState( pInfo );
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// Testen, ob Treiber ueberhaupt mit dem JobSetup uebereinstimmt
|
|
|
|
ImplJobSetup* pJobSetup = maJobSetup.ImplGetData();
|
|
|
|
|
|
|
|
if ( pJobSetup->mpDriverData )
|
|
|
|
{
|
|
|
|
if ( (pJobSetup->maPrinterName != pInfo->maPrinterName) ||
|
|
|
|
(pJobSetup->maDriver != pInfo->maDriver) )
|
|
|
|
{
|
2002-06-19 10:21:25 +00:00
|
|
|
rtl_freeMemory( pJobSetup->mpDriverData );
|
2000-09-18 16:07:07 +00:00
|
|
|
pJobSetup->mpDriverData = NULL;
|
|
|
|
pJobSetup->mnDriverDataLen = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Printernamen merken
|
|
|
|
maPrinterName = pInfo->maPrinterName;
|
|
|
|
maDriver = pInfo->maDriver;
|
|
|
|
|
|
|
|
// In JobSetup den Printernamen eintragen
|
|
|
|
pJobSetup->maPrinterName = maPrinterName;
|
|
|
|
pJobSetup->maDriver = maDriver;
|
|
|
|
|
|
|
|
mpInfoPrinter = pSVData->mpDefInst->CreateInfoPrinter( pInfo, pJobSetup );
|
|
|
|
mpPrinter = NULL;
|
|
|
|
mpJobGraphics = NULL;
|
|
|
|
ImplUpdateJobSetupPaper( maJobSetup );
|
|
|
|
|
|
|
|
if ( !mpInfoPrinter )
|
|
|
|
{
|
|
|
|
ImplInitDisplay( NULL );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// we need a graphics
|
|
|
|
if ( !ImplGetGraphics() )
|
|
|
|
{
|
|
|
|
ImplInitDisplay( NULL );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Daten initialisieren
|
|
|
|
ImplUpdatePageData();
|
2003-11-18 13:34:27 +00:00
|
|
|
mpFontList = new ImplDevFontList();
|
2010-09-29 15:46:40 +08:00
|
|
|
mpFontCache = new ImplFontCache( sal_True );
|
2000-09-18 16:07:07 +00:00
|
|
|
mpGraphics->GetDevFontList( mpFontList );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void Printer::ImplInitDisplay( const Window* pWindow )
|
|
|
|
{
|
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
|
|
|
|
|
|
|
mpInfoPrinter = NULL;
|
|
|
|
mpPrinter = NULL;
|
|
|
|
mpJobGraphics = NULL;
|
|
|
|
|
|
|
|
if ( pWindow )
|
|
|
|
mpDisplayDev = new VirtualDevice( *pWindow );
|
|
|
|
else
|
|
|
|
mpDisplayDev = new VirtualDevice();
|
|
|
|
mpFontList = pSVData->maGDIData.mpScreenFontList;
|
|
|
|
mpFontCache = pSVData->maGDIData.mpScreenFontCache;
|
|
|
|
mnDPIX = mpDisplayDev->mnDPIX;
|
|
|
|
mnDPIY = mpDisplayDev->mnDPIY;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
SalPrinterQueueInfo* Printer::ImplGetQueueInfo( const XubString& rPrinterName,
|
|
|
|
const XubString* pDriver )
|
|
|
|
{
|
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
|
|
|
if ( !pSVData->maGDIData.mpPrinterQueueList )
|
|
|
|
ImplInitPrnQueueList();
|
|
|
|
|
|
|
|
ImplPrnQueueList* pPrnList = pSVData->maGDIData.mpPrinterQueueList;
|
2006-12-20 17:32:13 +00:00
|
|
|
if ( pPrnList && pPrnList->m_aQueueInfos.size() )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2006-12-20 17:32:13 +00:00
|
|
|
// first search for the printer name driectly
|
|
|
|
ImplPrnQueueData* pInfo = pPrnList->Get( rPrinterName );
|
|
|
|
if( pInfo )
|
|
|
|
return pInfo->mpSalQueueInfo;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2006-12-20 17:32:13 +00:00
|
|
|
// then search case insensitive
|
|
|
|
for( unsigned int i = 0; i < pPrnList->m_aQueueInfos.size(); i++ )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2006-12-20 17:32:13 +00:00
|
|
|
if( pPrnList->m_aQueueInfos[i].mpSalQueueInfo->maPrinterName.EqualsIgnoreCaseAscii( rPrinterName ) )
|
|
|
|
return pPrnList->m_aQueueInfos[i].mpSalQueueInfo;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2006-12-20 17:32:13 +00:00
|
|
|
// then search for driver name
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pDriver )
|
|
|
|
{
|
2006-12-20 17:32:13 +00:00
|
|
|
for( unsigned int i = 0; i < pPrnList->m_aQueueInfos.size(); i++ )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2006-12-20 17:32:13 +00:00
|
|
|
if( pPrnList->m_aQueueInfos[i].mpSalQueueInfo->maDriver == *pDriver )
|
|
|
|
return pPrnList->m_aQueueInfos[i].mpSalQueueInfo;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-12-20 17:32:13 +00:00
|
|
|
// then the default printer
|
|
|
|
pInfo = pPrnList->Get( GetDefaultPrinterName() );
|
|
|
|
if( pInfo )
|
2000-09-18 16:07:07 +00:00
|
|
|
return pInfo->mpSalQueueInfo;
|
2006-12-20 17:32:13 +00:00
|
|
|
|
|
|
|
// last chance: the first available printer
|
|
|
|
return pPrnList->m_aQueueInfos[0].mpSalQueueInfo;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void Printer::ImplUpdatePageData()
|
|
|
|
{
|
|
|
|
// we need a graphics
|
|
|
|
if ( !ImplGetGraphics() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
mpGraphics->GetResolution( mnDPIX, mnDPIY );
|
|
|
|
mpInfoPrinter->GetPageInfo( maJobSetup.ImplGetConstData(),
|
|
|
|
mnOutWidth, mnOutHeight,
|
|
|
|
maPageOffset.X(), maPageOffset.Y(),
|
|
|
|
maPaperSize.Width(), maPaperSize.Height() );
|
2009-08-17 17:34:09 +00:00
|
|
|
static const char* pDebugOffset = getenv( "SAL_DBG_PAGEOFFSET" );
|
|
|
|
if( pDebugOffset )
|
|
|
|
{
|
|
|
|
rtl::OString aLine( pDebugOffset );
|
|
|
|
sal_Int32 nIndex = 0;
|
|
|
|
rtl::OString aToken( aLine.getToken( 0, ',', nIndex ) );
|
|
|
|
sal_Int32 nLeft = aToken.toInt32();
|
|
|
|
sal_Int32 nTop = nLeft;
|
|
|
|
if( nIndex > 0 )
|
|
|
|
{
|
2009-08-19 08:31:45 +00:00
|
|
|
aToken = aLine.getToken( 0, ',', nIndex );
|
2009-08-17 17:34:09 +00:00
|
|
|
nTop = aToken.toInt32();
|
|
|
|
}
|
|
|
|
maPageOffset = LogicToPixel( Point( static_cast<long>(nLeft),
|
|
|
|
static_cast<long>(nTop) ),
|
|
|
|
MapMode( MAP_100TH_MM )
|
|
|
|
);
|
|
|
|
mnOutWidth = maPaperSize.Width() - 2*maPageOffset.X();
|
|
|
|
mnOutWidth = maPaperSize.Width() - 2*maPageOffset.Y();
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void Printer::ImplUpdateFontList()
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
ImplUpdateFontData( sal_True );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Printer::Printer()
|
|
|
|
{
|
|
|
|
ImplInitData();
|
|
|
|
SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( GetDefaultPrinterName(), NULL );
|
|
|
|
if ( pInfo )
|
|
|
|
{
|
|
|
|
ImplInit( pInfo );
|
|
|
|
if ( !IsDisplayPrinter() )
|
2010-09-29 15:46:40 +08:00
|
|
|
mbDefPrinter = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
ImplInitDisplay( NULL );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Printer::Printer( const Window* pWindow )
|
|
|
|
{
|
|
|
|
ImplInitData();
|
|
|
|
ImplInitDisplay( pWindow );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Printer::Printer( const JobSetup& rJobSetup ) :
|
|
|
|
maJobSetup( rJobSetup )
|
|
|
|
{
|
|
|
|
ImplInitData();
|
|
|
|
SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( rJobSetup.mpData->maPrinterName,
|
|
|
|
&rJobSetup.mpData->maDriver );
|
|
|
|
if ( pInfo )
|
|
|
|
{
|
|
|
|
ImplInit( pInfo );
|
|
|
|
SetJobSetup( rJobSetup );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ImplInitDisplay( NULL );
|
|
|
|
maJobSetup = JobSetup();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Printer::Printer( const QueueInfo& rQueueInfo )
|
|
|
|
{
|
|
|
|
ImplInitData();
|
|
|
|
SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( rQueueInfo.GetPrinterName(),
|
|
|
|
&rQueueInfo.GetDriver() );
|
|
|
|
if ( pInfo )
|
|
|
|
ImplInit( pInfo );
|
|
|
|
else
|
|
|
|
ImplInitDisplay( NULL );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Printer::Printer( const XubString& rPrinterName )
|
|
|
|
{
|
|
|
|
ImplInitData();
|
|
|
|
SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( rPrinterName, NULL );
|
|
|
|
if ( pInfo )
|
|
|
|
ImplInit( pInfo );
|
|
|
|
else
|
|
|
|
ImplInitDisplay( NULL );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Printer::~Printer()
|
|
|
|
{
|
|
|
|
DBG_ASSERT( !IsPrinting(), "Printer::~Printer() - Job is printing" );
|
|
|
|
DBG_ASSERT( !IsJobActive(), "Printer::~Printer() - Job is active" );
|
2007-12-12 14:04:37 +00:00
|
|
|
|
2001-04-26 18:41:50 +00:00
|
|
|
delete mpPrinterOptions;
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
ImplReleaseGraphics();
|
|
|
|
if ( mpInfoPrinter )
|
|
|
|
ImplGetSVData()->mpDefInst->DestroyInfoPrinter( mpInfoPrinter );
|
|
|
|
if ( mpDisplayDev )
|
|
|
|
delete mpDisplayDev;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// OutputDevice-Dtor versucht das gleiche, deshalb muss hier
|
|
|
|
// der FontEntry auch auf NULL gesetzt werden
|
2005-07-01 12:07:23 +00:00
|
|
|
// TODO: consolidate duplicate cleanup by Printer and OutputDevice
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mpFontEntry )
|
|
|
|
{
|
|
|
|
mpFontCache->Release( mpFontEntry );
|
|
|
|
mpFontEntry = NULL;
|
|
|
|
}
|
|
|
|
if ( mpGetDevFontList )
|
|
|
|
{
|
|
|
|
delete mpGetDevFontList;
|
|
|
|
mpGetDevFontList = NULL;
|
|
|
|
}
|
|
|
|
if ( mpGetDevSizeList )
|
|
|
|
{
|
|
|
|
delete mpGetDevSizeList;
|
|
|
|
mpGetDevSizeList = NULL;
|
|
|
|
}
|
|
|
|
delete mpFontCache;
|
2005-07-01 12:07:23 +00:00
|
|
|
mpFontCache = NULL;
|
2002-07-15 11:04:39 +00:00
|
|
|
// font list deleted by OutputDevice dtor
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Printer aus der Liste eintragen
|
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
|
|
|
if ( mpPrev )
|
|
|
|
mpPrev->mpNext = mpNext;
|
|
|
|
else
|
|
|
|
pSVData->maGDIData.mpFirstPrinter = mpNext;
|
|
|
|
if ( mpNext )
|
|
|
|
mpNext->mpPrev = mpPrev;
|
|
|
|
else
|
|
|
|
pSVData->maGDIData.mpLastPrinter = mpPrev;
|
|
|
|
}
|
|
|
|
|
2007-06-20 09:13:44 +00:00
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
void Printer::Compat_OldPrinterMetrics( bool bSet )
|
|
|
|
{
|
|
|
|
// propagate flag
|
|
|
|
if( mpInfoPrinter )
|
|
|
|
mpInfoPrinter->m_bCompatMetrics = bSet;
|
|
|
|
|
|
|
|
// get new font data
|
2010-09-29 15:46:40 +08:00
|
|
|
ImplUpdateFontData( sal_True );
|
2007-06-20 09:13:44 +00:00
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uIntPtr Printer::GetCapabilities( sal_uInt16 nType ) const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( IsDisplayPrinter() )
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2005-07-06 08:21:01 +00:00
|
|
|
if( mpInfoPrinter )
|
|
|
|
return mpInfoPrinter->GetCapabilities( maJobSetup.ImplGetConstData(), nType );
|
|
|
|
else
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool Printer::HasSupport( PrinterSupport eFeature ) const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
switch ( eFeature )
|
|
|
|
{
|
|
|
|
case SUPPORT_SET_ORIENTATION:
|
2010-09-29 15:46:40 +08:00
|
|
|
return (sal_Bool)GetCapabilities( PRINTER_CAPABILITIES_SETORIENTATION );
|
2000-09-18 16:07:07 +00:00
|
|
|
case SUPPORT_SET_PAPERBIN:
|
2010-09-29 15:46:40 +08:00
|
|
|
return (sal_Bool)GetCapabilities( PRINTER_CAPABILITIES_SETPAPERBIN );
|
2000-09-18 16:07:07 +00:00
|
|
|
case SUPPORT_SET_PAPERSIZE:
|
2010-09-29 15:46:40 +08:00
|
|
|
return (sal_Bool)GetCapabilities( PRINTER_CAPABILITIES_SETPAPERSIZE );
|
2000-09-18 16:07:07 +00:00
|
|
|
case SUPPORT_SET_PAPER:
|
2010-09-29 15:46:40 +08:00
|
|
|
return (sal_Bool)GetCapabilities( PRINTER_CAPABILITIES_SETPAPER );
|
2000-09-18 16:07:07 +00:00
|
|
|
case SUPPORT_COPY:
|
|
|
|
return (GetCapabilities( PRINTER_CAPABILITIES_COPIES ) != 0);
|
|
|
|
case SUPPORT_COLLATECOPY:
|
|
|
|
return (GetCapabilities( PRINTER_CAPABILITIES_COLLATECOPIES ) != 0);
|
|
|
|
case SUPPORT_SETUPDIALOG:
|
2010-09-29 15:46:40 +08:00
|
|
|
return (sal_Bool)GetCapabilities( PRINTER_CAPABILITIES_SUPPORTDIALOG );
|
2000-09-29 09:00:17 +00:00
|
|
|
case SUPPORT_FAX:
|
2010-09-29 15:46:40 +08:00
|
|
|
return (sal_Bool) GetCapabilities( PRINTER_CAPABILITIES_FAX );
|
2002-07-04 15:31:08 +00:00
|
|
|
case SUPPORT_PDF:
|
2010-09-29 15:46:40 +08:00
|
|
|
return (sal_Bool) GetCapabilities( PRINTER_CAPABILITIES_PDF );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool Printer::SetJobSetup( const JobSetup& rSetup )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( IsDisplayPrinter() || mbInPrintPage )
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
JobSetup aJobSetup = rSetup;
|
|
|
|
|
|
|
|
ImplReleaseGraphics();
|
|
|
|
if ( mpInfoPrinter->SetPrinterData( aJobSetup.ImplGetData() ) )
|
|
|
|
{
|
|
|
|
ImplUpdateJobSetupPaper( aJobSetup );
|
2010-09-29 15:46:40 +08:00
|
|
|
mbNewJobSetup = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
maJobSetup = aJobSetup;
|
|
|
|
ImplUpdatePageData();
|
|
|
|
ImplUpdateFontList();
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool Printer::Setup( Window* pWindow )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( IsDisplayPrinter() )
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( IsJobActive() || IsPrinting() )
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
JobSetup aJobSetup = maJobSetup;
|
|
|
|
SalFrame* pFrame;
|
|
|
|
if ( !pWindow )
|
2006-05-18 09:08:47 +00:00
|
|
|
pWindow = ImplGetDefaultWindow();
|
|
|
|
if( !pWindow )
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2006-05-18 09:08:47 +00:00
|
|
|
|
|
|
|
pFrame = pWindow->ImplGetFrame();
|
2000-09-18 16:07:07 +00:00
|
|
|
ImplReleaseGraphics();
|
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
|
|
|
pSVData->maAppData.mnModalMode++;
|
|
|
|
nImplSysDialog++;
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool bSetup = mpInfoPrinter->Setup( pFrame, aJobSetup.ImplGetData() );
|
2000-09-18 16:07:07 +00:00
|
|
|
pSVData->maAppData.mnModalMode--;
|
|
|
|
nImplSysDialog--;
|
|
|
|
if ( bSetup )
|
|
|
|
{
|
|
|
|
ImplUpdateJobSetupPaper( aJobSetup );
|
2010-09-29 15:46:40 +08:00
|
|
|
mbNewJobSetup = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
maJobSetup = aJobSetup;
|
|
|
|
ImplUpdatePageData();
|
|
|
|
ImplUpdateFontList();
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool Printer::SetPrinterProps( const Printer* pPrinter )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( IsJobActive() || IsPrinting() )
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
|
|
|
|
2001-04-26 18:41:50 +00:00
|
|
|
mbDefPrinter = pPrinter->mbDefPrinter;
|
|
|
|
maPrintFile = pPrinter->maPrintFile;
|
|
|
|
mbPrintFile = pPrinter->mbPrintFile;
|
|
|
|
mnCopyCount = pPrinter->mnCopyCount;
|
|
|
|
mbCollateCopy = pPrinter->mbCollateCopy;
|
|
|
|
mnPageQueueSize = pPrinter->mnPageQueueSize;
|
|
|
|
*mpPrinterOptions = *pPrinter->mpPrinterOptions;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( pPrinter->IsDisplayPrinter() )
|
|
|
|
{
|
|
|
|
// Alten Printer zerstoeren
|
|
|
|
if ( !IsDisplayPrinter() )
|
|
|
|
{
|
|
|
|
ImplReleaseGraphics();
|
|
|
|
pSVData->mpDefInst->DestroyInfoPrinter( mpInfoPrinter );
|
|
|
|
if ( mpFontEntry )
|
|
|
|
{
|
|
|
|
mpFontCache->Release( mpFontEntry );
|
|
|
|
mpFontEntry = NULL;
|
|
|
|
}
|
|
|
|
if ( mpGetDevFontList )
|
|
|
|
{
|
|
|
|
delete mpGetDevFontList;
|
|
|
|
mpGetDevFontList = NULL;
|
|
|
|
}
|
|
|
|
if ( mpGetDevSizeList )
|
|
|
|
{
|
|
|
|
delete mpGetDevSizeList;
|
|
|
|
mpGetDevSizeList = NULL;
|
|
|
|
}
|
2002-07-15 11:04:39 +00:00
|
|
|
// clean up font list
|
2006-03-22 14:18:25 +00:00
|
|
|
delete mpFontCache;
|
2000-09-18 16:07:07 +00:00
|
|
|
delete mpFontList;
|
2006-03-22 14:18:25 +00:00
|
|
|
mpFontCache = NULL;
|
2002-07-15 11:04:39 +00:00
|
|
|
mpFontList = NULL;
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInitFont = sal_True;
|
|
|
|
mbNewFont = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
mpInfoPrinter = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Neuen Printer bauen
|
|
|
|
ImplInitDisplay( NULL );
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Alten Printer zerstoeren?
|
|
|
|
if ( GetName() != pPrinter->GetName() )
|
|
|
|
{
|
|
|
|
ImplReleaseGraphics();
|
|
|
|
if ( mpDisplayDev )
|
|
|
|
{
|
|
|
|
delete mpDisplayDev;
|
|
|
|
mpDisplayDev = NULL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pSVData->mpDefInst->DestroyInfoPrinter( mpInfoPrinter );
|
|
|
|
|
|
|
|
if ( mpFontEntry )
|
|
|
|
{
|
|
|
|
mpFontCache->Release( mpFontEntry );
|
|
|
|
mpFontEntry = NULL;
|
|
|
|
}
|
|
|
|
if ( mpGetDevFontList )
|
|
|
|
{
|
|
|
|
delete mpGetDevFontList;
|
|
|
|
mpGetDevFontList = NULL;
|
|
|
|
}
|
|
|
|
if ( mpGetDevSizeList )
|
|
|
|
{
|
|
|
|
delete mpGetDevSizeList;
|
|
|
|
mpGetDevSizeList = NULL;
|
|
|
|
}
|
|
|
|
delete mpFontCache;
|
2006-03-22 14:18:25 +00:00
|
|
|
delete mpFontList;
|
|
|
|
mpFontCache = NULL;
|
|
|
|
mpFontList = NULL;
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInitFont = sal_True;
|
|
|
|
mbNewFont = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
mpInfoPrinter = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Neuen Printer bauen
|
2006-06-19 18:30:44 +00:00
|
|
|
XubString aDriver = pPrinter->GetDriverName();
|
|
|
|
SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( pPrinter->GetName(), &aDriver );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pInfo )
|
|
|
|
{
|
|
|
|
ImplInit( pInfo );
|
|
|
|
SetJobSetup( pPrinter->GetJobSetup() );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ImplInitDisplay( NULL );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
SetJobSetup( pPrinter->GetJobSetup() );
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool Printer::SetOrientation( Orientation eOrientation )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( mbInPrintPage )
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( maJobSetup.ImplGetConstData()->meOrientation != eOrientation )
|
|
|
|
{
|
|
|
|
JobSetup aJobSetup = maJobSetup;
|
|
|
|
ImplJobSetup* pSetupData = aJobSetup.ImplGetData();
|
|
|
|
pSetupData->meOrientation = eOrientation;
|
|
|
|
|
|
|
|
if ( IsDisplayPrinter() )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbNewJobSetup = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
maJobSetup = aJobSetup;
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ImplReleaseGraphics();
|
|
|
|
if ( mpInfoPrinter->SetData( SAL_JOBSET_ORIENTATION, pSetupData ) )
|
|
|
|
{
|
|
|
|
ImplUpdateJobSetupPaper( aJobSetup );
|
2010-09-29 15:46:40 +08:00
|
|
|
mbNewJobSetup = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
maJobSetup = aJobSetup;
|
|
|
|
ImplUpdatePageData();
|
|
|
|
ImplUpdateFontList();
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Orientation Printer::GetOrientation() const
|
|
|
|
{
|
|
|
|
return maJobSetup.ImplGetConstData()->meOrientation;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool Printer::SetPaperBin( sal_uInt16 nPaperBin )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( mbInPrintPage )
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( (maJobSetup.ImplGetConstData()->mnPaperBin != nPaperBin) &&
|
|
|
|
(nPaperBin < GetPaperBinCount()) )
|
|
|
|
{
|
|
|
|
JobSetup aJobSetup = maJobSetup;
|
|
|
|
ImplJobSetup* pSetupData = aJobSetup.ImplGetData();
|
|
|
|
pSetupData->mnPaperBin = nPaperBin;
|
|
|
|
|
|
|
|
if ( IsDisplayPrinter() )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbNewJobSetup = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
maJobSetup = aJobSetup;
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ImplReleaseGraphics();
|
|
|
|
if ( mpInfoPrinter->SetData( SAL_JOBSET_PAPERBIN, pSetupData ) )
|
|
|
|
{
|
|
|
|
ImplUpdateJobSetupPaper( aJobSetup );
|
2010-09-29 15:46:40 +08:00
|
|
|
mbNewJobSetup = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
maJobSetup = aJobSetup;
|
|
|
|
ImplUpdatePageData();
|
|
|
|
ImplUpdateFontList();
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uInt16 Printer::GetPaperBin() const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
return maJobSetup.ImplGetConstData()->mnPaperBin;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2003-03-27 16:59:30 +00:00
|
|
|
// Map user paper format to a available printer paper formats
|
2009-09-08 15:20:56 +00:00
|
|
|
void Printer::ImplFindPaperFormatForUserSize( JobSetup& aJobSetup, bool bMatchNearest )
|
2003-03-27 16:59:30 +00:00
|
|
|
{
|
|
|
|
ImplJobSetup* pSetupData = aJobSetup.ImplGetData();
|
|
|
|
|
|
|
|
int nLandscapeAngle = GetLandscapeAngle();
|
|
|
|
int nPaperCount = GetPaperInfoCount();
|
2009-09-08 15:20:56 +00:00
|
|
|
bool bFound = false;
|
2003-03-27 16:59:30 +00:00
|
|
|
|
2009-06-12 09:36:34 +00:00
|
|
|
PaperInfo aInfo(pSetupData->mnPaperWidth, pSetupData->mnPaperHeight);
|
2003-03-27 16:59:30 +00:00
|
|
|
|
|
|
|
// Alle Papierformate vergleichen und ein passendes raussuchen
|
|
|
|
for ( int i = 0; i < nPaperCount; i++ )
|
|
|
|
{
|
2009-06-12 09:36:34 +00:00
|
|
|
const PaperInfo& rPaperInfo = GetPaperInfo( i );
|
2003-03-27 16:59:30 +00:00
|
|
|
|
2009-06-12 09:36:34 +00:00
|
|
|
if ( aInfo.sloppyEqual(rPaperInfo) )
|
2003-03-27 16:59:30 +00:00
|
|
|
{
|
2009-06-12 09:36:34 +00:00
|
|
|
pSetupData->mePaperFormat = ImplGetPaperFormat( rPaperInfo.getWidth(),
|
|
|
|
rPaperInfo.getHeight() );
|
2009-03-24 14:21:10 +00:00
|
|
|
pSetupData->meOrientation = ORIENTATION_PORTRAIT;
|
2009-09-08 15:20:56 +00:00
|
|
|
bFound = true;
|
2003-03-27 16:59:30 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// If the printer supports landscape orientation, check paper sizes again
|
|
|
|
// with landscape orientation. This is necessary as a printer driver provides
|
|
|
|
// all paper sizes with portrait orientation only!!
|
|
|
|
if ( pSetupData->mePaperFormat == PAPER_USER &&
|
|
|
|
nLandscapeAngle != 0 &&
|
|
|
|
HasSupport( SUPPORT_SET_ORIENTATION ))
|
|
|
|
{
|
2009-06-12 09:36:34 +00:00
|
|
|
|
|
|
|
PaperInfo aRotatedInfo(pSetupData->mnPaperHeight, pSetupData->mnPaperWidth);
|
|
|
|
|
2003-03-27 16:59:30 +00:00
|
|
|
for ( int i = 0; i < nPaperCount; i++ )
|
|
|
|
{
|
2009-06-12 09:36:34 +00:00
|
|
|
const PaperInfo& rPaperInfo = GetPaperInfo( i );
|
2003-03-27 16:59:30 +00:00
|
|
|
|
2009-06-12 09:36:34 +00:00
|
|
|
if ( aRotatedInfo.sloppyEqual( rPaperInfo ) )
|
2003-03-27 16:59:30 +00:00
|
|
|
{
|
2009-06-12 09:36:34 +00:00
|
|
|
pSetupData->mePaperFormat = ImplGetPaperFormat( rPaperInfo.getWidth(),
|
|
|
|
rPaperInfo.getHeight() );
|
2009-03-24 14:21:10 +00:00
|
|
|
pSetupData->meOrientation = ORIENTATION_LANDSCAPE;
|
2009-09-08 15:20:56 +00:00
|
|
|
bFound = true;
|
2003-03-27 16:59:30 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2009-09-08 15:20:56 +00:00
|
|
|
|
|
|
|
if( ! bFound && bMatchNearest )
|
|
|
|
{
|
|
|
|
sal_Int64 nBestMatch = SAL_MAX_INT64;
|
|
|
|
int nBestIndex = 0;
|
|
|
|
Orientation eBestOrientation = ORIENTATION_PORTRAIT;
|
|
|
|
for( int i = 0; i < nPaperCount; i++ )
|
|
|
|
{
|
|
|
|
const PaperInfo& rPaperInfo = GetPaperInfo( i );
|
|
|
|
|
|
|
|
// check protrait match
|
|
|
|
sal_Int64 nDX = pSetupData->mnPaperWidth - rPaperInfo.getWidth();
|
|
|
|
sal_Int64 nDY = pSetupData->mnPaperHeight - rPaperInfo.getHeight();
|
|
|
|
sal_Int64 nMatch = nDX*nDX + nDY*nDY;
|
|
|
|
if( nMatch < nBestMatch )
|
|
|
|
{
|
|
|
|
nBestMatch = nMatch;
|
|
|
|
nBestIndex = i;
|
|
|
|
eBestOrientation = ORIENTATION_PORTRAIT;
|
|
|
|
}
|
|
|
|
|
|
|
|
// check landscape match
|
|
|
|
nDX = pSetupData->mnPaperWidth - rPaperInfo.getHeight();
|
|
|
|
nDY = pSetupData->mnPaperHeight - rPaperInfo.getWidth();
|
|
|
|
nMatch = nDX*nDX + nDY*nDY;
|
|
|
|
if( nMatch < nBestMatch )
|
|
|
|
{
|
|
|
|
nBestMatch = nMatch;
|
|
|
|
nBestIndex = i;
|
|
|
|
eBestOrientation = ORIENTATION_LANDSCAPE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const PaperInfo& rBestInfo = GetPaperInfo( nBestIndex );
|
|
|
|
pSetupData->mePaperFormat = ImplGetPaperFormat( rBestInfo.getWidth(),
|
|
|
|
rBestInfo.getHeight() );
|
|
|
|
pSetupData->meOrientation = eBestOrientation;
|
|
|
|
}
|
2003-03-27 16:59:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool Printer::SetPaper( Paper ePaper )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( mbInPrintPage )
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( maJobSetup.ImplGetConstData()->mePaperFormat != ePaper )
|
|
|
|
{
|
|
|
|
JobSetup aJobSetup = maJobSetup;
|
|
|
|
ImplJobSetup* pSetupData = aJobSetup.ImplGetData();
|
|
|
|
pSetupData->mePaperFormat = ePaper;
|
|
|
|
if ( ePaper != PAPER_USER )
|
|
|
|
{
|
2009-06-12 09:36:34 +00:00
|
|
|
PaperInfo aInfo(ePaper);
|
|
|
|
pSetupData->mnPaperWidth = aInfo.getWidth();
|
|
|
|
pSetupData->mnPaperHeight = aInfo.getHeight();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( IsDisplayPrinter() )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbNewJobSetup = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
maJobSetup = aJobSetup;
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ImplReleaseGraphics();
|
2003-03-27 16:59:30 +00:00
|
|
|
if ( ePaper == PAPER_USER )
|
2009-09-08 15:20:56 +00:00
|
|
|
ImplFindPaperFormatForUserSize( aJobSetup, false );
|
2003-03-27 16:59:30 +00:00
|
|
|
if ( mpInfoPrinter->SetData( SAL_JOBSET_PAPERSIZE|SAL_JOBSET_ORIENTATION, pSetupData ) )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ImplUpdateJobSetupPaper( aJobSetup );
|
2010-09-29 15:46:40 +08:00
|
|
|
mbNewJobSetup = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
maJobSetup = aJobSetup;
|
|
|
|
ImplUpdatePageData();
|
|
|
|
ImplUpdateFontList();
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool Printer::SetPaperSizeUser( const Size& rSize )
|
2009-09-08 15:20:56 +00:00
|
|
|
{
|
|
|
|
return SetPaperSizeUser( rSize, false );
|
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool Printer::SetPaperSizeUser( const Size& rSize, bool bMatchNearest )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( mbInPrintPage )
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
Size aPixSize = LogicToPixel( rSize );
|
2009-06-12 09:36:34 +00:00
|
|
|
Size aPageSize = PixelToLogic( aPixSize, MAP_100TH_MM );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( (maJobSetup.ImplGetConstData()->mePaperFormat != PAPER_USER) ||
|
|
|
|
(maJobSetup.ImplGetConstData()->mnPaperWidth != aPageSize.Width()) ||
|
|
|
|
(maJobSetup.ImplGetConstData()->mnPaperHeight != aPageSize.Height()) )
|
|
|
|
{
|
|
|
|
JobSetup aJobSetup = maJobSetup;
|
|
|
|
ImplJobSetup* pSetupData = aJobSetup.ImplGetData();
|
|
|
|
pSetupData->mePaperFormat = PAPER_USER;
|
|
|
|
pSetupData->mnPaperWidth = aPageSize.Width();
|
|
|
|
pSetupData->mnPaperHeight = aPageSize.Height();
|
|
|
|
|
|
|
|
if ( IsDisplayPrinter() )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbNewJobSetup = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
maJobSetup = aJobSetup;
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ImplReleaseGraphics();
|
2009-09-08 15:20:56 +00:00
|
|
|
ImplFindPaperFormatForUserSize( aJobSetup, bMatchNearest );
|
2003-03-27 16:59:30 +00:00
|
|
|
|
|
|
|
// Changing the paper size can also change the orientation!
|
|
|
|
if ( mpInfoPrinter->SetData( SAL_JOBSET_PAPERSIZE|SAL_JOBSET_ORIENTATION, pSetupData ) )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ImplUpdateJobSetupPaper( aJobSetup );
|
2010-09-29 15:46:40 +08:00
|
|
|
mbNewJobSetup = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
maJobSetup = aJobSetup;
|
|
|
|
ImplUpdatePageData();
|
|
|
|
ImplUpdateFontList();
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2002-11-19 17:08:50 +00:00
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
int Printer::GetPaperInfoCount() const
|
|
|
|
{
|
|
|
|
if( ! mpInfoPrinter )
|
|
|
|
return 0;
|
|
|
|
if( ! mpInfoPrinter->m_bPapersInit )
|
2002-11-20 11:04:16 +00:00
|
|
|
mpInfoPrinter->InitPaperFormats( maJobSetup.ImplGetConstData() );
|
2002-11-19 17:08:50 +00:00
|
|
|
return mpInfoPrinter->m_aPaperFormats.size();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2009-06-12 09:36:34 +00:00
|
|
|
const PaperInfo& Printer::GetPaperInfo( int nPaper ) const
|
2002-11-19 17:08:50 +00:00
|
|
|
{
|
|
|
|
if( ! mpInfoPrinter )
|
|
|
|
return ImplGetEmptyPaper();
|
|
|
|
if( ! mpInfoPrinter->m_bPapersInit )
|
2002-11-20 11:04:16 +00:00
|
|
|
mpInfoPrinter->InitPaperFormats( maJobSetup.ImplGetConstData() );
|
2006-06-19 18:30:44 +00:00
|
|
|
if( mpInfoPrinter->m_aPaperFormats.empty() || nPaper < 0 || nPaper >= int(mpInfoPrinter->m_aPaperFormats.size()) )
|
2002-11-19 17:08:50 +00:00
|
|
|
return ImplGetEmptyPaper();
|
|
|
|
return mpInfoPrinter->m_aPaperFormats[nPaper];
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2005-01-31 08:18:44 +00:00
|
|
|
DuplexMode Printer::GetDuplexMode() const
|
|
|
|
{
|
2009-05-28 16:46:25 +00:00
|
|
|
return maJobSetup.ImplGetConstData()->meDuplexMode;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool Printer::SetDuplexMode( DuplexMode eDuplex )
|
2009-05-28 16:46:25 +00:00
|
|
|
{
|
|
|
|
if ( mbInPrintPage )
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2009-05-28 16:46:25 +00:00
|
|
|
|
|
|
|
if ( maJobSetup.ImplGetConstData()->meDuplexMode != eDuplex )
|
|
|
|
{
|
|
|
|
JobSetup aJobSetup = maJobSetup;
|
|
|
|
ImplJobSetup* pSetupData = aJobSetup.ImplGetData();
|
|
|
|
pSetupData->meDuplexMode = eDuplex;
|
|
|
|
|
|
|
|
if ( IsDisplayPrinter() )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbNewJobSetup = sal_True;
|
2009-05-28 16:46:25 +00:00
|
|
|
maJobSetup = aJobSetup;
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2009-05-28 16:46:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ImplReleaseGraphics();
|
|
|
|
if ( mpInfoPrinter->SetData( SAL_JOBSET_DUPLEXMODE, pSetupData ) )
|
|
|
|
{
|
|
|
|
ImplUpdateJobSetupPaper( aJobSetup );
|
2010-09-29 15:46:40 +08:00
|
|
|
mbNewJobSetup = sal_True;
|
2009-05-28 16:46:25 +00:00
|
|
|
maJobSetup = aJobSetup;
|
|
|
|
ImplUpdatePageData();
|
|
|
|
ImplUpdateFontList();
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2009-05-28 16:46:25 +00:00
|
|
|
}
|
|
|
|
else
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2009-05-28 16:46:25 +00:00
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2005-01-31 08:18:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2002-11-19 17:08:50 +00:00
|
|
|
int Printer::GetLandscapeAngle() const
|
|
|
|
{
|
2002-11-20 11:04:16 +00:00
|
|
|
return mpInfoPrinter ? mpInfoPrinter->GetLandscapeAngle( maJobSetup.ImplGetConstData() ) : 900;
|
2002-11-19 17:08:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
Paper Printer::GetPaper() const
|
|
|
|
{
|
|
|
|
return maJobSetup.ImplGetConstData()->mePaperFormat;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uInt16 Printer::GetPaperBinCount() const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( IsDisplayPrinter() )
|
|
|
|
return 0;
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
return (sal_uInt16)mpInfoPrinter->GetPaperBinCount( maJobSetup.ImplGetConstData() );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
XubString Printer::GetPaperBinName( sal_uInt16 nPaperBin ) const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( IsDisplayPrinter() )
|
|
|
|
return ImplGetSVEmptyStr();
|
|
|
|
|
|
|
|
if ( nPaperBin < GetPaperBinCount() )
|
|
|
|
return mpInfoPrinter->GetPaperBinName( maJobSetup.ImplGetConstData(), nPaperBin );
|
|
|
|
else
|
|
|
|
return ImplGetSVEmptyStr();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool Printer::SetCopyCount( sal_uInt16 nCopy, sal_Bool bCollate )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
mnCopyCount = nCopy;
|
2009-07-16 11:37:53 +00:00
|
|
|
mbCollateCopy = bCollate;
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void Printer::Error()
|
|
|
|
{
|
|
|
|
maErrorHdl.Call( this );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uIntPtr Printer::ImplSalPrinterErrorCodeToVCL( sal_uIntPtr nError )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uIntPtr nVCLError;
|
2000-09-18 16:07:07 +00:00
|
|
|
switch ( nError )
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
nVCLError = PRINTER_OK;
|
|
|
|
break;
|
|
|
|
case SAL_PRINTER_ERROR_ABORT:
|
|
|
|
nVCLError = PRINTER_ABORT;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
nVCLError = PRINTER_GENERALERROR;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return nVCLError;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void Printer::ImplEndPrint()
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbPrinting = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
mnCurPrintPage = 0;
|
|
|
|
maJobName.Erase();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
IMPL_LINK( Printer, ImplDestroyPrinterAsync, void*, pSalPrinter )
|
|
|
|
{
|
|
|
|
SalPrinter* pPrinter = (SalPrinter*)pSalPrinter;
|
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
|
|
|
pSVData->mpDefInst->DestroyPrinter( pPrinter );
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool Printer::EndJob()
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool bRet = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( !IsJobActive() )
|
2005-08-25 15:14:51 +00:00
|
|
|
return bRet;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
DBG_ASSERT( !mbInPrintPage, "Printer::EndJob() - StartPage() without EndPage() called" );
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
mbJobActive = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2009-06-12 15:22:27 +00:00
|
|
|
if ( mpPrinter )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ImplReleaseGraphics();
|
|
|
|
|
|
|
|
mnCurPage = 0;
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
bRet = sal_True;
|
2005-08-25 15:14:51 +00:00
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
mbPrinting = sal_False;
|
2009-06-12 15:22:27 +00:00
|
|
|
mnCurPrintPage = 0;
|
|
|
|
maJobName.Erase();
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
mbDevOutput = sal_False;
|
2009-06-12 15:22:27 +00:00
|
|
|
bRet = mpPrinter->EndJob();
|
|
|
|
// Hier den Drucker nicht asyncron zerstoeren, da es
|
|
|
|
// W95 nicht verkraftet, wenn gleichzeitig gedruckt wird
|
|
|
|
// und ein Druckerobjekt zerstoert wird
|
|
|
|
ImplGetSVData()->mpDefInst->DestroyPrinter( mpPrinter );
|
|
|
|
mpPrinter = NULL;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2005-08-25 15:14:51 +00:00
|
|
|
return bRet;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool Printer::AbortJob()
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
// Wenn wir einen Queue-Printer haben, kann man diesen noch mit
|
|
|
|
// AbortJob() abbrechen, solange dieser noch am Drucken ist
|
|
|
|
if ( !IsJobActive() && !IsPrinting() )
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
mbJobActive = sal_False;
|
|
|
|
mbInPrintPage = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
mpJobGraphics = NULL;
|
|
|
|
|
2009-06-12 15:22:27 +00:00
|
|
|
if ( mpPrinter )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbPrinting = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
mnCurPage = 0;
|
|
|
|
mnCurPrintPage = 0;
|
|
|
|
maJobName.Erase();
|
|
|
|
|
2009-06-12 15:22:27 +00:00
|
|
|
ImplReleaseGraphics();
|
2010-09-29 15:46:40 +08:00
|
|
|
mbDevOutput = sal_False;
|
2009-06-12 15:22:27 +00:00
|
|
|
mpPrinter->AbortJob();
|
|
|
|
Application::PostUserEvent( LINK( this, Printer, ImplDestroyPrinterAsync ), mpPrinter );
|
|
|
|
mpPrinter = NULL;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2009-06-12 15:22:27 +00:00
|
|
|
void Printer::ImplStartPage()
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( !IsJobActive() )
|
2009-06-12 15:22:27 +00:00
|
|
|
return;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2009-06-12 15:22:27 +00:00
|
|
|
if ( mpPrinter )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2009-06-12 15:22:27 +00:00
|
|
|
SalGraphics* pGraphics = mpPrinter->StartPage( maJobSetup.ImplGetConstData(), mbNewJobSetup );
|
|
|
|
if ( pGraphics )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2009-06-12 15:22:27 +00:00
|
|
|
ImplReleaseGraphics();
|
|
|
|
mpJobGraphics = pGraphics;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2010-09-29 15:46:40 +08:00
|
|
|
mbDevOutput = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// PrintJob not aborted ???
|
|
|
|
if ( IsJobActive() )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInPrintPage = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
mnCurPage++;
|
2009-06-12 15:22:27 +00:00
|
|
|
mnCurPrintPage++;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2009-06-12 15:22:27 +00:00
|
|
|
void Printer::ImplEndPage()
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( !IsJobActive() )
|
2009-06-12 15:22:27 +00:00
|
|
|
return;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInPrintPage = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2009-06-12 15:22:27 +00:00
|
|
|
if ( mpPrinter )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2009-06-12 15:22:27 +00:00
|
|
|
mpPrinter->EndPage();
|
|
|
|
ImplReleaseGraphics();
|
2010-09-29 15:46:40 +08:00
|
|
|
mbDevOutput = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
mpJobGraphics = NULL;
|
2010-09-29 15:46:40 +08:00
|
|
|
mbNewJobSetup = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2002-02-11 14:44:44 +00:00
|
|
|
}
|
2006-12-20 17:32:13 +00:00
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void Printer::updatePrinters()
|
|
|
|
{
|
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
|
|
|
ImplPrnQueueList* pPrnList = pSVData->maGDIData.mpPrinterQueueList;
|
|
|
|
|
|
|
|
if ( pPrnList )
|
|
|
|
{
|
|
|
|
ImplPrnQueueList* pNewList = new ImplPrnQueueList;
|
|
|
|
pSVData->mpDefInst->GetPrinterQueueInfo( pNewList );
|
|
|
|
|
|
|
|
bool bChanged = pPrnList->m_aQueueInfos.size() != pNewList->m_aQueueInfos.size();
|
|
|
|
for( unsigned int i = 0; ! bChanged && i < pPrnList->m_aQueueInfos.size(); i++ )
|
|
|
|
{
|
|
|
|
ImplPrnQueueData& rInfo = pPrnList->m_aQueueInfos[i];
|
|
|
|
ImplPrnQueueData& rNewInfo = pNewList->m_aQueueInfos[i];
|
|
|
|
if( ! rInfo.mpSalQueueInfo || ! rNewInfo.mpSalQueueInfo || // sanity check
|
|
|
|
rInfo.mpSalQueueInfo->maPrinterName != rNewInfo.mpSalQueueInfo->maPrinterName )
|
|
|
|
{
|
|
|
|
bChanged = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if( bChanged )
|
|
|
|
{
|
|
|
|
ImplDeletePrnQueueList();
|
|
|
|
pSVData->maGDIData.mpPrinterQueueList = pNewList;
|
|
|
|
|
|
|
|
Application* pApp = GetpApp();
|
|
|
|
if( pApp )
|
|
|
|
{
|
|
|
|
DataChangedEvent aDCEvt( DATACHANGED_PRINTER );
|
|
|
|
pApp->DataChanged( aDCEvt );
|
|
|
|
pApp->NotifyAllWindows( aDCEvt );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
delete pNewList;
|
|
|
|
}
|
|
|
|
}
|