public void AddRecentlyChangedNotes() { int min_size = (int)Preferences.Get(Preferences.MENU_NOTE_COUNT); int max_size = 18; int list_size = 0; bool menuOpensUpward = tray.MenuOpensUpward(); NoteMenuItem item; // Remove the old dynamic items RemoveRecentlyChangedNotes(); // Assume menu opens downward, move common items to top of menu Gtk.MenuItem newNoteItem = Tomboy.ActionManager.GetWidget( "/TrayIconMenu/TrayNewNotePlaceholder/TrayNewNote") as Gtk.MenuItem; Gtk.MenuItem searchNotesItem = Tomboy.ActionManager.GetWidget( "/TrayIconMenu/ShowSearchAllNotes") as Gtk.MenuItem; tray_menu.ReorderChild(newNoteItem, 0); int insertion_point = 1; // If menu opens downward // Find all child widgets under the TrayNewNotePlaceholder // element. Make sure those added by add-ins are // properly accounted for and reordered. List <Gtk.Widget> newNotePlaceholderWidgets = new List <Gtk.Widget> (); IList <Gtk.Widget> allChildWidgets = Tomboy.ActionManager.GetPlaceholderChildren("/TrayIconMenu/TrayNewNotePlaceholder"); foreach (Gtk.Widget child in allChildWidgets) { if (child is Gtk.MenuItem && child != newNoteItem) { newNotePlaceholderWidgets.Add(child); tray_menu.ReorderChild(child, insertion_point); insertion_point++; } } tray_menu.ReorderChild(searchNotesItem, insertion_point); insertion_point++; DateTime days_ago = DateTime.Today.AddDays(-3); // Prevent template notes from appearing in the menu Tag template_tag = TagManager.GetOrCreateSystemTag(TagManager.TemplateNoteSystemTag); // List the most recently changed notes, any currently // opened notes, and any pinned notes... foreach (Note note in manager.Notes) { if (note.IsSpecial) { continue; } // Skip template notes if (note.ContainsTag(template_tag)) { continue; } bool show = false; // Test for note.IsPinned first so that all of the pinned notes // are guaranteed to be included regardless of the size of the // list. if (note.IsPinned) { show = true; } else if ((note.IsOpened && note.Window.IsMapped) || note.ChangeDate > days_ago || list_size < min_size) { if (list_size <= max_size) { show = true; } } if (show) { item = new NoteMenuItem(note, true); // Add this widget to the menu (+insertion_point to add after new+search+...) tray_menu.Insert(item, list_size + insertion_point); // Keep track of this item so we can remove it later recent_notes.Add(item); list_size++; } } Note start = manager.FindByUri(NoteManager.StartNoteUri); if (start != null) { item = new NoteMenuItem(start, false); if (menuOpensUpward) { tray_menu.Insert(item, list_size + insertion_point); } else { tray_menu.Insert(item, insertion_point); } recent_notes.Add(item); list_size++; bool enable_keybindings = (bool) Preferences.Get(Preferences.ENABLE_KEYBINDINGS); if (enable_keybindings) { GConfKeybindingToAccel.AddAccelerator( item, Preferences.KEYBINDING_OPEN_START_HERE); } } // FIXME: Rearrange this stuff to have less wasteful reordering if (menuOpensUpward) { // Relocate common items to bottom of menu insertion_point -= 1; tray_menu.ReorderChild(searchNotesItem, list_size + insertion_point); foreach (Gtk.Widget widget in newNotePlaceholderWidgets) { tray_menu.ReorderChild(widget, list_size + insertion_point); } tray_menu.ReorderChild(newNoteItem, list_size + insertion_point); insertion_point = list_size; } Gtk.SeparatorMenuItem separator = new Gtk.SeparatorMenuItem(); tray_menu.Insert(separator, insertion_point); recent_notes.Add(separator); }