Wouldn’t it be nice if the code for your E-mail client would look like this?
private void GetHeadersCallback (Tny.Folder folder, bool cancel, Tny.List model, IntPtr user_data) { if (!cancel) this.headers_treeview.Model = (Gtk.TreeModel) model; } private void StatusCallback (GLib.Object sender, Tny.Status status) { this.progressbar.Fraction = status.Fraction; } private void GetMsgCallBack (Tny.Folder folder, bool cancel, Tny.Msg msg, IntPtr user_data) { if (msg != null && !cancel) this.msg_view.Msg = msg; } private void OnMailSelected (object o, EventArgs args) { Tny.Ui.GTK.HeaderListModel model = (o as Gtk.TreeSelection).TreeView.Model as Tny.Ui.GTK.HeaderListModel; Tny.Header header = model.GetHeader (o as Gtk.TreeSelection); if (header != null) { Console.WriteLine ("Message selected: " + header.From); this.cur_folder.GetMsgAsync (header, GetMsgCallBack, StatusCallback); } } private void OnFolderChanged (object o, EventArgs args) { Tny.Ui.GTK.FolderStoreTreeModel model = (o as Gtk.TreeSelection).TreeView.Model as Tny.Ui.GTK.FolderStoreTreeModel; Tny.Folder folder = model.GetFolder (o as Gtk.TreeSelection); if (folder != null) { Tny.Ui.GTK.HeaderListModel headers_model = new Tny.Ui.GTK.HeaderListModel(); Console.WriteLine ("Folder selected: " + folder.Name); this.cur_folder = folder; folder.GetHeadersAsync (headers_model, true, GetHeadersCallback, StatusCallback); } }