129 lines
3.6 KiB
Ruby
129 lines
3.6 KiB
Ruby
|
# Copyright (c) 2008 Ruby-GNOME2 Project Team
|
||
|
# This program is licenced under the same licence as Ruby-GNOME2.
|
||
|
=begin
|
||
|
= Printing
|
||
|
|
||
|
Gtk::PrintOperation offers a simple API to support printing
|
||
|
in a cross-platform way.
|
||
|
=end
|
||
|
|
||
|
require 'common'
|
||
|
|
||
|
module Demo
|
||
|
class Printing < BasicWindow
|
||
|
Data = Struct.new(:font_size, :lines_per_page, :lines, :n_pages)
|
||
|
HEADER_HEIGHT = 10 * 72 / 25.4
|
||
|
HEADER_GAP = 3 * 72 / 25.4
|
||
|
|
||
|
def initialize
|
||
|
super('Printing')
|
||
|
|
||
|
button = Gtk::Button.new("Print...")
|
||
|
button.signal_connect("clicked") do
|
||
|
begin
|
||
|
run_print_operation
|
||
|
rescue
|
||
|
dialog = Gtk::MessageDialog.new(self, :destroy_with_parent, :error,
|
||
|
:close, $!.message)
|
||
|
dialog.signal_connect("response") do
|
||
|
dialog.destroy
|
||
|
true
|
||
|
end
|
||
|
dialog.show
|
||
|
end
|
||
|
true
|
||
|
end
|
||
|
add(button)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def run_print_operation
|
||
|
operation = Gtk::PrintOperation.new
|
||
|
|
||
|
data = Data.new
|
||
|
data.font_size = 12.0
|
||
|
operation.signal_connect("begin-print") do |_operation, context|
|
||
|
on_begin_print(_operation, context, data)
|
||
|
end
|
||
|
operation.signal_connect("draw-page") do |_operation, context, page_number|
|
||
|
on_draw_page(_operation, context, page_number, data)
|
||
|
end
|
||
|
operation.signal_connect("end-print") do |_operation, context|
|
||
|
on_end_print(_operation, context, data)
|
||
|
end
|
||
|
|
||
|
operation.use_full_page = false
|
||
|
operation.unit = :points
|
||
|
|
||
|
operation.run(:print_dialog, self)
|
||
|
end
|
||
|
|
||
|
def on_begin_print(operation, context, data)
|
||
|
height = context.height - HEADER_HEIGHT - HEADER_GAP
|
||
|
data.lines_per_page = (height / data.font_size).floor
|
||
|
data.lines = File.readlines(__FILE__)
|
||
|
data.n_pages = (data.lines.size - 1) / data.lines_per_page + 1
|
||
|
operation.set_n_pages(data.n_pages)
|
||
|
end
|
||
|
|
||
|
def on_draw_page(operation, context, page_number, data)
|
||
|
cr = context.cairo_context
|
||
|
draw_header(cr, operation, context, page_number, data)
|
||
|
draw_body(cr, operation, context, page_number, data)
|
||
|
end
|
||
|
|
||
|
def draw_header(cr, operation, context, page_number, data)
|
||
|
width = context.width
|
||
|
|
||
|
cr.rectangle(0, 0, width, HEADER_HEIGHT)
|
||
|
cr.set_source_rgb(0.8, 0.8, 0.8)
|
||
|
cr.fill_preserve
|
||
|
|
||
|
cr.set_source_rgb(0, 0, 0)
|
||
|
cr.line_width = 1
|
||
|
cr.stroke
|
||
|
|
||
|
layout = context.create_pango_layout
|
||
|
layout.font_description = "sans 14"
|
||
|
|
||
|
layout.text = File.basename(__FILE__)
|
||
|
text_width, text_height = layout.pixel_size
|
||
|
|
||
|
if (text_width > width)
|
||
|
layout.width = width
|
||
|
layout.ellipsize = :start
|
||
|
text_width, text_height = layout.pixel_size
|
||
|
end
|
||
|
|
||
|
y = (HEADER_HEIGHT - text_height) / 2
|
||
|
|
||
|
cr.move_to((width - text_width) / 2, y)
|
||
|
cr.show_pango_layout(layout)
|
||
|
|
||
|
layout.text = "#{page_number + 1}/#{data.n_pages}"
|
||
|
layout.width = -1
|
||
|
text_width, text_height = layout.pixel_size
|
||
|
cr.move_to(width - text_width - 4, y)
|
||
|
cr.show_pango_layout(layout)
|
||
|
end
|
||
|
|
||
|
def draw_body(cr, operation, context, page_number, data)
|
||
|
layout = context.create_pango_layout
|
||
|
description = Pango::FontDescription.new("monosapce")
|
||
|
description.size = data.font_size * Pango::SCALE
|
||
|
layout.font_description = description
|
||
|
|
||
|
cr.move_to(0, HEADER_HEIGHT + HEADER_GAP)
|
||
|
start_line = page_number * data.lines_per_page
|
||
|
data.lines[start_line, data.lines_per_page].each do |line|
|
||
|
layout.text = line
|
||
|
cr.show_pango_layout(layout)
|
||
|
cr.rel_move_to(0, data.font_size)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def on_end_print(operation, context, data)
|
||
|
end
|
||
|
end
|
||
|
end
|