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);