From 6a6cc0ce8b5209c9ffd37f764d490b606ab332fa Mon Sep 17 00:00:00 2001
From: Mike Kestner <mkestner@gmail.com>
Date: Thu, 10 Aug 2006 17:32:11 +0000
Subject: [PATCH] 2006-08-10  Mikkel Kruse Johnsen <mikkel@linet.dk>

	* 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 <mikkel@linet.dk>
+
+	* sample/GtkDemo/DemoPrinting.cs : new Gtk.Print sample.
+	* sample/GtkDemo/Makefile.am : build new source.
+
 2006-08-10  Mike Kestner  <mkestner@novell.com>
 
 	* 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 \