Index: Tomboy/NoteWindow.cs
===================================================================
RCS file: /cvs/gnome/tomboy/Tomboy/NoteWindow.cs,v
retrieving revision 1.18
diff -u -r1.18 NoteWindow.cs
--- Tomboy/NoteWindow.cs	21 Oct 2004 10:06:01 -0000	1.18
+++ Tomboy/NoteWindow.cs	27 Oct 2004 15:19:53 -0000
@@ -1,5 +1,7 @@
 
 using System;
+using Gtk;
+using Gnome;
 using Mono.Posix;
 
 namespace Tomboy
@@ -167,6 +169,113 @@
 		}
 
 		//
+		// Print the Note
+		//
+
+		void PrintNote (PrintContext context, PrintJob job)
+		{
+			FontWeight weight;
+			bool italic;
+			Font font;
+			String base_font = "Sans";
+			double small_size = 10;
+			double normal_size = 12;
+			double large_size = 14;
+			double huge_size = 16;
+			double size = normal_size;
+			double width, height, line_space;
+			job.GetPageSize (out width, out height);
+
+			double cur_x = 50;
+			double cur_y = height - 100;
+
+			Print.Beginpage (context, note.Title);
+			Print.Moveto (context, cur_x, cur_y);
+			
+			NoteBuffer buffer = note.Buffer;
+
+			for (int char_offset = 0; char_offset < buffer.CharCount; char_offset++) {
+				weight = FontWeight.Regular;
+				italic = false;
+				size = normal_size;
+				font = Font.FindClosestFromWeightSlant (base_font, weight, italic, size);
+				line_space = (font.Descender + font.Ascender) * 1.2;
+				Print.Setfont (context, font);
+				TextIter iter = buffer.GetIterAtOffset (char_offset);
+				TextTag[] tags = iter.Tags;
+
+				for (int i = 0; i < tags.Length; i++) {
+					if (tags[i].Weight == Pango.Weight.Bold)
+						weight = FontWeight.Bold;
+					else if (tags[i].Style == Pango.Style.Italic)
+						italic = true;
+					else if (tags[i].Scale == Pango.Scale.Small)
+						size = small_size;
+					else if (tags[i].Scale == Pango.Scale.Medium)
+						size = normal_size;
+					else if (tags[i].Scale == Pango.Scale.X_Large)
+						size = large_size;
+					else if (tags[i].Scale == Pango.Scale.XX_Large)
+						size = huge_size;
+						
+					font = Font.FindClosestFromWeightSlant (base_font, weight, italic, size);
+					line_space = (font.Descender + font.Ascender) * 1.2;
+					Print.Setfont (context, font);
+				}
+
+				if (iter.Char.Equals("\n")) {
+					cur_y -= line_space;
+					cur_x = 50;
+				} else {
+					Print.Show (context, iter.Char);
+					cur_x += font.GetWidthUtf8 (iter.Char);
+				}
+
+				if (cur_x >= width - 50) {
+					cur_x = 50;
+					cur_y -= line_space;
+				}
+
+				Print.Moveto (context, cur_x, cur_y);
+			}
+
+			Print.Showpage (context);
+			job.Close ();
+		}
+
+		//
+		// Handle Print Button Click
+		//
+
+		void PrintNoteActivated (object sender, EventArgs args) 
+		{
+			PrintJob job = new PrintJob (PrintConfig.Default ());
+			PrintDialog dialog = new PrintDialog (job, note.Title, 0);
+			int response = dialog.Run ();
+
+			if (response == (int) PrintButtons.Cancel) {
+				dialog.Hide ();
+				dialog.Dispose ();
+				return;
+			}
+
+			PrintContext context = job.Context;
+			PrintNote (context, job);
+
+			switch (response) {
+				case (int) PrintButtons.Print:
+					job.Print ();
+					break;
+				case (int) PrintButtons.Preview:
+					new PrintJobPreview (job, note.Title).Show ();
+					break;
+			}
+
+			dialog.Hide ();
+			dialog.Dispose ();
+		}
+
+		//
 		// Delete this Note.
 		//
 
@@ -265,10 +374,22 @@
 			find_item.Submenu = MakeFindMenu ();
 			find_item.Show ();
 
+			Gtk.ImageMenuItem print_item = 
+				new Gtk.ImageMenuItem (Catalog.GetString ("P_rint"));
+			print_item.Image = new Gtk.Image (Gtk.Stock.Print, Gtk.IconSize.Menu);
+			print_item.Activated += PrintNoteActivated;
+			print_item.AddAccelerator ("activate",
+					     accel_group,
+					     (uint) Gdk.Key.p, 
+					     Gdk.ModifierType.ControlMask,
+					     Gtk.AccelFlags.Visible);
+			print_item.Show ();
+
 			Gtk.MenuItem spacer2 = new Gtk.SeparatorMenuItem ();
 			spacer2.Show ();
 
 			args.Menu.Prepend (spacer1);
+			args.Menu.Prepend (print_item);
 			args.Menu.Prepend (text_item);
 			args.Menu.Prepend (find_item);
 			args.Menu.Prepend (link);
