]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
* Add ability to rename branches (bug 4128).
[lyx.git] / src / Buffer.cpp
index f0c4a53859b7688dd5b793203c5a48b283f3cba6..53ade6faf3683655839783effc631bc4f9a0f8f3 100644 (file)
@@ -1623,6 +1623,7 @@ bool Buffer::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                }
 
                case LFUN_BRANCH_ADD:
+               case LFUN_BRANCHES_RENAME:
                case LFUN_BUFFER_PRINT:
                        // if no Buffer is present, then of course we won't be called!
                        flag.setEnabled(true);
@@ -1705,6 +1706,13 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr)
                break;
        }
 
+       case LFUN_BRANCHES_RENAME: {
+               docstring const oldname = from_utf8(func.getArg(0));
+               docstring const newname = from_utf8(func.getArg(1));
+               renameBranches(oldname, newname);
+               break;
+       }
+
        case LFUN_BUFFER_PRINT: {
                // we'll assume there's a problem until we succeed
                dr.setError(true); 
@@ -2405,6 +2413,54 @@ void Buffer::getUsedBranches(std::list<docstring> & result, bool const from_mast
 }
 
 
+void Buffer::renameBranches(docstring const & oldname, docstring const & newname)
+{
+       // Iterate over buffer, starting with first paragraph
+       // The scope must be bigger than any lookup DocIterator
+       // later. For the global lookup, lastpit+1 is used, hence
+       // we use lastpit+2 here.
+       DocIterator it = par_iterator_begin();
+       DocIterator scope = it;
+       scope.pit() = scope.lastpit() + 2;
+       pit_type lastpit = it.lastpit();
+
+       while (it.pit() <= lastpit) {
+               Paragraph & par = it.paragraph();
+
+               // iterate over the insets of the current paragraph
+               InsetList const & insets = par.insetList();
+               InsetList::const_iterator iit = insets.begin();
+               InsetList::const_iterator end = insets.end();
+               for (; iit != end; ++iit) {
+                       it.pos() = iit->pos;
+
+                       if (iit->inset->lyxCode() == BRANCH_CODE) {
+                               // get buffer of external file
+                               InsetBranch & br =
+                                       static_cast<InsetBranch &>(*iit->inset);
+                               if (br.branch() == oldname)
+                                       br.rename(newname);
+                               continue;
+                       }
+
+                       // is it an external file?
+                       if (iit->inset->lyxCode() == INCLUDE_CODE) {
+                               // get buffer of external file
+                               InsetInclude const & inset =
+                                       static_cast<InsetInclude const &>(*iit->inset);
+                               Buffer * child = inset.getChildBuffer();
+                               if (!child)
+                                       continue;
+                               child->renameBranches(oldname, newname);
+                       }
+               }
+               // next paragraph
+               it.pit()++;
+               it.pos() = 0;
+       }
+}
+
+
 void Buffer::updateMacroInstances() const
 {
        LYXERR(Debug::MACROS, "updateMacroInstances for "