[gnote] Search for linking notes using full link tag



commit ff206586ae7beb26f0e46fe918359c92ec6e83bf
Author: Aurimas Černius <aurisc4 gmail com>
Date:   Mon Oct 28 23:28:13 2013 +0200

    Search for linking notes using full link tag
    
    Fixes Bug 701492.

 src/addins/backlinks/backlinksnoteaddin.cpp |   17 ++++-------------
 src/note.cpp                                |   13 +------------
 src/notemanager.cpp                         |   14 ++++++++++++++
 src/notemanager.hpp                         |    1 +
 4 files changed, 20 insertions(+), 25 deletions(-)
---
diff --git a/src/addins/backlinks/backlinksnoteaddin.cpp b/src/addins/backlinks/backlinksnoteaddin.cpp
index 52255ad..2bd1417 100644
--- a/src/addins/backlinks/backlinksnoteaddin.cpp
+++ b/src/addins/backlinks/backlinksnoteaddin.cpp
@@ -93,19 +93,10 @@ void BacklinksNoteAddin::update_menu(Gtk::Menu *menu)
 
 void BacklinksNoteAddin::get_backlink_menu_items(std::list<BacklinkMenuItem*> & items)
 {
-  std::string search_title = get_note()->get_title();
-  std::string encoded_title = sharp::string_trim(
-      gnote::utils::XmlEncoder::encode(sharp::string_to_lower(search_title)));
-
-  // Go through each note looking for
-  // notes that link to this one.
-  const gnote::Note::List & list = get_note()->manager().get_notes();
-  for(gnote::Note::List::const_iterator iter = list.begin();
-      iter != list.end(); ++iter) {
-    const gnote::Note::Ptr & note(*iter);
-    if (note != get_note() // don't match ourself
-        && check_note_has_match (note, encoded_title)) {
-      BacklinkMenuItem *item = manage(new BacklinkMenuItem (note, search_title));
+  gnote::Note::List notes = get_note()->manager().get_notes_linking_to(get_note()->get_title());
+  FOREACH(const gnote::Note::Ptr & note, notes) {
+    if(note != get_note()) { // don't match ourself
+      BacklinkMenuItem *item = manage(new BacklinkMenuItem(note, get_note()->get_title()));
 
       items.push_back(item);
     }
diff --git a/src/note.cpp b/src/note.cpp
index 41ad974..868c7d0 100644
--- a/src/note.cpp
+++ b/src/note.cpp
@@ -671,20 +671,9 @@ namespace gnote {
 
   void Note::process_rename_link_update(const std::string & old_title)
   {
-    Note::List linking_notes;
-    const Note::List & manager_notes = m_manager.get_notes();
+    Note::List linking_notes = m_manager.get_notes_linking_to(old_title);
     const Note::Ptr self = shared_from_this();
 
-    for (Note::List::const_iterator iter = manager_notes.begin();
-         manager_notes.end() != iter;
-         iter++) {
-      // Technically, containing text does not imply linking,
-      // but this is less work
-      const Note::Ptr note = *iter;
-      if (note != self && note->contains_text(old_title))
-        linking_notes.push_back(note);
-    }
-
     if (!linking_notes.empty()) {
       Glib::RefPtr<Gio::Settings> settings = 
Preferences::obj().get_schema_settings(Preferences::SCHEMA_GNOTE);
       const NoteRenameBehavior behavior
diff --git a/src/notemanager.cpp b/src/notemanager.cpp
index 35b0874..0e9a063 100644
--- a/src/notemanager.cpp
+++ b/src/notemanager.cpp
@@ -796,6 +796,20 @@ namespace gnote {
     return title;
   }
 
+  Note::List NoteManager::get_notes_linking_to(const std::string & title) const
+  {
+    std::string tag = "<link:internal>" + utils::XmlEncoder::encode(title) + "</link:internal>";
+    Note::List result;
+    FOREACH(const Note::Ptr & note, m_notes) {
+      if(note->get_title() != title) {
+        if(note->get_complete_note_xml().find(tag) != std::string::npos) {
+          result.push_back(note);
+        }
+      }
+    }
+    return result;
+  }
+
 
   TrieController::TrieController (NoteManager & manager)
     : m_manager(manager)
diff --git a/src/notemanager.hpp b/src/notemanager.hpp
index fe298cf..ff2a15d 100644
--- a/src/notemanager.hpp
+++ b/src/notemanager.hpp
@@ -96,6 +96,7 @@ namespace gnote {
     Note::Ptr get_or_create_template_note();
     static std::string get_note_template_content(const std::string & title);
     static std::string split_title_from_content (std::string title, std::string & body);
+    Note::List get_notes_linking_to(const std::string & title) const;
 
     ChangedHandler signal_note_deleted;
     ChangedHandler signal_note_added;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]