----------------------------------------------------------------------- -- GtkAda - Ada95 binding for Gtk+/Gnome -- -- -- -- Copyright (C) 2010, AdaCore -- -- -- -- This library is free software; you can redistribute it and/or -- -- modify it under the terms of the GNU General Public -- -- License as published by the Free Software Foundation; either -- -- version 2 of the License, or (at your option) any later version. -- -- -- -- This library is distributed in the hope that it will be useful, -- -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- -- General Public License for more details. -- -- -- -- You should have received a copy of the GNU General Public -- -- License along with this library; if not, write to the -- -- Free Software Foundation, Inc., 59 Temple Place - Suite 330, -- -- Boston, MA 02111-1307, USA. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----------------------------------------------------------------------- -- -- This package provides a ready-to-use high level printing object. -- Use functionality from Gtk.Print_Operation to manipulate the -- printing object, and the functionality in this package to provide -- the handlers for the printing operation. -- -- Typically, to use this high-level printing API: -- - derive from the Gtkada_Print_Operation_Record object -- - override the Draw_Page operation -- - (optional) override any other operation useful to you -- - start the print operation by -- - first setting the number of pages through Set_N_Pages -- - then calling Connect_And_Run. -- A dialog will be displayed, letting the user select a printer and options. -- When the user finishes the dialog, various signals will be emitted on the -- Gtkada_Print_Operation, which will call the operations on your object. -- -- Note: on UNIX/Linux, Gtk+ is loading at run-time the libraries for printing -- support. You will need to point the environment variable GTK_EXE_PREFIX -- to the root directory of your Gtk+ install before calling Connect_And_Run. -- -- -- -- -- Create a derived type -- -- type Print_Op_Record is new Gtkada_Print_Operation_Record -- with record -- My_Data : My_Type; -- end record; -- type Print_Op_Access is access all Print_Op_Record'Class; -- -- -- Override Draw_Page -- -- procedure Draw_Page -- (Print_Operation : access Print_Op_Record; -- Context : Gtk_Print_Context; -- Page_Num : Gint) -- is -- Cr : Cairo_Context; -- begin -- Cr := Get_Cairo_Context (Context); -- -- -- Do drawing here -- -- end Draw_Page; -- -- -- -- Do the printing -- declare -- Print_Op : Print_Op_Access; -- Result : Gtk_Print_Operation_Result; -- begin -- -- Initialize -- Print_Op := new Print_Op_Record; -- Print_Op.My_Data := Some_Data; -- -- -- Set the number of pages to print -- Set_N_Pages (Print_Op, 2); -- -- -- Launch the printing -- Result := Connect_And_Run -- (Print_Op, Action_Print_Dialog, Gtk_Window (Get_Toplevel (Frame))); -- end; -- -- -- Miscellaneous with Glib; use Glib; with Glib.Error; with Gtk.Page_Setup; use Gtk.Page_Setup; with Gtk.Print_Context; use Gtk.Print_Context; with Gtk.Print_Operation; use Gtk.Print_Operation; with Gtk.Print_Operation_Preview; use Gtk.Print_Operation_Preview; with Gtk.Window; use Gtk.Window; package Gtkada.Printing is type Gtkada_Print_Operation_Record is new Gtk_Print_Operation_Record with private; type Gtkada_Print_Operation is access all Gtkada_Print_Operation_Record; procedure Gtk_New (Op : out Gtkada_Print_Operation); procedure Initialize (Widget : access Gtkada_Print_Operation_Record'Class); -- Initialize the print operation function Connect_And_Run (Op : access Gtkada_Print_Operation_Record'Class; Action : Gtk_Print_Operation_Action; Parent : access Gtk_Window_Record'Class; Error : Glib.Error.GError := null) return Gtk_Print_Operation_Result; -- Runs the print operation, using the handlers installed in Op. -- See Gtk.Print_Operations.Run. ------------------------- -- Printing operations -- ------------------------- -- The following primitive operations are called by the printing procedure. -- By default, these operations do nothing. -- It is mandatory to override Draw_Page, the other callbacks are optional. procedure Draw_Page (Op : access Gtkada_Print_Operation_Record; Context : Gtk_Print_Context; Page_Number : Gint); -- Called for every page that is printed. This handler must render the -- page Page_Number onto the cairo context obtained from Context using -- Gtk.Print_Context.Get_Cairo_Context. -- -- Use Gtk.Print_Operation.Set_Use_Full_Page and -- Gtk.Print_Operation.Set_Unit before starting the print operation to set -- up the transformation of the cairo context according to your needs. -- -- This is the main printing handler. This has to be overriden for the -- printing operation to work. procedure Begin_Print (Op : access Gtkada_Print_Operation_Record; Context : Gtk_Print_Context); -- Called after the user has finished changing print settings in the -- dialog, before the actual rendering starts. -- -- A typical use is to use the parameters from the -- Gtk_Print_Context and paginate the document accordingly, and then -- set the number of pages with Gtk.Print_Operation.Set_N_Pages. procedure Done (Op : access Gtkada_Print_Operation_Record; Result : Gtk_Print_Operation_Result); -- Called when the print operation run has finished doing everything -- required for printing. -- -- Result gives you information about what happened during the run. -- If Result is Result_Error then you can call Get_Error for more -- information. -- -- If you enabled print status tracking then -- Gtk.Print_Operation.Is_Finished may still return False after -- done was emitted. procedure End_Print (Op : access Gtkada_Print_Operation_Record; Context : Gtk_Print_Context); -- Called after all pages have been rendered. -- -- This handler can clean up any resources that have been allocated -- in Begin_Print. function Paginate (Op : access Gtkada_Print_Operation_Record; Context : Gtk_Print_Context) return Boolean; -- Called after the "begin-print" signal, but before the actual rendering -- starts. It keeps getting called until it returns True. -- -- The "paginate" signal is intended to be used for paginating a document -- in small chunks, to avoid blocking the user interface for a long -- time. This function should update the number of pages using -- Gtk.Print_Operation.Set_N_Pages, and return True if the document -- has been completely paginated. -- -- If you don't need to do pagination in chunks, you can simply do -- it all in the "begin-print" handler, and set the number of pages -- from there. function Preview (Op : access Gtkada_Print_Operation_Record; Preview : Gtk_Print_Operation_Preview; Context : Gtk_Print_Context; Parent : Gtk_Window) return Boolean; -- Called when a preview is requested from the native dialog. -- This should return True if the in order to take over control of the -- preview. -- -- The default handler for this signal uses an external viewer -- application to preview. -- -- To implement a custom print preview, the overridden implementation -- should return True -- In order to use the provided Context for the preview implementation, it -- must be given a suitable cairo context with Set_Cairo_Context. -- -- The custom preview implementation can use -- Gtk.Print_Operation_Preview.Is_Selected and -- Gtk.Print_Operation_Preview.Render_Page to find pages which -- are selected for print and render them. The preview must be -- finished by calling Gtk.Print_Operation_Preview.End_Preview -- (typically in response to the user clicking a close button). procedure Request_Page_Setup (Op : access Gtkada_Print_Operation_Record; Context : Gtk_Print_Context; Page_Number : Gint; Setup : Gtk_Page_Setup); -- Called once for every page that is printed, to give the application -- a chance to modify the page setup. Any changes done to setup will be -- in force only for printing this page. procedure Status_Changed (Op : access Gtkada_Print_Operation_Record); -- Called between the various phases of the print operation. -- See Gtk_Print_Status for the phases that are being discriminated. -- Use Gtk.Print_Operation.Get_Status to find out the current -- status. private type Gtkada_Print_Operation_Record is new Gtk_Print_Operation_Record with null record; end Gtkada.Printing;