Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono-tools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Ferreira <raf@ophion.org>2005-11-06 04:48:10 +0300
committerRafael Ferreira <raf@ophion.org>2005-11-06 04:48:10 +0300
commitaecb70a25155d29ea5d568a2af17ed7f55264fd7 (patch)
tree63c1383fa410310abb78f604edeb36978e1b3c4b /docbrowser
parent926bd130df453c5e7b8e0a19618e3a5a36a5a9c2 (diff)
New bookmark logic code
svn path=/trunk/mono-tools/; revision=52616
Diffstat (limited to 'docbrowser')
-rw-r--r--docbrowser/BookmarkManager.cs534
1 files changed, 534 insertions, 0 deletions
diff --git a/docbrowser/BookmarkManager.cs b/docbrowser/BookmarkManager.cs
new file mode 100644
index 00000000..6367ecee
--- /dev/null
+++ b/docbrowser/BookmarkManager.cs
@@ -0,0 +1,534 @@
+//
+// Filename BookmarkManager.cs: Manages bookmark saving/restoring and the secondary dialog
+// windows
+// Author:
+// Rafael Ferreira <raf@ophion.org>
+//
+// (C) 2005 Rafael Ferreira
+//
+
+using System;
+using Gtk;
+using Glade;
+using System.Collections;
+using System.Xml.Serialization;
+using System.Xml;
+using System.IO;
+
+namespace Monodoc {
+ public class BookmarkManager {
+
+ [Serializable]
+ public class BookmarkBase {
+ [XmlAttribute]
+ public string ID = Guid.NewGuid().ToString();
+ [XmlAttribute]
+ public string Name = String.Empty;
+
+ public BookmarkBase() {}
+
+ }
+ [Serializable]
+ [XmlInclude(typeof(Bookmark))]
+ public class BookmarkGroup : BookmarkBase {
+
+ [XmlElement("Member")]
+ public ArrayList Members = new ArrayList();
+
+ public BookmarkGroup() {}
+
+ public BookmarkGroup(string name) {
+ Name = name;
+
+ }
+ }
+
+ [Serializable]
+ public class Bookmark : BookmarkBase {
+
+ public string Url;
+
+ public Bookmark(string name, string url){
+ Name = name;
+ Url = url;
+ }
+
+ public Bookmark() {}
+ }
+ internal class ManageBookmarkDialog {
+ [Glade.Widget] Gtk.TreeView bookmarks_treeview;
+ [Glade.Widget] Gtk.Window manage_bookmarks_dialog;
+ BookmarkGroup root_group;
+ Hashtable iter_to_id;
+ string selected_id = string.Empty;
+ CellRendererText cell_render;
+ const string UNTITLED = "Untitled";
+
+ public ManageBookmarkDialog(BookmarkGroup bookmarks) {
+ Glade.XML xml = new Glade.XML("browser.glade","manage_bookmarks_dialog");
+ xml.Autoconnect(this);
+ iter_to_id = new Hashtable();
+ root_group = bookmarks;
+ bookmarks_treeview.RulesHint = true;
+ bookmarks_treeview.EnableSearch = true;
+
+ // treeview handlers
+ bookmarks_treeview.RowExpanded += new Gtk.RowExpandedHandler(on_row_expanded);
+ bookmarks_treeview.Selection.Changed += new EventHandler(on_row_selected);
+ bookmarks_treeview.RowActivated += new Gtk.RowActivatedHandler(on_row_activated);
+ cell_render = new CellRendererText();
+ cell_render.Edited += new EditedHandler(on_cellrender_edited);
+ cell_render.Editable = true;
+
+ bookmarks_treeview.AppendColumn("Column 1", cell_render,"text",0);
+
+
+ }
+
+ void on_row_expanded(object sender, Gtk.RowExpandedArgs args) {
+ }
+ void on_row_selected(object sender, EventArgs args) {
+ Gtk.TreeIter iter;
+ Gtk.TreeModel model;
+
+ if (bookmarks_treeview.Selection.GetSelected (out model, out iter)) {
+ selected_id = iter_to_id[iter] as string;
+ }
+
+ }
+
+ void on_cellrender_edited(object sender, EditedArgs args) {
+
+ // root group can't be edited
+ if ( selected_id == root_group.ID)
+ return;
+
+ BookmarkBase bk = null;
+ BookmarkManager.GetBookmarkBase(root_group,selected_id,ref bk);
+
+ if (bk == null ) {
+ Console.WriteLine("error, could not retrieve bookmark:{0}",selected_id);
+ return;
+ }
+
+ // it is not a bookmark
+ bk.Name = args.NewText;
+
+
+ //refreshing tree_view
+ BookmarkManager.Refresh();
+ BuildTreeView();
+ }
+
+ void on_row_activated(object sender, Gtk.RowActivatedArgs args) {
+ }
+ void OnDelete(object o, EventArgs args) {
+ manage_bookmarks_dialog.Destroy();
+ }
+ void on_NewFolderButton_clicked(object sender, EventArgs args) {
+ BookmarkManager.AddBookmarkGroup(root_group,selected_id,UNTITLED);
+ BookmarkManager.Refresh();
+ BuildTreeView();
+ }
+ void on_EditButton_clicked(object sender, EventArgs args) {
+ }
+ void OnDeleteClicked(object o, EventArgs args){
+ if (selected_id != string.Empty) {
+ BookmarkManager.DeleteBookmarkBase(root_group,selected_id);
+ BookmarkManager.Refresh();
+ BuildTreeView();
+
+ }
+
+ }
+ void OnCancelClicked(object o, EventArgs args) {
+ //TODO add undo logic
+ manage_bookmarks_dialog.Hide();
+ }
+
+ public void Show(){
+ BuildTreeView();
+ manage_bookmarks_dialog.ShowAll();
+ }
+
+ void BuildTreeView() {
+
+
+ TreeStore store = new TreeStore(typeof(string));
+ bookmarks_treeview.Model = store;
+
+ TreeIter iter = store.AppendValues(root_group.Name);
+
+ // appending root
+ iter_to_id[iter] = root_group.ID;
+
+ // calling the recursevily builder
+ BuildTreeViewHelper(root_group,iter,store);
+
+ /*
+ foreach(object i in root_group.Members) {
+ if (i is Bookmark)
+ iter_to_id[store.AppendValues(iter,((Bookmark)i).Name )] = ((Bookmark)i).ID;
+ }
+ */
+ bookmarks_treeview.ExpandAll();
+ }
+ void BuildTreeViewHelper(BookmarkGroup bookmarks, TreeIter iter, TreeStore store) {
+ TreeIter tmp_iter;
+
+ foreach (object i in bookmarks.Members) {
+ if (i is BookmarkGroup) {
+ tmp_iter = store.AppendValues(iter,((BookmarkGroup)i).Name );
+ iter_to_id[tmp_iter] = ((BookmarkGroup)i).ID;
+ BuildTreeViewHelper( (BookmarkGroup)i, tmp_iter, store);
+ }
+ if (i is Bookmark) {
+ tmp_iter = store.AppendValues(iter,((Bookmark)i).Name);
+ iter_to_id[tmp_iter] = ((Bookmark)i).ID;
+ }
+ }
+
+ }
+
+ }
+ internal class AddBookmarkDialog {
+ [Glade.Widget] Gtk.Entry name_entry;
+ [Glade.Widget] HBox hbox37;
+ [Glade.Widget] Gtk.Window add_bookmark_dialog;
+
+ string text, url;
+ BookmarkGroup root;
+ Combo combo;
+ Hashtable combo_to_id = new Hashtable();
+
+ public AddBookmarkDialog(BookmarkGroup root_group) {
+
+ Glade.XML xml = new Glade.XML("browser.glade","add_bookmark_dialog");
+ xml.Autoconnect(this);
+
+ combo = new Combo();
+
+ ArrayList list = new ArrayList();
+
+ BuildComboList(root_group,list);
+ combo.PopdownStrings = list.ToArray(typeof(string)) as string[];
+ combo.AllowEmpty = false;
+ combo.Entry.Editable = false;
+ combo.DisableActivate();
+
+ // pusihing widget into hbox
+ hbox37.PackEnd(combo);
+
+ //combo.Entry.Activated += new EventHandler(on_combo_entry_activated);
+
+ root = root_group;
+ text = url = String.Empty;
+
+ }
+
+ //recursively builds combo box
+ private void BuildComboList(BookmarkGroup bookmarks, ArrayList list) {
+
+ foreach (object i in bookmarks.Members)
+ {
+ if (i is BookmarkGroup) {
+ BuildComboList(i as BookmarkGroup, list);
+ }
+
+ }
+ list.Add(bookmarks.Name);
+ combo_to_id[bookmarks.Name] = bookmarks.ID;
+
+ }
+ public void on_AddBookmark_delete_event(object o, EventArgs args) {
+ add_bookmark_dialog.Destroy();
+ }
+
+ public void on_AddButton_clicked(object o, EventArgs args) {
+
+ /*
+ if (combo.Entry.Text != text )
+ BookmarkManager.AddBookmarkGroup(root,root.Name,combo.Entry.Text);
+ */
+
+ BookmarkManager.AddBookmark(root,combo_to_id[combo.Entry.Text] as string,name_entry.Text,url);
+ add_bookmark_dialog.Hide();
+ BookmarkManager.Refresh();
+ }
+
+ public void on_CancelButton_clicked(object o, EventArgs args) {
+ add_bookmark_dialog.Hide();
+ }
+
+ public void on_combo_entry_activated(object sender, EventArgs args) {
+
+ }
+
+ public void Show(string T, string U) {
+ name_entry.Text = T;
+ text = T.Trim();
+ url = U.Trim();
+ add_bookmark_dialog.ShowAll();
+ }
+
+ }
+
+ // attributes:
+ static BookmarkGroup root_group;
+ static string bookmark_file;
+ static XmlSerializer serializer;
+ static Browser _Browser;
+ static string current_bookmark_group = String.Empty;
+ static AddBookmarkDialog add_window = null;
+ static ManageBookmarkDialog edit_window = null;
+
+ static Hashtable menu_to_id;
+
+ const string ADD_BANNER = " Bookmark this page";
+ const string EDIT_BANNER = " Manage bookmarks";
+ const string ROOT_NAME = "Bookmarks";
+
+ private static void Refresh() {
+ BookmarkManager.Save();
+ BookmarkManager.BuildMenu(_Browser.bookmarksMenu);
+ }
+
+ private static void Save() {
+ using (FileStream file = new FileStream(bookmark_file,FileMode.Create)) {
+ serializer.Serialize(file,root_group);
+ }
+ #if DEBUG
+ Console.WriteLine("bookmarks saved ({0})",root_group.Members.Count);
+ #endif
+ }
+ private static void Load() {
+ using (FileStream file = new FileStream(bookmark_file,FileMode.Open)) {
+ root_group = (BookmarkGroup)serializer.Deserialize(file);
+ }
+ #if DEBUG
+ Console.WriteLine("bookmarks loaded ({0})",root_group.Members.Count);
+ #endif
+ }
+
+ public BookmarkManager(Browser browser){
+ _Browser = browser;
+
+
+ Console.WriteLine("Bookmark Manager init");
+
+ //discoverig bookmark file
+ bookmark_file = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData);
+ bookmark_file = System.IO.Path.Combine (bookmark_file, "monodoc");
+ bookmark_file = System.IO.Path.Combine (bookmark_file, "bookmarks.xml");
+
+ // creating serializer
+ serializer = new XmlSerializer(typeof(BookmarkGroup));
+
+ // trying to load saved bookmarks
+ try {
+ Load();
+ }catch (Exception e) {
+ // no bookmarks found, creating new root
+ root_group = new BookmarkGroup(ROOT_NAME);
+ }
+
+ current_bookmark_group = ROOT_NAME;
+ menu_to_id = new Hashtable();
+ BuildMenu(_Browser.bookmarksMenu);
+
+ }
+
+ public static void BuildMenu(MenuItem bookmark_menu) {
+ Menu aux = (Menu) bookmark_menu.Submenu;
+
+ foreach (Widget w in aux.Children) {
+ aux.Remove(w);
+ }
+
+ menu_to_id.Clear();
+
+ //adding Default Items:
+ AccelGroup bk_grp = new AccelGroup();
+ _Browser.window1.AddAccelGroup(bk_grp);
+
+ ImageMenuItem item;
+ item = new ImageMenuItem(ADD_BANNER);
+ //item.Image = new Gtk.Image(Stock.Add,IconSize.Menu);
+ item.AddAccelerator("activate",bk_grp,new AccelKey(Gdk.Key.D,Gdk.ModifierType.ControlMask,AccelFlags.Visible));
+ item.Activated += on_add_bookmark_activated;
+ aux.Append(item);
+
+ //edit
+ item = new ImageMenuItem(EDIT_BANNER);
+ item.AddAccelerator("activate",bk_grp,new AccelKey(Gdk.Key.M,Gdk.ModifierType.ControlMask,AccelFlags.Visible));
+ item.Activated += on_edit_bookmark_activated;
+ //item.Image = new Gtk.Image(Stock.Edit,Iconsize,Menu);
+ aux.Append(item);
+
+ // and finally the separtor
+ aux.Append(new SeparatorMenuItem());
+
+ BuildMenuHelper(aux,root_group);
+ aux.ShowAll();
+ }
+
+ private static void BuildMenuHelper(Menu menu, BookmarkGroup group) {
+ foreach (object i in group.Members)
+ {
+
+ if (i is BookmarkGroup) {
+ MenuItem item = new MenuItem( ((BookmarkGroup)i).Name);
+ item.Activated += on_bookmarkgroup_activated;
+ menu_to_id[item] = ((BookmarkGroup)i).ID;
+ menu.Append(item);
+ Menu m = new Menu();
+ item.Submenu = m;
+ BuildMenuHelper(m,((BookmarkGroup)i));
+ }
+ }
+
+ foreach (object i in group.Members)
+ {
+ if (i is Bookmark) {
+ #if DEBUG
+ Console.WriteLine("appending bookmark: [" + ((Bookmark)i).Name + "]");
+ #endif
+
+ MenuItem item = new MenuItem( ((Bookmark)i).Name);
+ menu_to_id[item] = ((Bookmark)i).ID;
+ item.Activated += on_bookmark_activated;
+ menu.Append(item);
+ menu_to_id[item] = ((Bookmark)i).ID;
+ }
+ }
+ }
+
+ // Event Handlers
+ static void on_add_bookmark_activated(object sender, EventArgs e){
+ add_window = new AddBookmarkDialog(root_group);
+ add_window.Show(_Browser.CurrentTab.Title,_Browser.CurrentUrl);
+ }
+
+ static void on_edit_bookmark_activated(object sender,EventArgs e) {
+ edit_window = new ManageBookmarkDialog(root_group);
+ edit_window.Show();
+ }
+
+ static void on_bookmark_activated(object sender, EventArgs e) {
+
+ // finding the inner label
+ BookmarkBase bk = null;
+ #if DEBUG
+ Console.WriteLine("looking for {0}/{1}",current_bookmark_group,label.Name);
+ #endif
+
+ GetBookmarkBase(root_group, menu_to_id[(MenuItem)sender] as string,ref bk);
+
+ if (bk != null) {
+ if (bk is Bookmark)
+ try {
+ _Browser.LoadUrl( ((Bookmark)bk).Url);
+ } catch (Exception ex) {
+ Console.WriteLine("##########################");
+ Console.WriteLine("Exception loading bookmark:[{0}],",((Bookmark)bk).Url);
+ Console.WriteLine("##########################");
+ Console.WriteLine(ex);
+ }
+ }
+ else {
+ Console.WriteLine("Bookmark error -> could not load bookmark");
+ }
+ }
+
+ static void on_bookmarkgroup_activated(object sender, EventArgs e) {
+ // finding the inner label
+ if ( ((MenuItem)sender).Child is Gtk.Label) {
+ Gtk.Label label = (Gtk.Label) ((MenuItem)sender).Child;
+ current_bookmark_group = label.Name;
+ }
+ }
+
+ public void EditBookMark() {}
+
+ // static helper methods
+ /// <summary> Recursively deletes a bookmark </summary>
+ public static void DeleteBookmarkBase(BookmarkGroup bookmarks, string ID) {
+
+ foreach (object i in bookmarks.Members) {
+
+ if ( i is Bookmark) {
+ if ( ((Bookmark)i).ID == ID) {
+ bookmarks.Members.Remove(i);
+ return;
+ }
+
+ }else if (i is BookmarkGroup) {
+ if ( ((BookmarkGroup)i).ID == ID) {
+ bookmarks.Members.Remove(i);
+ return;
+ }
+ DeleteBookmarkBase( ((BookmarkGroup)i),ID);
+ }
+
+
+ }
+ }
+
+ /// <summary> Recursively finds a bookmarkbase </summary>
+ public static void GetBookmarkBase(BookmarkGroup bookmarks, string ID, ref BookmarkBase retval) {
+
+ foreach (object i in bookmarks.Members) {
+
+ if ( ((BookmarkBase)i).ID == ID) {
+ retval = i as BookmarkBase;
+ return;
+ }
+
+ if ( i is BookmarkGroup) {
+ GetBookmarkBase((BookmarkGroup)i,ID,ref retval);
+ }
+
+
+ }
+ }
+
+ /// <summary> Recursively adds a bookmark </summary>
+ public static void AddBookmark(BookmarkGroup bookmarks, string parent_ID, string bookmark_text, string bookmark_url) {
+ if ( bookmarks.ID == parent_ID) {
+ bookmarks.Members.Add(new Bookmark(bookmark_text,bookmark_url) );
+ return;
+ }
+ foreach (object i in bookmarks.Members)
+ {
+ if (i is BookmarkGroup) {
+ AddBookmark( ((BookmarkGroup)i),parent_ID,bookmark_text,bookmark_url);
+
+ }
+ }
+ }
+
+ /// <summary> Recursively adds a bookmark </summary>
+ public static void AddBookmarkGroup(BookmarkGroup bookmarks, string parent_ID, string name) {
+ if ( bookmarks.ID == parent_ID) {
+ bookmarks.Members.Add(new BookmarkGroup(name) );
+ return;
+ }
+
+ foreach (object i in bookmarks.Members)
+ {
+ if (i is BookmarkGroup) {
+ AddBookmarkGroup( ((BookmarkGroup)i),parent_ID,name);
+
+ }
+ if (i is Bookmark ){
+ if ( ((Bookmark)i).ID == parent_ID ) {
+ bookmarks.Members.Add(new BookmarkGroup(name));
+ return;
+ }
+ }
+
+ }
+ }
+ }
+}
+