#!/usr/bin/python
"""
This is from http://wiki.wxpython.org/Printing

License: MIT
"""

import wx


class MyPrintout(wx.Printout):
    def __init__(self, frame, lines=[]):
        wx.Printout.__init__(self)
        self.printer_config = wx.PrintData()
        self.printer_config.SetPaperId(wx.PAPER_LETTER)
        self.printer_config.SetOrientation(wx.LANDSCAPE)
        self.frame = frame
        self.doc_lines = lines
        self.current_y = 15
        self.num_lines_per_page = 50

    def PrintText(self, lines):
        self.doc_lines = lines
        pdd = wx.PrintDialogData()
        pdd.SetPrintData(self.printer_config)
        printer = wx.Printer(pdd)
        printer.Print(self.frame, self, prompt=True)
        # update printer config
        self.printer_config = printer.GetPrintDialogData().GetPrintData()

    def HasPage(self, page_num):
        return (len(self.GetPageText(page_num)) > 0)

    def GetPageInfo(self):
        minPage = 1
        maxPage = int(len(self.doc_lines) / self.num_lines_per_page) + 1
        fromPage, toPage = minPage, maxPage
        return (minPage, maxPage, fromPage, toPage)

    def OnPrintPage(self, page_num):
        dc = self.GetDC()
        if self.IsPreview():
            dc_ppi = self.GetPPIScreen()[0]
            w_px = dc.GetSizeTuple()[0]
        else:
            dc_ppi = self.GetPPIPrinter()[0]
            w_px = self.GetPageSizePixels()[0]
        w_mm = self.GetPageSizeMM()[0]
        my_fs = 30 # desirable font size in points (1/72 of inch)
        mpi = 25.4
        fs = round((my_fs * w_px * mpi) / (w_mm * dc_ppi))
        dc.SetFont(wx.Font(fs, wx.MODERN, wx.NORMAL, wx.NORMAL, False,
                           'Courier New'))
        if self.IsPreview():
            col_offset_pts = 25
            line_spacing_pts = self.current_y
            line_offset_pts = 50
        else:
            col_offset_pts = 75
            line_spacing_pts = self.current_y * 4
            line_offset_pts = 50
        x, y = col_offset_pts, line_offset_pts
        for line in self.GetPageText(page_num):
            dc.DrawText(line, x, y)
            y += line_spacing_pts
        return True

    def GetPageText(self, page_num):
        start_idx = (page_num - 1) * self.num_lines_per_page
        end_idx = page_num * (self.num_lines_per_page - 1)
        lines_for_page = self.doc_lines[start_idx:end_idx]
        return lines_for_page


class TestFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(TestFrame, self).__init__(*args, **kwargs)
        self.SetSize(wx.Size(75, 75))
        self.InitUI()
        self.printout = MyPrintout(self)

    def InitUI(self):
        self.SetUpPanel()
        self.Show(True)

    def SetUpPanel(self):
        panel = wx.Panel(self, style=wx.SIMPLE_BORDER)
        vbox = wx.BoxSizer(wx.VERTICAL)
        button = wx.Button(panel, id=wx.ID_PRINT, label='Print')
        self.Bind(wx.EVT_BUTTON, self.OnButtonPush, source=button)
        vbox.Add(button)
        panel.SetSizer(vbox)

    def OnButtonPush(self, evt):
        lines = []
        for line_no in range(1,21):
            lines.append("This is Line ..................... %d" % line_no)
        self.printout.PrintText(lines)


if __name__ == '__main__':
    print "Test program, wxPython version:", wx.version()
    app = wx.App()
    TestFrame(None, title='Test Frame')
    app.MainLoop()
