#include "wx/wx.h"
#endif
-#if wxUSE_HTML & wxUSE_PRINTING_ARCHITECTURE
+#if wxUSE_HTML && wxUSE_PRINTING_ARCHITECTURE && wxUSE_STREAMS
#include "wx/print.h"
#include "wx/printdlg.h"
m_Parser = new wxHtmlWinParser(NULL);
m_FS = new wxFileSystem();
m_Parser -> SetFS(m_FS);
- m_Scale = 1.0;
}
-void wxHtmlDCRenderer::SetDC(wxDC *dc, int maxwidth)
+void wxHtmlDCRenderer::SetDC(wxDC *dc, double pixel_scale)
{
- int dx, dy;
-
- wxDisplaySize(&dx, &dy);
- m_MaxWidth = maxwidth;
-#if 0
- m_Scale = (float)dx * 2 / 3 / (float)maxwidth;
- // let the width of A4 is approximately 2/3 the screen width
-#endif
- m_Scale = (float)800 / (float)maxwidth;
- // for now, assume screen width = 800 => good results
-
m_DC = dc;
- m_Parser -> SetDC(dc);
+ m_Parser -> SetDC(m_DC, pixel_scale);
}
void wxHtmlDCRenderer::SetSize(int width, int height)
{
- m_Width = (int)(width * m_Scale);
- m_Height = (int)(height * m_Scale);
+ m_Width = width;
+ m_Height = height;
}
if (m_Cells != NULL) delete m_Cells;
m_FS -> ChangePathTo(basepath, isdir);
- m_DC -> SetUserScale(1.0, 1.0);
m_Cells = (wxHtmlContainerCell*) m_Parser -> Parse(html);
m_Cells -> SetIndent(0, wxHTML_INDENT_ALL, wxHTML_UNITS_PIXELS);
m_Cells -> Layout(m_Width);
int wxHtmlDCRenderer::Render(int x, int y, int from, int dont_render)
{
- int pbreak;
+ int pbreak, hght;
if (m_Cells == NULL || m_DC == NULL) return 0;
- pbreak = (int)(from * m_Scale + m_Height);
+ pbreak = (int)(from + m_Height);
while (m_Cells -> AdjustPagebreak(&pbreak)) {}
+ hght = pbreak - from;
if (!dont_render) {
- int w, h;
- m_DC -> GetSize(&w, &h);
- float overallScale = (float)(w/(float)m_MaxWidth) / m_Scale;
- m_DC -> SetUserScale(overallScale, overallScale);
-
m_DC -> SetBrush(*wxWHITE_BRUSH);
- m_DC -> SetClippingRegion(x * m_Scale, y * m_Scale, m_Width, m_Height);
+ m_DC -> SetClippingRegion(x, y, m_Width, hght);
m_Cells -> Draw(*m_DC,
- x * m_Scale, (y - from) * m_Scale,
- y * m_Scale, pbreak + (y - from) * m_Scale);
+ x, (y - from),
+ y, pbreak + (y /*- from*/));
m_DC -> DestroyClippingRegion();
}
- if (pbreak < m_Cells -> GetHeight()) return (int)(pbreak / m_Scale);
+ if (pbreak < m_Cells -> GetHeight()) return pbreak;
else return GetTotalHeight();
}
int wxHtmlDCRenderer::GetTotalHeight()
{
- if (m_Cells) return (int)(m_Cells -> GetHeight() / m_Scale);
+ if (m_Cells) return m_Cells -> GetHeight();
else return 0;
}
-void wxHtmlPrintout::OnBeginPrinting()
+bool wxHtmlPrintout::OnBeginDocument(int startPage, int endPage)
{
- int pageWidth, pageHeight, mm_w, mm_h;
+ int pageWidth, pageHeight, mm_w, mm_h, scr_w, scr_h, dc_w, dc_h;
float ppmm_h, ppmm_v;
- wxPrintout::OnBeginPrinting();
+ if (!wxPrintout::OnBeginDocument(startPage, endPage)) return FALSE;
GetPageSizePixels(&pageWidth, &pageHeight);
GetPageSizeMM(&mm_w, &mm_h);
ppmm_h = (float)pageWidth / mm_w;
ppmm_v = (float)pageHeight / mm_h;
+ int ppiPrinterX, ppiPrinterY;
+ GetPPIPrinter(&ppiPrinterX, &ppiPrinterY);
+ int ppiScreenX, ppiScreenY;
+ GetPPIScreen(&ppiScreenX, &ppiScreenY);
+
+ wxDisplaySize(&scr_w, &scr_h);
+ GetDC() -> GetSize(&dc_w, &dc_h);
+
+ GetDC() -> SetUserScale((double)dc_w / (double)pageWidth, (double)dc_w / (double)pageWidth);
+
/* prepare headers/footers renderer: */
- m_RendererHdr -> SetDC(GetDC(), pageWidth);
- m_RendererHdr -> SetSize(ppmm_h * (mm_w - m_MarginLeft - m_MarginTop),
- ppmm_v * (mm_h - m_MarginTop - m_MarginBottom));
+ m_RendererHdr -> SetDC(GetDC(), (double)ppiPrinterY / (double)ppiScreenY);
+ m_RendererHdr -> SetSize((int) (ppmm_h * (mm_w - m_MarginLeft - m_MarginTop)),
+ (int) (ppmm_v * (mm_h - m_MarginTop - m_MarginBottom)));
if (m_Headers[0] != wxEmptyString) {
m_RendererHdr -> SetHtmlText(TranslateHeader(m_Headers[0], 1));
m_HeaderHeight = m_RendererHdr -> GetTotalHeight();
}
/* prepare main renderer: */
- m_Renderer -> SetDC(GetDC(), pageWidth);
- m_Renderer -> SetSize(ppmm_h * (mm_w - m_MarginLeft - m_MarginTop),
- ppmm_v * (mm_h - m_MarginTop - m_MarginBottom) -
+ m_Renderer -> SetDC(GetDC(), (double)ppiPrinterY / (double)ppiScreenY);
+ m_Renderer -> SetSize((int) (ppmm_h * (mm_w - m_MarginLeft - m_MarginTop)),
+ (int) (ppmm_v * (mm_h - m_MarginTop - m_MarginBottom) -
m_FooterHeight - m_HeaderHeight -
((m_HeaderHeight == 0) ? 0 : m_MarginSpace * ppmm_v) -
((m_FooterHeight == 0) ? 0 : m_MarginSpace * ppmm_v)
- );
+ ));
m_Renderer -> SetHtmlText(m_Document, m_BasePath, m_BasePathIsDir);
CountPages();
+ return TRUE;
}
{
wxFileSystem fs;
wxFSFile *ff = fs.OpenFile(htmlfile);
+
+ if (ff == NULL)
+ {
+ wxLogError(htmlfile + _(": file does not exist!"));
+ return;
+ }
+
wxInputStream *st = ff -> GetStream();
char *t = new char[st -> GetSize() + 1];
st -> Read(t, st -> GetSize());
m_PageBreaks[0] = 0;
do {
- pos = m_Renderer -> Render(ppmm_h * m_MarginLeft,
- ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight,
+ pos = m_Renderer -> Render((int)( ppmm_h * m_MarginLeft),
+ (int) (ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight),
pos, TRUE);
m_PageBreaks[++m_NumPages] = pos;
} while (pos < m_Renderer -> GetTotalHeight());
{
wxBusyCursor wait;
- int pageWidth, pageHeight, mm_w, mm_h;
+ int pageWidth, pageHeight, mm_w, mm_h, scr_w, scr_h, dc_w, dc_h;
float ppmm_h, ppmm_v;
GetPageSizePixels(&pageWidth, &pageHeight);
GetPageSizeMM(&mm_w, &mm_h);
ppmm_h = (float)pageWidth / mm_w;
ppmm_v = (float)pageHeight / mm_h;
-
- m_Renderer -> SetDC(dc, pageWidth);
+ wxDisplaySize(&scr_w, &scr_h);
+ dc -> GetSize(&dc_w, &dc_h);
+
+ int ppiPrinterX, ppiPrinterY;
+ GetPPIPrinter(&ppiPrinterX, &ppiPrinterY);
+ int ppiScreenX, ppiScreenY;
+ GetPPIScreen(&ppiScreenX, &ppiScreenY);
+ dc -> SetUserScale((double)dc_w / (double)pageWidth, (double)dc_w / (double)pageWidth);
+
+ m_Renderer -> SetDC(dc, (double)ppiPrinterY / (double)ppiScreenY);
+
dc -> SetBackgroundMode(wxTRANSPARENT);
- m_Renderer -> Render(ppmm_h * m_MarginLeft,
- ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight,
+ m_Renderer -> Render((int) (ppmm_h * m_MarginLeft),
+ (int) (ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight),
m_PageBreaks[page-1]);
- m_RendererHdr -> SetDC(dc, pageWidth);
+ m_RendererHdr -> SetDC(dc, (double)ppiPrinterY / (double)ppiScreenY);
if (m_Headers[page % 2] != wxEmptyString) {
m_RendererHdr -> SetHtmlText(TranslateHeader(m_Headers[page % 2], page));
- m_RendererHdr -> Render(ppmm_h * m_MarginLeft, ppmm_v * m_MarginTop);
+ m_RendererHdr -> Render((int) (ppmm_h * m_MarginLeft), (int) (ppmm_v * m_MarginTop));
}
if (m_Footers[page % 2] != wxEmptyString) {
m_RendererHdr -> SetHtmlText(TranslateHeader(m_Footers[page % 2], page));
- m_RendererHdr -> Render(ppmm_h * m_MarginLeft, pageHeight - ppmm_v * m_MarginBottom - m_FooterHeight);
+ m_RendererHdr -> Render((int) (ppmm_h * m_MarginLeft), (int) (pageHeight - ppmm_v * m_MarginBottom - m_FooterHeight));
}
}
-void wxHtmlEasyPrinting::PreviewFile(const wxString &htmlfile)
+bool wxHtmlEasyPrinting::PreviewFile(const wxString &htmlfile)
{
wxHtmlPrintout *p1 = CreatePrintout();
p1 -> SetHtmlFile(htmlfile);
wxHtmlPrintout *p2 = CreatePrintout();
p2 -> SetHtmlFile(htmlfile);
- DoPreview(p1, p2);
+ return DoPreview(p1, p2);
}
-void wxHtmlEasyPrinting::PreviewText(const wxString &htmltext, const wxString &basepath)
+bool wxHtmlEasyPrinting::PreviewText(const wxString &htmltext, const wxString &basepath)
{
wxHtmlPrintout *p1 = CreatePrintout();
p1 -> SetHtmlText(htmltext, basepath, TRUE);
wxHtmlPrintout *p2 = CreatePrintout();
p2 -> SetHtmlText(htmltext, basepath, TRUE);
- DoPreview(p1, p2);
+ return DoPreview(p1, p2);
}
-void wxHtmlEasyPrinting::PrintFile(const wxString &htmlfile)
+bool wxHtmlEasyPrinting::PrintFile(const wxString &htmlfile)
{
wxHtmlPrintout *p = CreatePrintout();
p -> SetHtmlFile(htmlfile);
- DoPrint(p);
+ return DoPrint(p);
}
-void wxHtmlEasyPrinting::PrintText(const wxString &htmltext, const wxString &basepath)
+bool wxHtmlEasyPrinting::PrintText(const wxString &htmltext, const wxString &basepath)
{
wxHtmlPrintout *p = CreatePrintout();
p -> SetHtmlText(htmltext, basepath, TRUE);
- DoPrint(p);
+ return DoPrint(p);
}
-void wxHtmlEasyPrinting::DoPreview(wxHtmlPrintout *printout1, wxHtmlPrintout *printout2)
+bool wxHtmlEasyPrinting::DoPreview(wxHtmlPrintout *printout1, wxHtmlPrintout *printout2)
{
// Pass two printout objects: for preview, and possible printing.
wxPrintDialogData printDialogData(*m_PrintData);
wxPrintPreview *preview = new wxPrintPreview(printout1, printout2, &printDialogData);
if (!preview -> Ok()) {
delete preview;
- wxMessageBox(_("There was a problem previewing.\nPerhaps your current printer is not set correctly?"), _("Previewing"), wxOK);
- }
-
- else {
- wxPreviewFrame *frame = new wxPreviewFrame(preview, m_Frame,
- m_Name + _(" Preview"),
- wxPoint(100, 100), wxSize(650, 500));
- frame -> Centre(wxBOTH);
- frame -> Initialize();
- frame -> Show(TRUE);
+ return FALSE;
}
+
+ wxPreviewFrame *frame = new wxPreviewFrame(preview, m_Frame,
+ m_Name + _(" Preview"),
+ wxPoint(100, 100), wxSize(650, 500));
+ frame -> Centre(wxBOTH);
+ frame -> Initialize();
+ frame -> Show(TRUE);
+ return TRUE;
}
-void wxHtmlEasyPrinting::DoPrint(wxHtmlPrintout *printout)
+bool wxHtmlEasyPrinting::DoPrint(wxHtmlPrintout *printout)
{
wxPrintDialogData printDialogData(*m_PrintData);
wxPrinter printer(&printDialogData);
if (!printer.Print(m_Frame, printout, TRUE))
- wxMessageBox(_("There was a problem printing.\nPerhaps your current printer is not set correctly?"), _("Printing"), wxOK);
- else
- (*m_PrintData) = printer.GetPrintDialogData().GetPrintData();
+ {
+ return FALSE;
+ }
+
+ (*m_PrintData) = printer.GetPrintDialogData().GetPrintData();
+ return TRUE;
}