1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
#include "clPrintout.h"
#include "cl_editor.h"
//----------------------------------------------------------------------------
// clPrintout
//----------------------------------------------------------------------------
extern wxPageSetupDialogData* g_pageSetupData;
clPrintout::clPrintout(clEditor* edit, const wxString& title)
: wxPrintout(title)
, m_edit(edit)
, m_minPage(0)
, m_maxPage(0)
{
}
bool clPrintout::OnPrintPage(int page)
{
wxDC* dc = GetDC();
if(!dc) return false;
// scale DC
PrintScaling(dc);
// print page
m_edit->FormatRange(true, page == 1 ? 0 : m_pageEnds[page-2], m_pageEnds[page-1],
dc, dc, m_printRect, m_pageRect);
return true;
}
bool clPrintout::OnBeginDocument(int startPage, int endPage)
{
if(!wxPrintout::OnBeginDocument(startPage, endPage)) {
return false;
}
return true;
}
void clPrintout::GetPageInfo(int* minPage, int* maxPage, int* selPageFrom, int* selPageTo)
{
// initialize values
*minPage = 0;
*maxPage = 0;
*selPageFrom = 0;
*selPageTo = 0;
// scale DC if possible
wxDC* dc = GetDC();
if(!dc) return;
PrintScaling(dc);
// get print page informations and convert to printer pixels
wxSize ppiScr;
GetPPIScreen(&ppiScr.x, &ppiScr.y);
wxSize page = g_pageSetupData->GetPaperSize();
page.x = static_cast<int>(page.x * ppiScr.x / 25.4);
page.y = static_cast<int>(page.y * ppiScr.y / 25.4);
// In landscape mode we need to swap the width and height
if ( g_pageSetupData->GetPrintData().GetOrientation() == wxLANDSCAPE ) {
wxSwap(page.x, page.y);
}
m_pageRect = wxRect(0, 0, page.x, page.y);
// get margins informations and convert to printer pixels
wxPoint pt = g_pageSetupData->GetMarginTopLeft();
int left = pt.x;
int top = pt.y;
pt = g_pageSetupData->GetMarginBottomRight();
int right = pt.x;
int bottom = pt.y;
top = static_cast<int>(top * ppiScr.y / 25.4);
bottom = static_cast<int>(bottom * ppiScr.y / 25.4);
left = static_cast<int>(left * ppiScr.x / 25.4);
right = static_cast<int>(right * ppiScr.x / 25.4);
m_printRect = wxRect(left, top, page.x - (left + right), page.y - (top + bottom));
// count pages
m_pageEnds.Clear();
int printed = 0;
while ( printed < m_edit->GetLength() ) {
printed = m_edit->FormatRange(false, printed, m_edit->GetLength(),
dc, dc, m_printRect, m_pageRect);
m_pageEnds.Add(printed);
*maxPage += 1;
}
if(*maxPage > 0) *minPage = 1;
*selPageFrom = *minPage;
*selPageTo = *maxPage;
m_minPage = *minPage;
m_maxPage = *maxPage;
}
bool clPrintout::HasPage(int page) { return page <= (int)m_pageEnds.Count(); }
bool clPrintout::PrintScaling(wxDC* dc)
{
// check for dc, return if none
if(!dc) return false;
// get printer and screen sizing values
wxSize ppiScr;
GetPPIScreen(&ppiScr.x, &ppiScr.y);
if(ppiScr.x == 0) { // most possible guess 96 dpi
ppiScr.x = 96;
ppiScr.y = 96;
}
wxSize ppiPrt;
GetPPIPrinter(&ppiPrt.x, &ppiPrt.y);
if(ppiPrt.x == 0) { // scaling factor to 1
ppiPrt.x = ppiScr.x;
ppiPrt.y = ppiScr.y;
}
wxSize dcSize = dc->GetSize();
wxSize pageSize;
GetPageSizePixels(&pageSize.x, &pageSize.y);
// set user scale
float scale_x = (float)(ppiPrt.x * dcSize.x) / (float)(ppiScr.x * pageSize.x);
float scale_y = (float)(ppiPrt.y * dcSize.y) / (float)(ppiScr.y * pageSize.y);
dc->SetUserScale(scale_x, scale_y);
return true;
}
|