int PrintNotesNoteAddin::compute_footer_height(const Glib::RefPtr<Gtk::PrintContext> & context) { Glib::RefPtr<Pango::Layout> layout = create_layout_for_timestamp(context); Pango::Rectangle ink_rect; Pango::Rectangle logical_rect; layout->get_extents(ink_rect, logical_rect); return pango_units_to_double(ink_rect.get_height()) + cm_to_pixel(0.5, context->get_dpi_y()); }
void PrintNotesNoteAddin::on_begin_print(const Glib::RefPtr<Gtk::PrintContext>& context) { m_timestamp_footer = create_layout_for_timestamp(context); // Create and initialize the page margins m_margin_top = cm_to_pixel (1.5, context->get_dpi_y()); m_margin_left = cm_to_pixel (1, context->get_dpi_x()); m_margin_right = cm_to_pixel (1, context->get_dpi_x()); m_margin_bottom = 0; double max_height = pango_units_from_double(context->get_height() - m_margin_top - m_margin_bottom - compute_footer_height(context)); DBG_OUT("margins = %d %d %d %d", m_margin_top, m_margin_left, m_margin_right, m_margin_bottom); m_page_breaks.clear(); Gtk::TextIter position; Gtk::TextIter end_iter; get_buffer()->get_bounds (position, end_iter); double page_height = 0; bool done = position.compare (end_iter) >= 0; while (!done) { Gtk::TextIter line_end = position; if (!line_end.ends_line ()) { line_end.forward_to_line_end (); } int paragraph_number = position.get_line(); int indentation = 0; Glib::RefPtr<Pango::Layout> layout = create_layout_for_paragraph( context, position, line_end, indentation); Pango::Rectangle ink_rect; Pango::Rectangle logical_rect; for(int line_in_paragraph = 0; line_in_paragraph < layout->get_line_count(); line_in_paragraph++) { Glib::RefPtr<Pango::LayoutLine> line = layout->get_line(line_in_paragraph); line->get_extents (ink_rect, logical_rect); if ((page_height + logical_rect.get_height()) >= max_height) { PageBreak(paragraph_number, line_in_paragraph); m_page_breaks.push_back (PageBreak(paragraph_number, line_in_paragraph)); page_height = 0; } page_height += logical_rect.get_height(); } position.forward_line (); done = position.compare (end_iter) >= 0; } m_print_op->set_n_pages(m_page_breaks.size() + 1); }