Lightningbeam/PyGUI-2.5.3/build/lib/GUI/TextEditorPrinting.py

69 lines
2.4 KiB
Python

#------------------------------------------------------------------------------
#
# PyGUI - TextEditor Printing - Generic
#
#------------------------------------------------------------------------------
import re
from GUI import View
class TextEditorPrintView(View):
def __init__(self, base_view, page_setup):
print "TextEditorPrintView:" ###
print "...paper_size =", page_setup.paper_size ###
print "...margins =", page_setup.margins ###
print "...page_size =", page_setup.page_size ###
View.__init__(self)
self.base_view = base_view
self.width = page_setup.page_width
self.page_height = page_setup.page_height
self.lay_out_text()
lines_per_page = int(page_setup.page_height / base_view.font.line_height)
self.lines_per_page = lines_per_page
num_lines = len(self.lines)
self.num_pages = (num_lines + lines_per_page - 1) // lines_per_page
self.height = self.num_pages * self.page_height
def lay_out_text(self):
base_view = self.base_view
font = base_view.font
space_width = font.width(" ")
tab_spacing = base_view.tab_spacing
page_width = self.width
pat = re.compile(r"[ \t]|[^ \t]+")
lines = []
line = []
x = 0
for text_line in base_view.text.splitlines():
for match in pat.finditer(text_line):
item = match.group()
if item == " ":
item_width = space_width
item = ""
elif item == "\t":
item_width = tab_spacing - x % tab_spacing
item = ""
else:
item_width = font.width(item)
if x + item_width > page_width and x > 0:
lines.append(line); line = []; x = 0
line.append((x, item))
x += item_width
lines.append(line); line = []; x = 0
self.lines = lines
def draw(self, canvas, page_rect):
l, t, r, b = page_rect
page_no = int(t / self.page_height)
n = self.lines_per_page
i = page_no * n
font = self.base_view.font
y = t + font.ascent
dy = font.line_height
for line in self.lines[i : i + n]:
for x, item in line:
canvas.moveto(x, y)
canvas.show_text(item)
y += dy