+/** Switch p_buf to point to next document buffer.
+ **
+ ** Return true if restarted from master-document buffer.
+ **
+ ** @note
+ ** Not using p_buf->allRelatives() here, because I'm not sure
+ ** whether or not the returned order is independent of p_buf.
+ **/
+static bool next_document_buffer(Buffer * & p_buf) {
+ Buffer *p_master = p_buf;
+ Buffer *p_old;
+ do {
+ p_old = p_master;
+ p_master = const_cast<Buffer *>(p_master->masterBuffer());
+ LYXERR(Debug::FIND, "p_old="
+ << p_old
+ << ", p_master="
+ << p_master);
+ } while (p_master != p_old);
+ LASSERT(p_master != NULL, /**/);
+ vector<Buffer *> v_children;
+ /* Root master added as first buffer in the vector */
+ v_children.push_back(p_master);
+ p_master->getChildren(v_children, true);
+ LYXERR(Debug::FIND, "v_children.size()=" << v_children.size());
+ vector<Buffer *>::const_iterator it =
+ find(v_children.begin(), v_children.end(), p_buf);
+ LASSERT(it != v_children.end(), /**/)
+ ++it;
+ if (it == v_children.end()) {
+ p_buf = *v_children.begin();
+ return true;
+ }
+ p_buf = *it;
+ return false;
+}
+
+
+/** Switch p_buf to point to previous document buffer.
+ **
+ ** Return true if restarted from last child buffer.
+ **
+ ** @note
+ ** Not using p_buf->allRelatives() here, because I'm not sure
+ ** whether or not the returned order is independent of p_buf.
+ **/
+static bool prev_document_buffer(Buffer * & p_buf) {
+ Buffer *p_master = p_buf;
+ Buffer *p_old;
+ do {
+ p_old = p_master;
+ p_master = const_cast<Buffer *>(p_master->masterBuffer());
+ LYXERR(Debug::FIND,
+ "p_old=" << p_old
+ << ", p_master=" << p_master);
+ } while (p_master != p_old);
+ LASSERT(p_master != NULL, /**/);
+ vector<Buffer *> v_children;
+ /* Root master added as first buffer in the vector */
+ v_children.push_back(p_master);
+ p_master->getChildren(v_children, true);
+ LYXERR(Debug::FIND, "v_children.size()=" << v_children.size());
+ vector<Buffer *>::const_iterator it =
+ find(v_children.begin(), v_children.end(), p_buf);
+ LASSERT(it != v_children.end(), /**/)
+ if (it == v_children.begin()) {
+ it = v_children.end();
+ --it;
+ p_buf = *it;
+ return true;
+ }
+ --it;
+ p_buf = *it;
+ return false;
+}
+
+
+/** Switch buf to point to next or previous buffer in search scope.
+ **
+ ** Return true if restarted from scratch.
+ **/
+static bool next_prev_buffer(Buffer * & buf,
+ FindAndReplaceOptions const & opt)