From 6a6cc0ce8b5209c9ffd37f764d490b606ab332fa Mon Sep 17 00:00:00 2001 From: Mike Kestner Date: Thu, 10 Aug 2006 17:32:11 +0000 Subject: [PATCH] 2006-08-10 Mikkel Kruse Johnsen * sample/GtkDemo/DemoPrinting.cs : new Gtk.Print sample. * sample/GtkDemo/Makefile.am : build new source. svn path=/trunk/gtk-sharp/; revision=63610 --- ChangeLog | 5 ++ sample/GtkDemo/DemoPrinting.cs | 136 +++++++++++++++++++++++++++++++++ sample/GtkDemo/Makefile.am | 5 +- 3 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 sample/GtkDemo/DemoPrinting.cs diff --git a/ChangeLog b/ChangeLog index 5b6634c29..82694e9f9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-08-10 Mikkel Kruse Johnsen + + * sample/GtkDemo/DemoPrinting.cs : new Gtk.Print sample. + * sample/GtkDemo/Makefile.am : build new source. + 2006-08-10 Mike Kestner * pango/Pango.metadata : add library attr to pango_cairo methods. diff --git a/sample/GtkDemo/DemoPrinting.cs b/sample/GtkDemo/DemoPrinting.cs new file mode 100644 index 000000000..82da21a97 --- /dev/null +++ b/sample/GtkDemo/DemoPrinting.cs @@ -0,0 +1,136 @@ +/* Printing + * + * GtkPrintOperation offers a simple API to support printing in a cross-platform way. + */ + +using System; +using System.IO; +using System.Reflection; +using Gtk; +using Cairo; + +namespace GtkDemo +{ + [Demo ("Printing", "DemoPrinting.cs")] + public class DemoPrinting + { + private static double headerHeight = (10*72/25.4); + private static double headerGap = (3*72/25.4); + private static int pangoScale = 1024; + + private PrintOperation print; + + private string fileName = "DemoPrinting.cs"; + private double fontSize = 12.0; + private int linesPerPage; + private string[] lines; + private int numLines; + private int numPages; + + public DemoPrinting () + { + print = new PrintOperation (); + + print.BeginPrint += OnBeginPrint; + print.DrawPage += OnDrawPage; + print.EndPrint += OnEndPrint; + + print.Run (PrintOperationAction.PrintDialog, null); + } + + private void OnBeginPrint (object obj, Gtk.BeginPrintArgs args) + { + string contents; + double height; + + PrintContext context = args.Context; + height = context.Height; + + linesPerPage = (int)Math.Floor(height / fontSize); + contents = LoadFile("DemoPrinting.cs"); + + lines = contents.Split('\n'); + + numLines = lines.Length; + numPages = (numLines - 1) / linesPerPage + 1; + + print.NPages = numPages; + } + + private string LoadFile (string filename) + { + Stream file = Assembly.GetExecutingAssembly ().GetManifestResourceStream +(filename); + if (file == null && File.Exists (filename)) { + file = File.OpenRead (filename); + } + if (file == null) { + return "File not found"; + } + + StreamReader sr = new StreamReader (file); + return sr.ReadToEnd (); + } + + private void OnDrawPage (object obj, Gtk.DrawPageArgs args) + { + PrintContext context = args.Context; + + Cairo.Context cr = context.CairoContext; + double width = context.Width; + + cr.Rectangle (0, 0, width, headerHeight); + cr.SetSourceRGB (0.8, 0.8, 0.8); + cr.FillPreserve (); + + cr.SetSourceRGB (0, 0, 0); + cr.LineWidth = 1; + cr.Stroke(); + + Pango.Layout layout = context.CreatePangoLayout (); + + Pango.FontDescription desc = Pango.FontDescription.FromString ("sans 14"); + layout.FontDescription = desc; + + layout.SetText (fileName); + layout.Width = (int)width; + layout.Alignment = Pango.Alignment.Center; + + int layoutWidth, layoutHeight; + layout.GetSize (out layoutWidth, out layoutHeight); + double textHeight = (double)layoutHeight / (double)pangoScale; + + cr.MoveTo (width/2, (headerHeight - textHeight) / 2); + Pango.CairoHelper.ShowLayout (cr, layout); + + string pageStr = String.Format ("{0}/{1}", args.PageNr + 1, numPages); + layout.SetText (pageStr); + layout.Alignment = Pango.Alignment.Right; + + cr.MoveTo (width - 2, (headerHeight - textHeight) / 2); + Pango.CairoHelper.ShowLayout (cr, layout); + + layout = null; + layout = context.CreatePangoLayout (); + + desc = Pango.FontDescription.FromString ("mono"); + desc.Size = (int)(fontSize * pangoScale); + layout.FontDescription = desc; + + cr.MoveTo (0, headerHeight + headerGap); + int line = args.PageNr * linesPerPage; + for (int i=0; i < linesPerPage && line < numLines; i++) + { + layout.SetText (lines[line]); + Pango.CairoHelper.ShowLayout (cr, layout); + cr.RelMoveTo (0, fontSize); + line++; + } + layout = null; + } + + private void OnEndPrint (object obj, Gtk.EndPrintArgs args) + { + } + } +} diff --git a/sample/GtkDemo/Makefile.am b/sample/GtkDemo/Makefile.am index d5a175410..fabcd50b4 100644 --- a/sample/GtkDemo/Makefile.am +++ b/sample/GtkDemo/Makefile.am @@ -1,5 +1,5 @@ assemblies = ../../glib/glib-sharp.dll ../../pango/pango-sharp.dll ../../atk/atk-sharp.dll ../../gdk/gdk-sharp.dll ../../gtk/gtk-sharp.dll -references = $(addprefix /r:, $(assemblies)) +references = $(addprefix /r:, $(assemblies)) -r:Mono.Cairo TARGETS = GtkDemo.exe DEBUGS = $(addsuffix .mdb, $(TARGETS)) CLEANFILES = $(TARGETS) $(DEBUGS) @@ -31,7 +31,8 @@ sources = \ DemoStockBrowser.cs \ DemoTextView.cs \ DemoTreeStore.cs \ - DemoUIManager.cs + DemoUIManager.cs \ + DemoPrinting.cs images = \ images/gnome-foot.png,gnome-foot.png \