using System; using Mono.Unix; using Gtk; namespace FSpot { public class EditException : Exception { IBrowsableItem item; public IBrowsableItem Item { get { return item; } } public EditException (IBrowsableItem item, Exception e) : base ( String.Format (Catalog.GetString ("Received exception \"{0}\". Unable to save photo {1}"), e.Message, item.Name), e) { this.item = item; } } public class EditExceptionDialog : HigMessageDialog { private const int MaxErrors = 10; public EditExceptionDialog (Gtk.Window parent, Exception [] errors) : base (parent, DialogFlags.DestroyWithParent, Gtk.MessageType.Error, ButtonsType.Ok, Catalog.GetString ("Error editing photo"), GenerateMessage (errors)) { } public EditExceptionDialog (Gtk.Window parent, Exception e, IBrowsableItem item) : this (parent, new EditException (item, e)) { } public EditExceptionDialog (Gtk.Window parent, Exception e) : this (parent, new Exception [] { e }) { } private static string GenerateMessage (Exception [] errors) { string desc = String.Empty; for (int i = 0; i < errors.Length && i < MaxErrors; i++) { Exception e = errors [i]; desc += e.Message + Environment.NewLine; } return desc; } } } // created on 24/01/2005 at 20:14 // Taken pretty much wholesale from Tomboy public class HigMessageDialog : Gtk.Dialog { Gtk.AccelGroup accel_group; public HigMessageDialog (Gtk.Window parent, Gtk.DialogFlags flags, Gtk.MessageType type, Gtk.ButtonsType buttons, string header, string msg) : base () { HasSeparator = false; BorderWidth = 5; Resizable = false; Title = String.Empty; VBox.Spacing = 12; ActionArea.Layout = Gtk.ButtonBoxStyle.End; accel_group = new Gtk.AccelGroup (); AddAccelGroup (accel_group); Gtk.HBox hbox = new Gtk.HBox (false, 12); hbox.BorderWidth = 5; hbox.Show (); VBox.PackStart (hbox, false, false, 0); Gtk.Image image = null; switch (type) { case Gtk.MessageType.Error: image = new Gtk.Image (Gtk.Stock.DialogError, Gtk.IconSize.Dialog); break; case Gtk.MessageType.Question: image = new Gtk.Image (Gtk.Stock.DialogQuestion, Gtk.IconSize.Dialog); break; case Gtk.MessageType.Info: image = new Gtk.Image (Gtk.Stock.DialogInfo, Gtk.IconSize.Dialog); break; case Gtk.MessageType.Warning: image = new Gtk.Image (Gtk.Stock.DialogWarning, Gtk.IconSize.Dialog); break; } image.Show (); hbox.PackStart (image, false, false, 0); Gtk.VBox label_vbox = new Gtk.VBox (false, 0); label_vbox.Show (); hbox.PackStart (label_vbox, true, true, 0); string title = String.Format ("{0}" + "{1}", header, Environment.NewLine); Gtk.Label label; label = new Gtk.Label (title); label.UseMarkup = true; label.Justify = Gtk.Justification.Left; label.LineWrap = true; label.SetAlignment (0.0f, 0.5f); label.Show (); label_vbox.PackStart (label, false, false, 0); label = new Gtk.Label (msg); label.UseMarkup = true; label.Justify = Gtk.Justification.Left; label.LineWrap = true; label.SetAlignment (0.0f, 0.5f); label.UseUnderline = false; label.Show (); label_vbox.PackStart (label, false, false, 0); switch (buttons) { case Gtk.ButtonsType.None: break; case Gtk.ButtonsType.Ok: AddButton (Gtk.Stock.Ok, Gtk.ResponseType.Ok, true); break; case Gtk.ButtonsType.Close: AddButton (Gtk.Stock.Close, Gtk.ResponseType.Close, true); break; case Gtk.ButtonsType.Cancel: AddButton (Gtk.Stock.Cancel, Gtk.ResponseType.Cancel, true); break; case Gtk.ButtonsType.YesNo: AddButton (Gtk.Stock.No, Gtk.ResponseType.No, false); AddButton (Gtk.Stock.Yes, Gtk.ResponseType.Yes, true); break; case Gtk.ButtonsType.OkCancel: AddButton (Gtk.Stock.Cancel, Gtk.ResponseType.Cancel, false); AddButton (Gtk.Stock.Ok, Gtk.ResponseType.Ok, true); break; } if (parent != null) TransientFor = parent; if ((int) (flags & Gtk.DialogFlags.Modal) != 0) Modal = true; if ((int) (flags & Gtk.DialogFlags.DestroyWithParent) != 0) DestroyWithParent = true; } // constructor for a HIG confirmation alert with two buttons public HigMessageDialog (Gtk.Window parent, Gtk.DialogFlags flags, Gtk.MessageType type, string header, string msg, string ok_caption) : this (parent, flags, type, Gtk.ButtonsType.Cancel, header, msg) { AddButton (ok_caption, Gtk.ResponseType.Ok, false); } public void AddButton (string stock_id, Gtk.ResponseType response, bool is_default) { Gtk.Button button = new Gtk.Button (stock_id); button.CanDefault = true; button.Show (); AddActionWidget (button, response); if (is_default) { DefaultResponse = response; button.AddAccelerator ("activate", accel_group, (uint) Gdk.Key.Escape, 0, Gtk.AccelFlags.Visible); } } //run and destroy a standard dialog public static Gtk.ResponseType RunHigMessageDialog(Gtk.Window parent, Gtk.DialogFlags flags, Gtk.MessageType type, Gtk.ButtonsType buttons, string header, string msg) { HigMessageDialog hmd = new HigMessageDialog(parent, flags, type, buttons, header, msg); try { return (Gtk.ResponseType)hmd.Run(); } finally { hmd.Destroy(); } } //Run and destroy a standard confirmation dialog public static Gtk.ResponseType RunHigConfirmation(Gtk.Window parent, Gtk.DialogFlags flags, Gtk.MessageType type, string header, string msg, string ok_caption) { HigMessageDialog hmd = new HigMessageDialog(parent, flags, type, header, msg, ok_caption); try { return (Gtk.ResponseType)hmd.Run(); } finally { hmd.Destroy(); } } }