#include "wx/utils.h"
#include "wx/dc.h"
#include "wx/app.h"
+ #include "wx/math.h"
#include "wx/msgdlg.h"
#include "wx/layout.h"
#include "wx/choice.h"
#include "wx/button.h"
#include "wx/settings.h"
#include "wx/dcmemory.h"
+ #include "wx/dcclient.h"
#include "wx/stattext.h"
#include "wx/intl.h"
#include "wx/textdlg.h"
#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
#include "wx/msw/printdlg.h"
+#include "wx/msw/dcprint.h"
#elif defined(__WXMAC__)
-#include "wx/mac/printdlg.h"
-#include "wx/mac/private/print.h"
+#include "wx/osx/printdlg.h"
+#include "wx/osx/private/print.h"
+#include "wx/osx/dcprint.h"
+#elif defined(__WXPM__)
+#include "wx/os2/dcprint.h"
+#include "wx/generic/prntdlgg.h"
#else
#include "wx/generic/prntdlgg.h"
#include "wx/dcps.h"
#endif
}
-wxDC* wxNativePrintFactory::CreatePrinterDC( const wxPrintData& data )
+wxDCImpl* wxNativePrintFactory::CreatePrinterDCImpl( wxPrinterDC *owner, const wxPrintData& data )
{
-#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
- return new wxPrinterDC(data);
-#elif defined(__WXMAC__)
- return new wxPrinterDC(data);
+#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXUNIVERSAL__)
+ return new wxPostScriptDCImpl( owner, data );
#else
- return new wxPostScriptDC(data);
+ return new wxPrinterDCImpl( owner, data );
#endif
}
GetPageSizeMM(&mw, &mh);
float mmToDeviceX = float(pw) / mw;
float mmToDeviceY = float(ph) / mh;
- wxRect pageMarginsRect(paperRect.x + wxCoord(mmToDeviceX * topLeft.x),
- paperRect.y + wxCoord(mmToDeviceY * topLeft.y),
- paperRect.width - wxCoord(mmToDeviceX * (topLeft.x + bottomRight.x)),
- paperRect.height - wxCoord(mmToDeviceY * (topLeft.y + bottomRight.y)));
+ wxRect pageMarginsRect(paperRect.x + wxRound(mmToDeviceX * topLeft.x),
+ paperRect.y + wxRound(mmToDeviceY * topLeft.y),
+ paperRect.width - wxRound(mmToDeviceX * (topLeft.x + bottomRight.x)),
+ paperRect.height - wxRound(mmToDeviceY * (topLeft.y + bottomRight.y)));
wxCoord w, h;
m_printoutDC->GetSize(&w, &h);
float scaleX = (float(pageMarginsRect.width) * w) / (float(pw) * imageSize.x);
// This DC doesn't match the printed page, so we have to scale.
float scaleX = float(w) / pw;
float scaleY = float(h) / ph;
- return wxRect(m_printoutDC->DeviceToLogicalX(wxCoord(paperRect.x * scaleX)),
- m_printoutDC->DeviceToLogicalY(wxCoord(paperRect.y * scaleY)),
- m_printoutDC->DeviceToLogicalXRel(wxCoord(paperRect.width * scaleX)),
- m_printoutDC->DeviceToLogicalYRel(wxCoord(paperRect.height * scaleY)));
+ return wxRect(m_printoutDC->DeviceToLogicalX(wxRound(paperRect.x * scaleX)),
+ m_printoutDC->DeviceToLogicalY(wxRound(paperRect.y * scaleY)),
+ m_printoutDC->DeviceToLogicalXRel(wxRound(paperRect.width * scaleX)),
+ m_printoutDC->DeviceToLogicalYRel(wxRound(paperRect.height * scaleY)));
}
wxRect wxPrintout::GetLogicalPageRect() const
// Return the rectangle in logical units that corresponds to the region
// within the page margins as specified by the given wxPageSetupDialogData
// object.
- wxRect paperRect = GetPaperRectPixels();
+
+ // We get the paper size in device units and the margins in mm,
+ // so we need to calculate the conversion with this trick
wxCoord pw, ph;
GetPageSizePixels(&pw, &ph);
- wxPoint topLeft = pageSetupData.GetMarginTopLeft();
- wxPoint bottomRight = pageSetupData.GetMarginBottomRight();
wxCoord mw, mh;
GetPageSizeMM(&mw, &mh);
float mmToDeviceX = float(pw) / mw;
float mmToDeviceY = float(ph) / mh;
- wxRect pageMarginsRect(paperRect.x + wxCoord(mmToDeviceX * topLeft.x),
- paperRect.y + wxCoord(mmToDeviceY * topLeft.y),
- paperRect.width - wxCoord(mmToDeviceX * (topLeft.x + bottomRight.x)),
- paperRect.height - wxCoord(mmToDeviceY * (topLeft.y + bottomRight.y)));
+
+ // paper size in device units
+ wxRect paperRect = GetPaperRectPixels();
+
+ // margins in mm
+ wxPoint topLeft = pageSetupData.GetMarginTopLeft();
+ wxPoint bottomRight = pageSetupData.GetMarginBottomRight();
+
+ // calculate margins in device units
+ wxRect pageMarginsRect(
+ paperRect.x + wxRound(mmToDeviceX * topLeft.x),
+ paperRect.y + wxRound(mmToDeviceY * topLeft.y),
+ paperRect.width - wxRound(mmToDeviceX * (topLeft.x + bottomRight.x)),
+ paperRect.height - wxRound(mmToDeviceY * (topLeft.y + bottomRight.y)));
+
wxCoord w, h;
m_printoutDC->GetSize(&w, &h);
- if (w == pw && h == ph) {
+ if (w == pw && h == ph)
+ {
// this DC matches the printed page, so no scaling
- return wxRect(m_printoutDC->DeviceToLogicalX(pageMarginsRect.x),
+ return wxRect(
+ m_printoutDC->DeviceToLogicalX(pageMarginsRect.x),
m_printoutDC->DeviceToLogicalY(pageMarginsRect.y),
m_printoutDC->DeviceToLogicalXRel(pageMarginsRect.width),
m_printoutDC->DeviceToLogicalYRel(pageMarginsRect.height));
}
+
// This DC doesn't match the printed page, so we have to scale.
float scaleX = float(w) / pw;
float scaleY = float(h) / ph;
- return wxRect(m_printoutDC->DeviceToLogicalX(wxCoord(pageMarginsRect.x * scaleX)),
- m_printoutDC->DeviceToLogicalY(wxCoord(pageMarginsRect.y * scaleY)),
- m_printoutDC->DeviceToLogicalXRel(wxCoord(pageMarginsRect.width * scaleX)),
- m_printoutDC->DeviceToLogicalYRel(wxCoord(pageMarginsRect.height * scaleY)));
+ return wxRect(m_printoutDC->DeviceToLogicalX(wxRound(pageMarginsRect.x * scaleX)),
+ m_printoutDC->DeviceToLogicalY(wxRound(pageMarginsRect.y * scaleY)),
+ m_printoutDC->DeviceToLogicalXRel(wxRound(pageMarginsRect.width * scaleX)),
+ m_printoutDC->DeviceToLogicalYRel(wxRound(pageMarginsRect.height * scaleY)));
}
void wxPrintout::SetLogicalOrigin(wxCoord x, wxCoord y)
{
// Set the device origin by specifying a point in logical coordinates.
- m_printoutDC->SetDeviceOrigin(m_printoutDC->LogicalToDeviceX(x),
- m_printoutDC->LogicalToDeviceY(y));
+ m_printoutDC->SetDeviceOrigin(
+ m_printoutDC->LogicalToDeviceX(x),
+ m_printoutDC->LogicalToDeviceY(y) );
}
void wxPrintout::OffsetLogicalOrigin(wxCoord xoff, wxCoord yoff)
{
// Offset the device origin by a specified distance in device coordinates.
- wxCoord x = m_printoutDC->LogicalToDeviceX(0);
- wxCoord y = m_printoutDC->LogicalToDeviceY(0);
- m_printoutDC->SetDeviceOrigin(x + m_printoutDC->LogicalToDeviceXRel(xoff),
- y + m_printoutDC->LogicalToDeviceYRel(yoff));
+ wxPoint dev_org = m_printoutDC->GetDeviceOrigin();
+ m_printoutDC->SetDeviceOrigin(
+ dev_org.x + m_printoutDC->LogicalToDeviceXRel(xoff),
+ dev_org.y + m_printoutDC->LogicalToDeviceYRel(yoff) );
}
BEGIN_EVENT_TABLE(wxPreviewCanvas, wxScrolledWindow)
EVT_PAINT(wxPreviewCanvas::OnPaint)
EVT_CHAR(wxPreviewCanvas::OnChar)
+ EVT_IDLE(wxPreviewCanvas::OnIdle)
EVT_SYS_COLOUR_CHANGED(wxPreviewCanvas::OnSysColourChanged)
#if wxUSE_MOUSEWHEEL
EVT_MOUSEWHEEL(wxPreviewCanvas::OnMouseWheel)
}
}
+void wxPreviewCanvas::OnIdle(wxIdleEvent& event)
+{
+ if ( m_printPreview )
+ {
+ if ( m_printPreview->UpdatePageRendering() )
+ Refresh();
+ }
+ event.Skip();
+}
+
// Responds to colour changes, and passes event on to children.
void wxPreviewCanvas::OnSysColourChanged(wxSysColourChangedEvent& event)
{
void wxPreviewCanvas::OnChar(wxKeyEvent &event)
{
wxPreviewControlBar* controlBar = ((wxPreviewFrame*) GetParent())->GetControlBar();
- if (event.GetKeyCode() == WXK_ESCAPE)
- {
- ((wxPreviewFrame*) GetParent())->Close(true);
- return;
- }
- else if (event.GetKeyCode() == WXK_TAB)
- {
- controlBar->OnGoto();
- return;
- }
- else if (event.GetKeyCode() == WXK_RETURN)
+ switch (event.GetKeyCode())
{
- controlBar->OnPrint();
- return;
+ case WXK_TAB:
+ controlBar->OnGoto();
+ return;
+ case WXK_RETURN:
+ controlBar->OnPrint();
+ return;
}
if (!event.ControlDown())
IMPLEMENT_CLASS(wxPreviewFrame, wxFrame)
BEGIN_EVENT_TABLE(wxPreviewFrame, wxFrame)
+ EVT_CHAR_HOOK(wxPreviewFrame::OnChar)
EVT_CLOSE(wxPreviewFrame::OnCloseWindow)
END_EVENT_TABLE()
+void wxPreviewFrame::OnChar(wxKeyEvent &event)
+{
+ if ( event.GetKeyCode() == WXK_ESCAPE )
+ {
+ Close(true);
+ }
+ else
+ {
+ event.Skip();
+ }
+}
+
wxPreviewFrame::wxPreviewFrame(wxPrintPreviewBase *preview, wxWindow *parent, const wxString& title,
const wxPoint& pos, const wxSize& size, long style, const wxString& name):
wxFrame(parent, wxID_ANY, title, pos, size, style, name)
m_printPreview->SetCanvas(NULL);
m_printPreview->SetFrame(NULL);
}
- delete m_printPreview;
+
+ m_previewCanvas->SetPreview(NULL);
+ wxDELETE(m_printPreview);
Destroy();
}
{
AdjustScrollbars(m_previewCanvas);
- if (!RenderPage(pageNum))
- return false;
m_previewCanvas->Refresh();
m_previewCanvas->SetFocus();
}
}
+bool wxPrintPreviewBase::UpdatePageRendering()
+{
+ if ( m_previewBitmap )
+ return false;
+
+ if ( !RenderPage(m_currentPage) )
+ return false;
+
+ return true;
+}
+
bool wxPrintPreviewBase::PaintPage(wxPreviewCanvas *canvas, wxDC& dc)
{
DrawBlankPage(canvas, dc);
- if (!m_previewBitmap)
- if (!RenderPage(m_currentPage))
- return false;
if (!m_previewBitmap)
return false;
if (!canvas)
if (m_previewCanvas)
{
AdjustScrollbars(m_previewCanvas);
- RenderPage(m_currentPage);
((wxScrolledWindow *) m_previewCanvas)->Scroll(0, 0);
m_previewCanvas->ClearBackground();
m_previewCanvas->Refresh();
return m_pimpl->PaintPage( canvas, dc );
}
+bool wxPrintPreview::UpdatePageRendering()
+{
+ return m_pimpl->UpdatePageRendering();
+}
+
bool wxPrintPreview::DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc)
{
return m_pimpl->DrawBlankPage( canvas, dc );