Files
wxWidgets/src/mac/dcprint.cpp
Vadim Zeitlin eb7f8ac545 fixed compilation warnings
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20877 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2003-06-03 00:44:10 +00:00

417 lines
11 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: dcprint.cpp
// Purpose: wxPrinterDC class
// Author: Julian Smart
// Modified by:
// Created: 01/02/97
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "dcprint.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#endif
#include "wx/dcprint.h"
#include "wx/msgdlg.h"
#include <math.h>
#include "wx/mac/uma.h"
#include "wx/mac/private/print.h"
#if !USE_SHARED_LIBRARY
IMPLEMENT_CLASS(wxPrinterDC, wxDC)
#endif
class wxNativePrinterDC
{
public :
wxNativePrinterDC() {}
virtual ~wxNativePrinterDC() {}
virtual bool StartDoc( wxPrinterDC* dc , const wxString& message ) = 0;
virtual void EndDoc( wxPrinterDC* dc ) = 0;
virtual void StartPage( wxPrinterDC* dc ) = 0;
virtual void EndPage( wxPrinterDC* dc ) = 0;
virtual wxCoord GetMaxX() const = 0 ;
virtual wxCoord GetMaxY() const = 0 ;
// returns 0 in case of no Error, otherwise platform specific error codes
virtual wxUint32 GetStatus() const = 0 ;
bool Ok() { return GetStatus() == 0 ; }
static wxNativePrinterDC* Create(wxPrintData* data) ;
} ;
#if TARGET_CARBON
class wxMacCarbonPrinterDC : public wxNativePrinterDC
{
public :
wxMacCarbonPrinterDC( wxPrintData* data ) ;
~wxMacCarbonPrinterDC() ;
virtual bool StartDoc( wxPrinterDC* dc , const wxString& message ) ;
virtual void EndDoc( wxPrinterDC* dc ) ;
virtual void StartPage( wxPrinterDC* dc ) ;
virtual void EndPage( wxPrinterDC* dc ) ;
virtual wxCoord GetMaxX() const { return m_maxX ; }
virtual wxCoord GetMaxY() const { return m_maxY ; }
virtual wxUint32 GetStatus() const { return m_err ; }
private :
GrafPtr m_macPrintFormerPort ;
wxCoord m_maxX ;
wxCoord m_maxY ;
OSStatus m_err ;
} ;
wxMacCarbonPrinterDC::wxMacCarbonPrinterDC( wxPrintData* data )
{
::GetPort( & m_macPrintFormerPort ) ;
m_err = noErr ;
wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) data->m_nativePrintData ;
PMRect rPage;
m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage);
if ( m_err != noErr )
return;
m_maxX = wxCoord(rPage.right - rPage.left) ;
m_maxY = wxCoord(rPage.bottom - rPage.top);
}
wxMacCarbonPrinterDC::~wxMacCarbonPrinterDC()
{
// nothing to release from print data, as wxPrinterDC has all data in its wxPrintData member
::SetPort( m_macPrintFormerPort ) ;
}
wxNativePrinterDC* wxNativePrinterDC::Create(wxPrintData* data)
{
return new wxMacCarbonPrinterDC(data) ;
}
bool wxMacCarbonPrinterDC::StartDoc( wxPrinterDC* dc , const wxString& WXUNUSED(message) )
{
if ( m_err )
return false ;
wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) dc->GetPrintData().m_nativePrintData ;
m_err = PMSessionBeginDocument(native->m_macPrintSession,
native->m_macPrintSettings,
native->m_macPageFormat);
if ( m_err != noErr )
return false;
PMRect rPage;
m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage);
if ( m_err != noErr )
return false;
m_maxX = (wxCoord)(rPage.right - rPage.left);
m_maxY = (wxCoord)(rPage.bottom - rPage.top);
return true ;
}
void wxMacCarbonPrinterDC::EndDoc( wxPrinterDC* dc )
{
if ( m_err )
return ;
wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) dc->GetPrintData().m_nativePrintData ;
m_err = PMSessionEndDocument(native->m_macPrintSession);
}
void wxMacCarbonPrinterDC::StartPage( wxPrinterDC* dc )
{
if ( m_err )
return ;
wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) dc->GetPrintData().m_nativePrintData ;
m_err = PMSessionBeginPage(native->m_macPrintSession,
native->m_macPageFormat,
nil);
if ( m_err == noErr )
{
m_err = PMSessionGetGraphicsContext(native->m_macPrintSession,
nil,
(void**) &dc->m_macPort );
}
if ( m_err != noErr )
{
PMSessionEndPage(native->m_macPrintSession);
PMSessionEndDocument(native->m_macPrintSession);
}
else
{
PMRect rPage;
m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage);
if ( !m_err )
{
dc->m_macLocalOrigin.x = (int) rPage.left;
dc->m_macLocalOrigin.y = (int) rPage.top;
}
// since this is a non-critical error, we set the flag back
m_err = noErr ;
}
}
void wxMacCarbonPrinterDC::EndPage( wxPrinterDC* dc )
{
if ( m_err )
return ;
wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) dc->GetPrintData().m_nativePrintData ;
m_err = PMSessionEndPage(native->m_macPrintSession);
if ( m_err != noErr )
{
PMSessionEndDocument(native->m_macPrintSession);
}
}
#else
class wxMacClassicPrinterDC : public wxNativePrinterDC
{
public :
wxMacClassicPrinterDC( wxPrintData* data ) ;
~wxMacClassicPrinterDC() ;
virtual bool StartDoc( wxPrinterDC* dc , const wxString& message ) ;
virtual void EndDoc( wxPrinterDC* dc ) ;
virtual void StartPage( wxPrinterDC* dc ) ;
virtual void EndPage( wxPrinterDC* dc ) ;
virtual wxCoord GetMaxX() const { return m_maxX ; }
virtual wxCoord GetMaxY() const { return m_maxY ; }
virtual wxUint32 GetStatus() const { return m_err ; }
private :
GrafPtr m_macPrintFormerPort ;
TPPrPort m_macPrintingPort ;
OSErr m_err ;
long m_maxX ;
long m_maxY ;
} ;
wxNativePrinterDC* wxNativePrinterDC::Create(wxPrintData* data)
{
return new wxMacClassicPrinterDC(data) ;
}
wxMacClassicPrinterDC::wxMacClassicPrinterDC(wxPrintData* data)
{
::GetPort( &m_macPrintFormerPort ) ;
m_err = noErr ;
::UMAPrOpen() ;
m_err = PrError() ;
if ( m_err != noErr )
return;
wxMacClassicPrintData *native = (wxMacClassicPrintData*) data->m_nativePrintData ;
if ( ::PrValidate( native->m_macPrintSettings ) )
{
// the driver has changed in the mean time, should we pop up a page setup dialog ?
if ( !::PrStlDialog( native->m_macPrintSettings ) )
{
m_err = -1 ;
return;
}
}
m_err = PrError() ;
if ( m_err == noErr )
{
m_maxX = (**native->m_macPrintSettings).prInfo.rPage.right - (**native->m_macPrintSettings).prInfo.rPage.left ;
m_maxY = (**native->m_macPrintSettings).prInfo.rPage.bottom - (**native->m_macPrintSettings).prInfo.rPage.top ;
}
}
wxMacClassicPrinterDC::~wxMacClassicPrinterDC()
{
::UMAPrClose() ;
::SetPort( LMGetWMgrPort() ) ;
}
bool wxMacClassicPrinterDC::StartDoc( wxPrinterDC* dc , const wxString& WXUNUSED(message) )
{
if ( m_err )
return false ;
wxMacClassicPrintData *native = (wxMacClassicPrintData*) dc->GetPrintData().m_nativePrintData ;
m_macPrintingPort = ::PrOpenDoc( native->m_macPrintSettings , NULL , NULL ) ;
m_err = PrError() ;
if ( m_err )
return false ;
// sets current port
dc->m_macPort = (GrafPtr ) m_macPrintingPort ;
m_maxX = (**native->m_macPrintSettings).prInfo.rPage.right - (**native->m_macPrintSettings).prInfo.rPage.left ;
m_maxY = (**native->m_macPrintSettings).prInfo.rPage.bottom - (**native->m_macPrintSettings).prInfo.rPage.top ;
return true ;
}
void wxMacClassicPrinterDC::EndDoc( wxPrinterDC* dc )
{
if ( m_err )
return ;
PrCloseDoc( m_macPrintingPort ) ;
m_err = PrError() ;
}
void wxMacClassicPrinterDC::StartPage( wxPrinterDC* dc )
{
if ( m_err )
return ;
wxMacClassicPrintData *native = (wxMacClassicPrintData*) dc->GetPrintData().m_nativePrintData ;
PrOpenPage( m_macPrintingPort , NULL ) ;
dc->m_macLocalOrigin.x = (**native->m_macPrintSettings).rPaper.left ;
dc->m_macLocalOrigin.y = (**native->m_macPrintSettings).rPaper.top ;
// m_macPrintingPort is now the current port
Rect clip = { -32000 , -32000 , 32000 , 32000 } ;
::ClipRect( &clip ) ;
m_err = PrError() ;
if ( m_err != noErr )
::PrCloseDoc( m_macPrintingPort ) ;
}
void wxMacClassicPrinterDC::EndPage( wxPrinterDC* dc )
{
if ( m_err )
return ;
PrClosePage( m_macPrintingPort ) ;
m_err = PrError() ;
if ( m_err != noErr )
::PrCloseDoc( m_macPrintingPort ) ;
}
#endif
wxPrinterDC::wxPrinterDC(const wxPrintData& printdata)
{
m_ok = FALSE ;
m_printData = printdata ;
m_printData.ConvertToNative() ;
m_nativePrinterDC = wxNativePrinterDC::Create( &m_printData ) ;
if ( m_nativePrinterDC )
{
m_ok = m_nativePrinterDC->Ok() ;
if ( !m_ok )
{
wxString message ;
message.Printf( wxT("Print Error %u"), m_nativePrinterDC->GetStatus() ) ;
wxMessageDialog dialog( NULL , message , wxEmptyString, wxICON_HAND | wxOK) ;
dialog.ShowModal();
}
}
}
wxPrinterDC::~wxPrinterDC(void)
{
delete m_nativePrinterDC ;
}
bool wxPrinterDC::StartDoc( const wxString& message )
{
wxASSERT_MSG( Ok() , wxT("Called wxPrinterDC::StartDoc from an invalid object") ) ;
if ( !m_ok )
return false ;
if ( m_nativePrinterDC->StartDoc(this, message ) )
{
// in case we have to do additional things when successful
}
m_ok = m_nativePrinterDC->Ok() ;
if ( !m_ok )
{
wxString message ;
message.Printf( wxT("Print Error %u"), m_nativePrinterDC->GetStatus() ) ;
wxMessageDialog dialog( NULL , message , wxEmptyString, wxICON_HAND | wxOK) ;
dialog.ShowModal();
}
return m_ok ;
}
void wxPrinterDC::EndDoc(void)
{
if ( !m_ok )
return ;
m_nativePrinterDC->EndDoc( this ) ;
m_ok = m_nativePrinterDC->Ok() ;
if ( !m_ok )
{
wxString message ;
message.Printf( wxT("Print Error %u"), m_nativePrinterDC->GetStatus() ) ;
wxMessageDialog dialog( NULL , message , wxEmptyString, wxICON_HAND | wxOK) ;
dialog.ShowModal();
}
}
void wxPrinterDC::StartPage(void)
{
if ( !m_ok )
return ;
m_logicalFunction = wxCOPY;
// m_textAlignment = wxALIGN_TOP_LEFT;
m_backgroundMode = wxTRANSPARENT;
m_textForegroundColour = *wxBLACK;
m_textBackgroundColour = *wxWHITE;
m_pen = *wxBLACK_PEN;
m_font = *wxNORMAL_FONT;
m_brush = *wxTRANSPARENT_BRUSH;
m_backgroundBrush = *wxWHITE_BRUSH;
m_macFontInstalled = false ;
m_macBrushInstalled = false ;
m_macPenInstalled = false ;
m_nativePrinterDC->StartPage(this) ;
m_ok = m_nativePrinterDC->Ok() ;
}
void wxPrinterDC::EndPage(void)
{
if ( !m_ok )
return ;
m_nativePrinterDC->EndPage(this) ;
m_ok = m_nativePrinterDC->Ok() ;
}
void wxPrinterDC::DoGetSize(int *width, int *height) const
{
wxCHECK_RET( m_ok , _T("GetSize() doesn't work without a valid wxPrinterDC") );
if ( width )
* width = m_nativePrinterDC->GetMaxX() ;
if ( height )
* height = m_nativePrinterDC->GetMaxY() ;
}