+ return true;
+}
+
+
+/** Check if first letter is upper case and second one is lower case */
+static bool firstUppercase(DocIterator const & cur) {
+ char_type ch1, ch2;
+ if (cur.pos() >= cur.lastpos() - 1) {
+ LYXERR(Debug::FIND, "No upper-case at cur: " << cur);
+ return false;
+ }
+ ch1 = cur.paragraph().getChar(cur.pos());
+ ch2 = cur.paragraph().getChar(cur.pos()+1);
+ bool result = isUpperCase(ch1) && isLowerCase(ch2);
+ LYXERR(Debug::FIND, "firstUppercase(): "
+ << "ch1=" << ch1 << "(" << char(ch1) << "), ch2="
+ << ch2 << "(" << char(ch2) << ")"
+ << ", result=" << result << ", cur=" << cur);
+ return result;
+}
+
+
+/** Make first letter of supplied buffer upper-case, and the rest lower-case.
+ **
+ ** \fixme What to do with possible further paragraphs in replace buffer ?
+ **/
+static void changeFirstCase(Buffer & buffer, TextCase first_case, TextCase others_case) {
+ ParagraphList::iterator pit = buffer.paragraphs().begin();
+ pos_type right = pos_type(1);
+ pit->changeCase(buffer.params(), pos_type(0), right, first_case);
+ right = pit->size() + 1;
+ pit->changeCase(buffer.params(), right, right, others_case);
+}
+} // anon namespace
+
+///
+static void findAdvReplace(BufferView * bv, FindAndReplaceOptions const & opt, MatchStringAdv & matchAdv)
+{
+ Cursor & cur = bv->cursor();
+ if (opt.repl_buf_name == docstring())
+ return;
+
+ DocIterator sel_beg = cur.selectionBegin();
+ DocIterator sel_end = cur.selectionEnd();
+ if (&sel_beg.inset() != &sel_end.inset()
+ || sel_beg.pit() != sel_end.pit())
+ return;
+ int sel_len = sel_end.pos() - sel_beg.pos();
+ LYXERR(Debug::FIND, "sel_beg: " << sel_beg << ", sel_end: " << sel_end
+ << ", sel_len: " << sel_len << endl);
+ if (sel_len == 0)
+ return;
+ LASSERT(sel_len > 0, /**/);
+
+ if (!matchAdv(sel_beg, sel_len))
+ return;
+
+ // Build a copy of the replace buffer, adapted to the KeepCase option
+ Buffer & repl_buffer_orig = *theBufferList().getBuffer(FileName(to_utf8(opt.repl_buf_name)), true);
+ ostringstream oss;
+ repl_buffer_orig.write(oss);
+ string lyx = oss.str();
+ Buffer repl_buffer("", false);
+ repl_buffer.setUnnamed(true);
+ LASSERT(repl_buffer.readString(lyx), /**/);
+ if (opt.keep_case && sel_len >= 2) {
+ if (cur.inTexted()) {
+ if (firstUppercase(cur))
+ changeFirstCase(repl_buffer, text_uppercase, text_lowercase);
+ else if (allNonLowercase(cur, sel_len))
+ changeFirstCase(repl_buffer, text_uppercase, text_uppercase);
+ }