Alfredo Braunstein wrote:

Updated version.

- Introduces PosIterator.[Ch]

and fixes lyxfind.C with it:

- This has no S&R regressions wrt. 1.3.x I am aware of
- allows backward replaces (didn't work in 1.3.x) 
- fixes the "search ignoring things in tables" bug 576. 
- "replace all" is faster and doesn't open collapsables.

It would be nice if someone could test it and/or comment it.

Thanks, Alfredo
? iterators.C-save
? iterators.h-save
? lyxfind.C-save
? lyxrow_funcs.C-bad1
? paragraph.C-bad1
? text.C-bad1
? text.C-good
? text.C-goood
? text3-save.C
Index: BufferView_pimpl.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/BufferView_pimpl.C,v
retrieving revision 1.450
diff -u -p -u -r1.450 BufferView_pimpl.C
--- BufferView_pimpl.C	29 Oct 2003 19:19:21 -0000	1.450
+++ BufferView_pimpl.C	1 Nov 2003 12:11:08 -0000
@@ -418,8 +418,6 @@ void BufferView::Pimpl::resizeCurrentBuf
 		bv_->text->fullRebreak();
 		update();
 	} else {
-		lyxerr << "text not available!" << endl;
-			lyxerr << "no text in cache!" << endl;
 			bv_->text = new LyXText(bv_, 0, false, bv_->buffer()->paragraphs());
 			bv_->text->init(bv_);
 	}
Index: Makefile.am
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/Makefile.am,v
retrieving revision 1.197
diff -u -p -u -r1.197 Makefile.am
--- Makefile.am	29 Oct 2003 10:47:12 -0000	1.197
+++ Makefile.am	1 Nov 2003 12:11:08 -0000
@@ -228,6 +228,8 @@ lyx_SOURCES = \
 	paragraph.h \
 	paragraph_pimpl.C \
 	paragraph_pimpl.h \
+	PosIterator.h \
+	PosIterator.C \
 	SpellBase.h \
 	ispell.C \
 	ispell.h \
Index: PosIterator.C
===================================================================
RCS file: PosIterator.C
diff -N PosIterator.C
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ PosIterator.C	1 Nov 2003 12:11:09 -0000
@@ -0,0 +1,151 @@
+/* \file PosIterator.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Alfredo Braunstein
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+
+#include <config.h>
+
+#include "PosIterator.h"
+
+#include "buffer.h"
+#include "BufferView.h"
+#include "lyxtext.h"
+
+#include "paragraph.h"
+#include "cursor.h"
+#include "iterators.h"
+
+#include "insets/insettext.h"
+#include "insets/updatableinset.h"
+#include "insets/inset.h"
+
+
+using boost::prior;
+
+PosIterator & PosIterator::operator++()
+{
+	while (!stack_.empty()) {
+		PosIteratorItem & p = stack_.top();
+		
+		if (p.pos < p.pit->size()) {
+			InsetOld * inset = p.pit->getInset(p.pos);
+			if (inset) {
+				ParagraphList * pl = inset->getParagraphs(p.index);
+				if (pl) {
+					p.index++;
+					stack_.push(PosIteratorItem(pl));
+					return *this;
+				}
+			}
+			p.index = 0;
+			++p.pos;
+		} else {
+			++p.pit;
+			p.pos = 0;
+		}
+		
+		if (p.pit != p.pl->end() || stack_.size() == 1)
+			return *this;
+		
+		stack_.pop();
+	}
+	return *this;
+}
+
+
+PosIterator & PosIterator::operator--()
+{
+	while (!stack_.empty()) {
+		{
+			PosIteratorItem & p = stack_.top();
+			if (p.pos > 0) {
+				--p.pos;
+				InsetOld * inset = p.pit->getInset(p.pos);
+				if (inset)
+					p.index = inset->numParagraphs();
+			} else {
+				if (p.pit == p.pl->begin()) {
+					if (stack_.size() == 1)
+						return *this;
+					stack_.pop();
+					--stack_.top().index;
+				} else {
+					--p.pit;
+					p.pos = p.pit->size();
+				}
+			}
+		}
+		PosIteratorItem & p = stack_.top();
+		if (p.pos < p.pit->size()) {
+			InsetOld * inset = p.pit->getInset(p.pos);
+			if (inset && p.index > 0) {
+				ParagraphList *
+					pl = inset->getParagraphs(p.index - 1);
+				BOOST_ASSERT(pl);
+				stack_.push(PosIteratorItem(pl, prior(pl->end()), pl->back().size()));
+			}
+		}
+		return *this;
+	}
+	return *this;
+}
+
+
+bool PosIterator::operator!=(PosIterator const & a) const
+{
+	return !operator==(a);
+}
+
+
+
+bool PosIterator::operator==(PosIterator const & a) const 
+{
+	
+	PosIteratorItem const & pa = a.stack_.top();
+	PosIteratorItem const & p = stack_.top();
+	
+	return (pa.pl == p.pl && pa.pit == p.pit &&
+		(p.pit == p.pl->end() || pa.pos == p.pos));
+}
+
+
+bool PosIterator::at_end() const
+{
+	return pos() == pit()->size();
+}
+
+
+PosIterator::PosIterator(ParagraphList * pl, ParagraphList::iterator pit,
+			 lyx::pos_type pos)
+{
+	stack_.push(PosIteratorItem(pl,pit,pos));
+}
+
+
+PosIterator::PosIterator(ParagraphList * pl)
+{
+	stack_.push(PosIteratorItem(pl, pl->begin(), 0));
+}
+
+
+PosIterator::PosIterator(BufferView & bv)
+{
+	LyXText * text = bv.getLyXText();
+	lyx::pos_type pos = text->cursor.pos();
+	ParagraphList::iterator pit = text->cursorPar();
+	
+	ParIterator par = bv.buffer()->par_iterator_begin();
+	ParIterator end = bv.buffer()->par_iterator_end();
+	for ( ; par != end; ++par) {
+		if (par.pit() == pit)
+			break;
+	}
+
+	*this = PosIterator(par, pos);
+}
+
Index: PosIterator.h
===================================================================
RCS file: PosIterator.h
diff -N PosIterator.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ PosIterator.h	1 Nov 2003 12:11:09 -0000
@@ -0,0 +1,65 @@
+// -*- C++ -*-
+/* \file PosIterator.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Alfredo Braunstein
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef POSITERATOR_H
+#define POSITERATOR_H
+
+#include "ParagraphList_fwd.h"
+
+#include <boost/scoped_ptr.hpp>
+
+#include "support/types.h"
+
+#include <stack>
+
+class ParIterator;
+
+class BufferView;
+
+struct PosIteratorItem 
+{
+	PosIteratorItem(ParagraphList * pl): pl(pl), pit(pl->begin()),
+					     pos(0), index(0) {};
+	PosIteratorItem(ParagraphList * pl,
+			ParagraphList::iterator pit,
+			lyx::pos_type pos,
+			int index = 0)
+		: pl(pl), pit(pit), pos(pos), index(index) {};
+	ParagraphList * pl;
+	ParagraphList::iterator pit;
+	lyx::pos_type pos;
+	int index;
+};
+
+
+class PosIterator
+{
+public:
+	PosIterator(BufferView & bv);
+	PosIterator(ParIterator & par, lyx::pos_type pos);
+	PosIterator(ParagraphList * pl);
+	PosIterator(ParagraphList * pl, ParagraphList::iterator pit,
+		    lyx::pos_type pos);
+	PosIterator(ParIterator const & parit, lyx::pos_type p);
+	PosIterator & operator++();
+	PosIterator & operator--();
+	bool operator!=(PosIterator const &) const;
+	bool operator==(PosIterator const &) const;
+
+	ParagraphList::iterator pit() const { return stack_.top().pit; }
+	lyx::pos_type pos() const { return stack_.top().pos; }
+	bool at_end() const;
+private:
+	std::stack<PosIteratorItem> stack_;
+};
+
+
+#endif
+
Index: buffer.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/buffer.C,v
retrieving revision 1.538
diff -u -p -u -r1.538 buffer.C
--- buffer.C	31 Oct 2003 18:45:34 -0000	1.538
+++ buffer.C	1 Nov 2003 12:11:11 -0000
@@ -36,6 +36,7 @@
 #include "paragraph.h"
 #include "paragraph_funcs.h"
 #include "ParagraphParameters.h"
+#include "PosIterator.h"
 #include "sgml.h"
 #include "texrow.h"
 #include "undo.h"
@@ -1469,6 +1470,18 @@ bool Buffer::hasParWithID(int id) const
 			return true;
 
 	return false;
+}
+
+
+PosIterator Buffer::pos_iterator_begin()
+{
+	return PosIterator(&paragraphs(), paragraphs().begin(), 0);	
+}
+
+
+PosIterator Buffer::pos_iterator_end()
+{
+	return PosIterator(&paragraphs(), paragraphs().end(), 0);	
 }
 
 
Index: buffer.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/buffer.h,v
retrieving revision 1.170
diff -u -p -u -r1.170 buffer.h
--- buffer.h	31 Oct 2003 18:45:34 -0000	1.170
+++ buffer.h	1 Nov 2003 12:11:11 -0000
@@ -40,6 +40,7 @@ class LatexRunParams;
 class Language;
 class Messages;
 class ParIterator;
+class PosIterator;
 class ParConstIterator;
 class TeXErrors;
 class TexRow;
@@ -345,6 +346,10 @@ public:
 	/// return the const end of all *top-level* insets in the buffer
 	inset_iterator inset_const_iterator_end() const;
 
+	///
+	PosIterator pos_iterator_begin();
+	///
+	PosIterator pos_iterator_end();
 	///
 	ParIterator par_iterator_begin();
 	///
Index: iterators.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/iterators.C,v
retrieving revision 1.23
diff -u -p -u -r1.23 iterators.C
--- iterators.C	29 Oct 2003 12:18:06 -0000	1.23
+++ iterators.C	1 Nov 2003 12:11:12 -0000
@@ -13,9 +13,15 @@
 
 #include "iterators.h"
 #include "paragraph.h"
+#include "PosIterator.h"
 #include "cursor.h"
+#include "BufferView.h"
+#include "funcrequest.h"
+#include "dispatchresult.h"
+
 
 #include "insets/inset.h"
+#include "insets/updatableinset.h"
 
 #include <boost/next_prior.hpp>
 #include <boost/optional.hpp>
@@ -355,4 +361,30 @@ bool operator==(ParConstIterator const &
 bool operator!=(ParConstIterator const & iter1, ParConstIterator const & iter2)
 {
 	return !(iter1 == iter2);
+}
+
+
+PosIterator::PosIterator(ParIterator & parit, lyx::pos_type pos)
+{
+	int const last = parit.size() - 1;
+	for (int i = 0; i < last; ++i) {
+		ParPosition & pp = parit.pimpl_->positions[i];
+		stack_.push(PosIteratorItem(const_cast<ParagraphList *>(pp.plist),
+					    pp.pit, (*pp.it)->pos, *pp.index + 1));
+	}
+	ParPosition const & pp = parit.pimpl_->positions[last];
+	stack_.push(PosIteratorItem(const_cast<ParagraphList *>(pp.plist),
+				    pp.pit, pos, 0));
+}
+
+
+void ParIterator::lockPath(BufferView * bv) const
+{
+	bv->insetUnlock();
+	int last = size() - 1;
+	for (int i = 0; i < last; ++i) {
+		UpdatableInset * inset = dynamic_cast<UpdatableInset *>((*pimpl_->positions[i].it)->inset);
+		FuncRequest cmd(bv, LFUN_INSET_EDIT);
+		inset->dispatch(cmd);
+	}
 }
Index: iterators.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/iterators.h,v
retrieving revision 1.19
diff -u -p -u -r1.19 iterators.h
--- iterators.h	29 Oct 2003 12:18:06 -0000	1.19
+++ iterators.h	1 Nov 2003 12:11:12 -0000
@@ -19,6 +19,7 @@
 class LyXText;
 class InsetOld;
 class Cursor;
+class BufferView;
 
 class ParIterator {
 public:
@@ -56,6 +57,11 @@ public:
 	///
 	friend
 	bool operator==(ParIterator const & iter1, ParIterator const & iter2);
+	///
+	friend class PosIterator;
+	///
+	void lockPath(BufferView *) const;
+
 private:
 	struct Pimpl;
 	boost::scoped_ptr<Pimpl> pimpl_;
@@ -93,6 +99,10 @@ public:
 	friend
 	bool operator==(ParConstIterator const & iter1,
 			ParConstIterator const & iter2);
+	///
+	friend class PosIterator;
+	///
+	void lockPath(BufferView *) const;
 private:
 	struct Pimpl;
 	boost::scoped_ptr<Pimpl> pimpl_;
Index: lyxfind.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxfind.C,v
retrieving revision 1.54
diff -u -p -u -r1.54 lyxfind.C
--- lyxfind.C	9 Oct 2003 10:52:07 -0000	1.54
+++ lyxfind.C	1 Nov 2003 12:11:12 -0000
@@ -6,6 +6,7 @@
  * \author Lars Gullik Bjønnes
  * \author John Levon
  * \author Jürgen Vigna
+ * \author Alfredo Braunstein
  *
  * Full author contact details are available in file CREDITS.
  */
@@ -14,11 +15,16 @@
 
 #include "lyxfind.h"
 
+#include "funcrequest.h"
+#include "dispatchresult.h"
 #include "buffer.h"
 #include "BufferView.h"
+#include "debug.h"
+#include "iterators.h"
 #include "gettext.h"
 #include "lyxtext.h"
 #include "paragraph.h"
+#include "PosIterator.h"
 
 #include "frontends/Alert.h"
 
@@ -37,304 +43,261 @@ namespace find {
 
 namespace {
 
-// returns true if the specified string is at the specified position
-bool isStringInText(Paragraph const & par, pos_type pos,
-		    string const & str, bool const & cs,
-		    bool const & mw)
+class MatchString
 {
-	string::size_type size = str.length();
-	pos_type i = 0;
-	pos_type parsize = par.size();
-	while ((pos + i < parsize)
-	       && (string::size_type(i) < size)
-	       && (cs ? (str[i] == par.getChar(pos + i))
-		   : (uppercase(str[i]) == uppercase(par.getChar(pos + i))))) {
-		++i;
-	}
-
-	if (size == string::size_type(i)) {
-		// if necessary, check whether string matches word
-		if (!mw)
-			return true;
-		if ((pos <= 0 || !IsLetterCharOrDigit(par.getChar(pos - 1)))
-			&& (pos + pos_type(size) >= parsize
-			|| !IsLetterCharOrDigit(par.getChar(pos + size)))) {
-			return true;
+public:
+	MatchString(string const & str, bool cs, bool mw)
+		: str(str), cs(cs), mw(mw) {};
+// returns true if the specified string is at the specified position
+	bool operator()(Paragraph const & par, pos_type pos) const
+	{			
+		string::size_type size = str.length();
+		pos_type i = 0;
+		pos_type parsize = par.size();
+		while ((pos + i < parsize)
+		       && (string::size_type(i) < size)
+		       && (cs ? (str[i] == par.getChar(pos + i))
+			   : (uppercase(str[i]) == uppercase(par.getChar(pos + i))))) {
+			++i;
 		}
-	}
-	return false;
-}
-
-// forward search:
-// if the string can be found: return true and set the cursor to
-// the new position, cs = casesensitive, mw = matchword
-SearchResult searchForward(BufferView * bv, LyXText * text, string const & str,
-			   bool const & cs, bool const & mw)
-{
-	ParagraphList::iterator pit = text->cursorPar();
-	ParagraphList::iterator pend = text->ownerParagraphs().end();
-	pos_type pos = text->cursor.pos();
-	UpdatableInset * inset;
-
-	while (pit != pend && !isStringInText(*pit, pos, str, cs, mw)) {
-		if (pos < pit->size()
-		    && pit->isInset(pos)
-		    && (inset = (UpdatableInset *)pit->getInset(pos))
-		    && inset->isTextInset()
-		    && inset->searchForward(bv, str, cs, mw))
-			return SR_FOUND_NOUPDATE;
-
-		if (++pos >= pit->size()) {
-			++pit;
-			pos = 0;
+		if (size == string::size_type(i)) {
+			// if necessary, check whether string matches word
+			if (!mw)
+				return true;
+			if ((pos <= 0 || !IsLetterCharOrDigit(par.getChar(pos - 1)))
+			    && (pos + pos_type(size) >= parsize
+				|| !IsLetterCharOrDigit(par.getChar(pos + size)))) {
+				return true;
+			}
 		}
+		return false;
 	}
+	
+private:
+	string str;
+	bool cs;
+	bool mw;
+};
 
-	if (pit != pend) {
-		text->setCursor(pit, pos);
-		return SR_FOUND;
-	}
-	return SR_NOT_FOUND;
-}
 
 
-// backward search:
-// if the string can be found: return true and set the cursor to
-// the new position, cs = casesensitive, mw = matchword
-SearchResult searchBackward(BufferView * bv, LyXText * text,
-			    string const & str,
-			    bool const & cs, bool const & mw)
+} //namespace anon
+
+
+
+
+
+namespace {
+
+
+void put_selection_at(BufferView * bv, PosIterator & cur,
+		      int length, bool backwards)
 {
-	ParagraphList::iterator pit = text->cursorPar();
-	ParagraphList::iterator pbegin = text->ownerParagraphs().begin();
-	pos_type pos = text->cursor.pos();
-
-	// skip past a match at the current cursor pos
-	if (pos > 0) {
-		--pos;
-	} else if (pit != pbegin) {
-		--pit;
-		pos = pit->size();
-	} else {
-		return SR_NOT_FOUND;
+	ParIterator par = bv->buffer()->par_iterator_begin();
+	for (; par.pit() != cur.pit(); ++par)
+		;
+	
+	{
+		LyXText * text = bv->getLyXText();
+		text->clearSelection();
 	}
+	
+	UpdatableInset * outer = dynamic_cast<UpdatableInset *>(par.inset());
 
-	while (true) {
-		if (pos < pit->size()) {
-			if (pit->isInset(pos) && pit->getInset(pos)->isTextInset()) {
-				UpdatableInset * inset = (UpdatableInset *)pit->getInset(pos);
-				if (inset->searchBackward(bv, str, cs, mw))
-					return SR_FOUND_NOUPDATE;
-			}
+	par.lockPath(bv);
 
-			if (isStringInText(*pit, pos, str, cs, mw)) {
-				text->setCursor(pit, pos);
-				return SR_FOUND;
-			}
-		}
+	LyXText * text = par.text() ? par.text() : bv->text;
 
-		if (pos == 0 && pit == pbegin)
-			break;
+	InsetText * inner = text->inset_owner;
 
-		if (pos > 0) {
-			--pos;
-		} else if (pit != pbegin) {
-			--pit;
-			pos = pit->size();
-		}
+	if (inner != outer) {
+		outer->insetUnlock(bv);
+		outer->lockInsetInInset(bv, inner);
 	}
+	
 
-	return SR_NOT_FOUND;
+	text->setCursor(cur.pit(), cur.pos());
+	if (length) {
+		text->setSelectionRange(length);
+		text->setSelection();
+		if (backwards)
+			text->cursor = text->selection.start;
+	}
+	
+	
+	bv->fitCursor();
+	bv->update();
+		
 }
 
-} // anon namespace
 
+bool findForward(PosIterator & cur, PosIterator & end, MatchString & match)
+{
+	for (; cur != end && !match(*cur.pit(), cur.pos()); ++cur)
+		;
 
+	return cur != end;
+}
 
-int replace(BufferView * bv,
-	       string const & searchstr, string const & replacestr,
-	       bool forward, bool casesens, bool matchwrd, bool replaceall,
-	       bool once)
+
+bool findBackwards(PosIterator & cur, PosIterator & beg, MatchString & match)
 {
-	if (!bv->available() || bv->buffer()->isReadonly())
-		return 0;
+	if (beg == cur)
+		return false;
+	do {
+		--cur;
+		if (match(*cur.pit(), cur.pos()))
+			break;
+	} while (cur != beg);
 
-	// CutSelection cannot cut a single space, so we have to stop
-	// in order to avoid endless loop :-(
-	if (searchstr.length() == 0
-		|| (searchstr.length() == 1 && searchstr[0] == ' ')) {
-#ifdef WITH_WARNINGS
-#warning BLECH. If we have an LFUN for replace, we can sort of fix this bogosity
-#endif
-		Alert::error(_("Cannot replace"),
-			_("You cannot replace a single space or "
-			  "an empty character."));
-		return 0;
-	}
+	return match(*cur.pit(), cur.pos());
+}
 
-	// now we can start searching for the first
-	// start at top if replaceall
-	LyXText * text = bv->getLyXText();
-	bool fw = forward;
-	if (replaceall) {
-		text->clearSelection();
-		bv->unlockInset(bv->theLockingInset());
-		text = bv->text;
-		text->cursorTop();
-		// override search direction because we search top to bottom
-		fw = true;
-	}
 
-	// if nothing selected or selection does not equal search string
-	// search and select next occurance and return if no replaceall
-	string str1;
-	string str2;
-	if (casesens) {
-		str1 = searchstr;
-		str2 = text->selectionAsString(*bv->buffer(), false);
-	} else {
-		str1 = lowercase(searchstr);
-		str2 = lowercase(text->selectionAsString(*bv->buffer(), false));
-	}
-	if (str1 != str2) {
-		if (!find(bv, searchstr, fw, casesens, matchwrd) ||
-			!replaceall) {
-			return 0;
-		}
+bool findChange(PosIterator & cur, PosIterator & end)
+{
+	for (; cur != end; ++cur) {
+		if ((!cur.pit()->size() || !cur.at_end())
+		    && cur.pit()->lookupChange(cur.pos()) != Change::UNCHANGED)
+			break;
 	}
+	
+	return cur != end;
+}
 
-	bool found = false;
-	int replace_count = 0;
-	do {
-		text = bv->getLyXText();
-		// We have to do this check only because mathed insets don't
-		// return their own LyXText but the LyXText of it's parent!
-		if (!bv->theLockingInset() ||
-			((text != bv->text) &&
-			 (text->inset_owner == text->inset_owner->getLockingInset()))) {
-			text->replaceSelectionWithString(replacestr);
-			text->setSelectionRange(replacestr.length());
-			++replace_count;
-		}
-		if (!once)
-			found = find(bv, searchstr, fw, casesens, matchwrd);
-	} while (!once && replaceall && found);
 
-	// FIXME: should be called via an LFUN
-	bv->buffer()->markDirty();
-	bv->update();
 
-	return replace_count;
-}
+} // namespace anon
 
 
-bool find(BufferView * bv,
-	     string const & searchstr, bool forward,
-	     bool casesens, bool matchwrd)
+bool find(BufferView * bv, string const & searchstr,
+	  bool cs, bool mw, bool fw)
 {
 	if (!bv->available() || searchstr.empty())
 		return false;
 
-	if (bv->theLockingInset()) {
-		bool found = forward ?
-			bv->theLockingInset()->searchForward(bv, searchstr, casesens, matchwrd) :
-			bv->theLockingInset()->searchBackward(bv, searchstr, casesens, matchwrd);
-		// We found the stuff inside the inset so we don't have to
-		// do anything as the inset did all the update for us!
-		if (found)
-			return true;
-		// We now are in the main text but if we did a forward
-		// search we have to put the cursor behind the inset.
-		if (forward) {
-			bv->text->cursorRight(true);
-		}
-	}
-	// If we arrive here we are in the main text again so we
-	// just start searching from the root LyXText at the position
-	// we are!
-	LyXText * text = bv->text;
-
-
-	if (text->selection.set())
-		text->cursor = forward ?
-			text->selection.end : text->selection.start;
-
-	text->clearSelection();
-
-	SearchResult result = forward ?
-		searchForward(bv, text, searchstr, casesens, matchwrd) :
-		searchBackward(bv, text, searchstr, casesens, matchwrd);
-
-	bool found = true;
-	// If we found the cursor inside an inset we will get back
-	// SR_FOUND_NOUPDATE and we don't have to do anything as the
-	// inset did it already.
-	if (result == SR_FOUND) {
-		bv->unlockInset(bv->theLockingInset());
-		text->setSelectionRange(searchstr.length());
-	} else if (result == SR_NOT_FOUND) {
-		bv->unlockInset(bv->theLockingInset());
-		found = false;
+	PosIterator cur = PosIterator(*bv);
+
+	MatchString match(searchstr, cs, mw);
+	
+	bool found;
+
+	if (fw) {
+		PosIterator end = bv->buffer()->pos_iterator_end();
+		found = findForward(cur, end, match);
+	} else {
+		PosIterator beg = bv->buffer()->pos_iterator_begin();
+		found = findBackwards(cur, beg, match);
 	}
-	bv->update();
+	
+	if (found)
+		put_selection_at(bv, cur, searchstr.length(), !fw);
 
 	return found;
 }
 
 
-SearchResult find(BufferView * bv, LyXText * text,
-		     string const & searchstr, bool forward,
-		     bool casesens, bool matchwrd)
+int replaceAll(BufferView * bv,
+	       string const & searchstr, string const & replacestr,
+	       bool cs, bool mw)
 {
-	if (text->selection.set())
-		text->cursor = forward ?
-			text->selection.end : text->selection.start;
-
-	text->clearSelection();
-
-	SearchResult result = forward ?
-		searchForward(bv, text, searchstr, casesens, matchwrd) :
-		searchBackward(bv, text, searchstr, casesens, matchwrd);
+	if (!bv->available() || bv->buffer()->isReadonly())
+		return 0;
 
-	return result;
+	if (searchstr.empty()) {
+		Alert::error(_("Search error"), _("Search string is empty"));
+		return 0;
+	}
+	
+	PosIterator cur = bv->buffer()->pos_iterator_begin();
+	PosIterator end = bv->buffer()->pos_iterator_end();
+	// override search direction because we search top to bottom
+	MatchString match(searchstr, cs, mw);
+	int num = 0;
+
+	int const rsize = replacestr.size();
+	int const ssize = searchstr.size();
+	while (findForward(cur, end, match)) {
+		pos_type pos = cur.pos();
+		int striked = ssize - cur.pit()->erase(pos, pos + ssize);
+		cur.pit()->insert(pos, replacestr);
+		for (int i = 0; i < rsize + striked; ++i)
+			// what do I need for std::advance?
+			++cur;
+		++num;
+	}
+	PosIterator beg = bv->buffer()->pos_iterator_begin();
+	bv->text->init(bv);
+	put_selection_at(bv, beg, 0, false);
+	return num;
 }
 
 
-
-
-SearchResult nextChange(BufferView * bv, LyXText * text, pos_type & length)
+int replace(BufferView * bv,
+	    string const & searchstr, string const & replacestr,
+	    bool cs, bool mw, bool fw)
 {
-	ParagraphList::iterator pit = text->cursorPar();
-	ParagraphList::iterator pend = text->ownerParagraphs().end();
-	pos_type pos = text->cursor.pos();
-
-	while (pit != pend) {
-		pos_type parsize = pit->size();
-
-		if (pos < parsize) {
-			if ((!parsize || pos != parsize)
-				&& pit->lookupChange(pos) != Change::UNCHANGED)
-				break;
+	if (!bv->available() || bv->buffer()->isReadonly())
+		return 0;
 
-			if (pit->isInset(pos) && pit->getInset(pos)->isTextInset()) {
-				UpdatableInset * inset = (UpdatableInset *)pit->getInset(pos);
-				if (inset->nextChange(bv, length))
-					return SR_FOUND_NOUPDATE;
-			}
+	if (searchstr.empty()) {
+		Alert::error(_("Search error"), _("Search string is empty"));
+		return 0;
+	}
+	
+	{
+		LyXText * text = bv->getLyXText();
+		// if nothing selected or selection does not equal
+		// search string search and select next occurance
+		// and return
+		string const str1 = searchstr;
+		string const str2 = text->selectionAsString(*bv->buffer(),
+							    false);
+		if ((cs && str1 != str2)
+		    || lowercase(str1) != lowercase(str2)) {
+			find(bv, searchstr, cs, mw, fw);
+			return 0;
 		}
+	}
+	
 
-		++pos;
-
-		if (pos >= parsize) {
-			++pit;
-			pos = 0;
-		}
+	LyXText * text = bv->getLyXText();
+	// We have to do this check only because mathed insets don't
+	// return their own LyXText but the LyXText of it's parent!
+	if (!bv->theLockingInset() ||
+	    ((text != bv->text) &&
+	     (text->inset_owner == text->inset_owner->getLockingInset()))) {
+		text->replaceSelectionWithString(replacestr);
+		text->setSelectionRange(replacestr.length());
+		text->cursor = fw ? text->selection.end
+			: text->selection.start;
 	}
 
-	if (pit == pend)
-		return SR_NOT_FOUND;
+	// FIXME: should be called via an LFUN
+	bv->buffer()->markDirty();
+
+	find(bv, searchstr, cs, mw, fw);
+	bv->update();
+	
+	return 1;
+}
+
+
+bool findNextChange(BufferView * bv)
+{
+	if (!bv->available())
+		return false;
+
+	PosIterator cur = PosIterator(*bv);
+	PosIterator endit = bv->buffer()->pos_iterator_end();
 
-	text->setCursor(pit, pos);
+	if (!findChange(cur, endit))
+		return false;
+	
+	
+	ParagraphList::iterator pit = cur.pit();
+	pos_type pos = cur.pos();
+	
 	Change orig_change = pit->lookupChangeFull(pos);
 	pos_type parsize = pit->size();
 	pos_type end = pos;
@@ -349,69 +312,9 @@ SearchResult nextChange(BufferView * bv,
 				break;
 		}
 	}
-	length = end - pos;
-	return SR_FOUND;
-}
-
-
-SearchResult findNextChange(BufferView * bv, LyXText * text, pos_type & length)
-{
-	if (text->selection.set())
-		text->cursor = text->selection.end;
-
-	text->clearSelection();
-
-	return nextChange(bv, text, length);
-}
-
-
-bool findNextChange(BufferView * bv)
-{
-	if (!bv->available())
-		return false;
-
-	pos_type length;
-
-	if (bv->theLockingInset()) {
-		bool found = bv->theLockingInset()->nextChange(bv, length);
-
-		// We found the stuff inside the inset so we don't have to
-		// do anything as the inset did all the update for us!
-		if (found)
-			return true;
-
-		// We now are in the main text but if we did a forward
-		// search we have to put the cursor behind the inset.
-		bv->text->cursorRight(true);
-	}
-	// If we arrive here we are in the main text again so we
-	// just start searching from the root LyXText at the position
-	// we are!
-	LyXText * text = bv->text;
-
-	if (text->selection.set())
-		text->cursor = text->selection.end;
-
-	text->clearSelection();
-
-	SearchResult result = nextChange(bv, text, length);
-
-	bool found = true;
-
-	// If we found the cursor inside an inset we will get back
-	// SR_FOUND_NOUPDATE and we don't have to do anything as the
-	// inset did it already.
-	if (result == SR_FOUND) {
-		bv->unlockInset(bv->theLockingInset());
-		text->setSelectionRange(length);
-	} else if (result == SR_NOT_FOUND) {
-		bv->unlockInset(bv->theLockingInset());
-		found = false;
-	}
-
-	bv->update();
-
-	return found;
+	pos_type length = end - pos;
+	put_selection_at(bv, cur, length, true);
+	return true;
 }
 
 } // find namespace
Index: lyxfind.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxfind.h,v
retrieving revision 1.16
diff -u -p -u -r1.16 lyxfind.h
--- lyxfind.h	7 Oct 2003 06:45:24 -0000	1.16
+++ lyxfind.h	1 Nov 2003 12:11:12 -0000
@@ -24,29 +24,21 @@ class LyXText;
 namespace lyx {
 namespace find {
 
-enum SearchResult {
-	//
-	SR_NOT_FOUND = 0,
-	//
-	SR_FOUND,
-	//
-	SR_FOUND_NOUPDATE
-};
-
-
 int replace(BufferView * bv,
-	       std::string const &, std::string const &,
-	       bool, bool = true, bool = false,
-	       bool = false, bool = false);
+	    std::string const & /*search*/, std::string const & /*repl*/,
+	    bool /*cs*/, bool /*mw*/, bool /*fw*/);
+
+int replaceAll(BufferView * bv,
+	       std::string const & /*search*/, std::string const & /*repl*/,
+	       bool /*cs*/, bool /*mw*/);
 
 /**
  * This function is called as a general interface to find some
  * text from the actual cursor position in whatever direction
  * we want to go. This does also update the screen.
  */
-bool find(BufferView *,
-	     std::string const & searchstr, bool forward,
-	     bool casesens = true, bool matchwrd = false);
+bool find(BufferView *, std::string const & /*search*/, 
+	  bool /*cs*/, bool /*mw*/, bool /*fw*/);
 
 /**
  * This function does search from the cursor position inside the
@@ -56,16 +48,8 @@ bool find(BufferView *,
  * returning to the calling function.
  */
 
-SearchResult find(BufferView *, LyXText * text,
-		     std::string const & searchstr, bool forward,
-		     bool casesens = true, bool matchwrd = false);
-
 /// find the next change in the buffer
 bool findNextChange(BufferView * bv);
-
-SearchResult findNextChange(BufferView * bv, LyXText * text, lyx::pos_type & length);
-
-SearchResult nextChange(BufferView * bv, LyXText * text, lyx::pos_type & length);
 
 } // namespace find
 } // namespace lyx
Index: lyxfunc.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxfunc.C,v
retrieving revision 1.529
diff -u -p -u -r1.529 lyxfunc.C
--- lyxfunc.C	29 Oct 2003 19:19:22 -0000	1.529
+++ lyxfunc.C	1 Nov 2003 12:11:15 -0000
@@ -1078,7 +1078,8 @@ void LyXFunc::dispatch(FuncRequest const
 		}
 		bool fw = (action == LFUN_WORDFINDFORWARD);
 		if (!searched_string.empty())
-			lyx::find::find(view(), searched_string, fw);
+			lyx::find::find(view(), searched_string,
+					true, false, fw);
 		break;
 	}
 
Index: paragraph.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph.C,v
retrieving revision 1.340
diff -u -p -u -r1.340 paragraph.C
--- paragraph.C	31 Oct 2003 18:45:34 -0000	1.340
+++ paragraph.C	1 Nov 2003 12:11:17 -0000
@@ -257,6 +257,14 @@ int Paragraph::erase(pos_type start, pos
 }
 
 
+void Paragraph::insert(pos_type start, string const & str)
+{
+	int size = str.size();
+	for (int i = 0 ; i < size ; ++i)
+		insertChar(start + i, str[i]);
+}
+
+
 bool Paragraph::checkInsertChar(LyXFont & font)
 {
 	if (pimpl_->inset_owner)
Index: paragraph.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph.h,v
retrieving revision 1.117
diff -u -p -u -r1.117 paragraph.h
--- paragraph.h	31 Oct 2003 18:45:35 -0000	1.117
+++ paragraph.h	1 Nov 2003 12:11:18 -0000
@@ -271,6 +271,8 @@ public:
 					lyx::pos_type endpos,
 					LyXFont_size def_size) const;
 	///
+	void insert(lyx::pos_type pos, std::string const & str);
+	///
 	void insertChar(lyx::pos_type pos, value_type c);
 	///
 	void insertChar(lyx::pos_type pos, value_type c, LyXFont const &, Change change = Change(Change::INSERTED));
Index: text.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text.C,v
retrieving revision 1.491
diff -u -p -u -r1.491 text.C
--- text.C	29 Oct 2003 12:18:07 -0000	1.491
+++ text.C	1 Nov 2003 12:11:20 -0000
@@ -1592,7 +1592,7 @@ void LyXText::backspace()
 
 ParagraphList::iterator LyXText::cursorPar() const
 {
-	if (cursor.par() != cache_pos_) {
+	if (cursor.par() != cache_pos_ || cache_pos_ == -1) {
 		cache_pos_ = cursor.par();
 		cache_par_ = getPar(cache_pos_);
 	}
Index: frontends/controllers/ControlSearch.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ControlSearch.C,v
retrieving revision 1.27
diff -u -p -u -r1.27 ControlSearch.C
--- frontends/controllers/ControlSearch.C	6 Oct 2003 15:42:46 -0000	1.27
+++ frontends/controllers/ControlSearch.C	1 Nov 2003 12:11:20 -0000
@@ -32,8 +32,8 @@ void ControlSearch::find(string const & 
 			 bool casesensitive, bool matchword, bool forward)
 {
 	bool const found = lyx::find::find(bufferview(), search,
-					    forward, casesensitive,
-					    matchword);
+					   casesensitive, matchword,
+					   forward);
 
 	if (!found)
 		lv_.message(_("String not found!"));
@@ -41,16 +41,17 @@ void ControlSearch::find(string const & 
 
 
 void ControlSearch::replace(string const & search, string const & replace,
-			    bool casesensitive, bool matchword, bool all)
+			    bool casesensitive, bool matchword,
+			    bool forward, bool all)
 {
 	// If not replacing all instances of the word, then do not
 	// move on to the next instance once the present instance has been
 	// changed
-	bool const once = !all;
-	int const replace_count =
-		lyx::find::replace(bufferview(),
-				    search, replace, true, casesensitive,
-				    matchword, all, once);
+	int const replace_count = all ?
+		lyx::find::replaceAll(bufferview(), search, replace,
+				      casesensitive, matchword)
+		: lyx::find::replace(bufferview(), search, replace,
+				     casesensitive, matchword, forward);
 
 	if (replace_count == 0) {
 		lv_.message(_("String not found!"));
Index: frontends/controllers/ControlSearch.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ControlSearch.h,v
retrieving revision 1.15
diff -u -p -u -r1.15 ControlSearch.h
--- frontends/controllers/ControlSearch.h	6 Oct 2003 15:42:46 -0000	1.15
+++ frontends/controllers/ControlSearch.h	1 Nov 2003 12:11:21 -0000
@@ -28,7 +28,8 @@ public:
 
 	/// Replaces occurence of string
 	void replace(std::string const & search, std::string const & replace,
-		     bool casesensitive, bool matchword, bool all);
+		     bool casesensitive, bool matchword,
+		     bool forward, bool all);
 private:
 	/// not needed.
 	virtual void apply() {}
Index: frontends/controllers/ControlThesaurus.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ControlThesaurus.C,v
retrieving revision 1.18
diff -u -p -u -r1.18 ControlThesaurus.C
--- frontends/controllers/ControlThesaurus.C	6 Oct 2003 15:42:47 -0000	1.18
+++ frontends/controllers/ControlThesaurus.C	1 Nov 2003 12:11:21 -0000
@@ -48,7 +48,7 @@ void ControlThesaurus::replace(string co
 	 */
 	int const replace_count =
 		lyx::find::replace(kernel().bufferview(), oldstr_, newstr,
-				    true, true, true, false, true);
+				   true /*cs*/, true /*mw*/, true /*fw*/);
 
 	oldstr_ = newstr;
 
Index: frontends/qt2/QSearch.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/QSearch.C,v
retrieving revision 1.19
diff -u -p -u -r1.19 QSearch.C
--- frontends/qt2/QSearch.C	6 Oct 2003 15:42:51 -0000	1.19
+++ frontends/qt2/QSearch.C	1 Nov 2003 12:11:22 -0000
@@ -54,7 +54,8 @@ void QSearch::find(string const & str, b
 
 
 void QSearch::replace(string const & findstr, string const & replacestr,
-	bool casesens, bool words, bool all)
+	bool casesens, bool words, bool backwards, bool all)
 {
-	controller().replace(findstr, replacestr, casesens, words, all);
+	controller().replace(findstr, replacestr, casesens, words,
+			     !backwards, all);
 }
Index: frontends/qt2/QSearch.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/QSearch.h,v
retrieving revision 1.10
diff -u -p -u -r1.10 QSearch.h
--- frontends/qt2/QSearch.h	6 Oct 2003 15:42:51 -0000	1.10
+++ frontends/qt2/QSearch.h	1 Nov 2003 12:11:22 -0000
@@ -39,8 +39,9 @@ private:
 	void find(std::string const & str, bool casesens,
 		  bool words, bool backwards);
 
-	void replace(std::string const & findstr, std::string const & replacestr,
-		bool casesens, bool words, bool all);
+	void replace(std::string const & findstr,
+		     std::string const & replacestr,
+		     bool casesens, bool words, bool backwards, bool all);
 };
 
 #endif // QSEARCH_H
Index: frontends/qt2/QSearchDialog.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/QSearchDialog.C,v
retrieving revision 1.14
diff -u -p -u -r1.14 QSearchDialog.C
--- frontends/qt2/QSearchDialog.C	6 Oct 2003 15:42:51 -0000	1.14
+++ frontends/qt2/QSearchDialog.C	1 Nov 2003 12:11:22 -0000
@@ -94,7 +94,7 @@ void QSearchDialog::replaceClicked()
 	form_->replace(find, replace,
 		caseCB->isChecked(),
 		wordsCB->isChecked(),
-		false);
+		backwardsCB->isChecked(), false);
 	uniqueInsert(findCO, findCO->currentText());
 	uniqueInsert(replaceCO, replaceCO->currentText());
 }
@@ -106,7 +106,7 @@ void QSearchDialog::replaceallClicked()
 		fromqstr(replaceCO->currentText()),
 		caseCB->isChecked(),
 		wordsCB->isChecked(),
-		true);
+		false, true);
 	uniqueInsert(findCO, findCO->currentText());
 	uniqueInsert(replaceCO, replaceCO->currentText());
 }
Index: frontends/xforms/FormSearch.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/xforms/FormSearch.C,v
retrieving revision 1.27
diff -u -p -u -r1.27 FormSearch.C
--- frontends/xforms/FormSearch.C	6 Oct 2003 15:42:57 -0000	1.27
+++ frontends/xforms/FormSearch.C	1 Nov 2003 12:11:23 -0000
@@ -85,6 +85,7 @@ ButtonPolicy::SMInput FormSearch::input(
 				     getString(dialog_->input_replace),
 				     fl_get_button(dialog_->check_casesensitive),
 				     fl_get_button(dialog_->check_matchword),
+				     !fl_get_button(dialog_->check_searchbackwards),				     
 				     all);
 	}
 
Index: insets/insetcollapsable.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insetcollapsable.C,v
retrieving revision 1.189
diff -u -p -u -r1.189 insetcollapsable.C
--- insets/insetcollapsable.C	1 Nov 2003 09:56:18 -0000	1.189
+++ insets/insetcollapsable.C	1 Nov 2003 12:11:24 -0000
@@ -536,42 +536,6 @@ void InsetCollapsable::markErased()
 }
 
 
-bool InsetCollapsable::nextChange(BufferView * bv, lyx::pos_type & length)
-{
-	bool found = inset.nextChange(bv, length);
-
-	if (first_after_edit && !found)
-		close(bv);
-	else if (!found)
-		first_after_edit = false;
-	return found;
-}
-
-
-bool InsetCollapsable::searchForward(BufferView * bv, string const & str,
-				     bool cs, bool mw)
-{
-	bool found = inset.searchForward(bv, str, cs, mw);
-	if (first_after_edit && !found)
-		close(bv);
-	else if (!found)
-		first_after_edit = false;
-	return found;
-}
-
-
-bool InsetCollapsable::searchBackward(BufferView * bv, string const & str,
-				      bool cs, bool mw)
-{
-	bool found = inset.searchBackward(bv, str, cs, mw);
-	if (first_after_edit && !found)
-		close(bv);
-	else if (!found)
-		first_after_edit = false;
-	return found;
-}
-
-
 WordLangTuple const
 InsetCollapsable::selectNextWordToSpellcheck(BufferView * bv, float & value) const
 {
Index: insets/insetcollapsable.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insetcollapsable.h,v
retrieving revision 1.137
diff -u -p -u -r1.137 insetcollapsable.h
--- insets/insetcollapsable.h	1 Nov 2003 09:56:18 -0000	1.137
+++ insets/insetcollapsable.h	1 Nov 2003 12:11:24 -0000
@@ -142,14 +142,6 @@ public:
 
 	void markErased();
 
-	bool nextChange(BufferView * bv, lyx::pos_type & length);
-
-	///
-	bool searchForward(BufferView * bv, std::string const & str,
-			   bool = true, bool = false);
-	bool searchBackward(BufferView * bv, std::string const & str,
-			    bool = true, bool = false);
-
 	///
 	void addPreview(lyx::graphics::PreviewLoader &) const;
 
Index: insets/insettabular.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettabular.C,v
retrieving revision 1.360
diff -u -p -u -r1.360 insettabular.C
--- insets/insettabular.C	1 Nov 2003 09:56:18 -0000	1.360
+++ insets/insettabular.C	1 Nov 2003 12:11:28 -0000
@@ -432,6 +432,9 @@ bool InsetTabular::lockInsetInInset(Buff
 
 	oldcell = -1;
 
+	lyxerr[Debug::INSETTEXT] << "HERE1" << std::endl;
+	
+	
 	if (inset == &tabular.getCellInset(actcell)) {
 		lyxerr[Debug::INSETTEXT] << "OK" << endl;
 		the_locking_inset = &tabular.getCellInset(actcell);
@@ -439,27 +442,37 @@ bool InsetTabular::lockInsetInInset(Buff
 		return true;
 	}
 
+	lyxerr[Debug::INSETTEXT] << "HERE2" << std::endl;
+	
 	if (!the_locking_inset) {
 		int const n = tabular.getNumberOfCells();
 		int const id = inset->id();
 		for (int i = 0; i < n; ++i) {
 			InsetText * in = &tabular.getCellInset(i);
 			if (inset == in) {
+				lyxerr[Debug::INSETTEXT] <<
+					"found!" << std::endl;
 				actcell = i;
 				the_locking_inset = in;
 				locked = true;
 				resetPos(bv);
 				return true;
 			}
+			/*
 			if (in->getInsetFromID(id)) {
 				actcell = i;
 				in->dispatch(FuncRequest(bv, LFUN_INSET_EDIT));
 				return the_locking_inset->lockInsetInInset(bv, inset);
 			}
+			*/
 		}
 		return false;
 	}
 
+	lyxerr[Debug::INSETTEXT] << "HERE3" << std::endl;
+	
+
+	
 	if (the_locking_inset && (the_locking_inset == inset)) {
 		lyxerr[Debug::INSETTEXT] << "OK" << endl;
 		resetPos(bv);
@@ -2487,88 +2500,6 @@ void InsetTabular::markErased()
 {
 	for (int cell = 0; cell < tabular.getNumberOfCells(); ++cell)
 		tabular.getCellInset(cell).markErased();
-}
-
-
-bool InsetTabular::nextChange(BufferView * bv, lyx::pos_type & length)
-{
-	if (the_locking_inset) {
-		if (the_locking_inset->nextChange(bv, length)) {
-			updateLocal(bv);
-			return true;
-		}
-		if (tabular.isLastCell(actcell))
-			return false;
-		++actcell;
-	}
-	InsetText & inset = tabular.getCellInset(actcell);
-	if (inset.nextChange(bv, length)) {
-		updateLocal(bv);
-		return true;
-	}
-	while (!tabular.isLastCell(actcell)) {
-		++actcell;
-		InsetText & inset = tabular.getCellInset(actcell);
-		if (inset.nextChange(bv, length)) {
-			updateLocal(bv);
-			return true;
-		}
-	}
-	return false;
-}
-
-
-bool InsetTabular::searchForward(BufferView * bv, string const & str,
-				 bool cs, bool mw)
-{
-	int cell = 0;
-	if (the_locking_inset) {
-		if (the_locking_inset->searchForward(bv, str, cs, mw)) {
-			updateLocal(bv);
-			return true;
-		}
-		if (tabular.isLastCell(actcell))
-			return false;
-		cell = actcell + 1;
-	}
-	InsetText & inset = tabular.getCellInset(cell);
-	if (inset.searchForward(bv, str, cs, mw)) {
-		updateLocal(bv);
-		return true;
-	}
-	while (!tabular.isLastCell(cell)) {
-		++cell;
-		InsetText & inset = tabular.getCellInset(cell);
-		if (inset.searchForward(bv, str, cs, mw)) {
-			updateLocal(bv);
-			return true;
-		}
-	}
-	return false;
-}
-
-
-bool InsetTabular::searchBackward(BufferView * bv, string const & str,
-			       bool cs, bool mw)
-{
-	int cell = tabular.getNumberOfCells();
-	if (the_locking_inset) {
-		if (the_locking_inset->searchBackward(bv, str, cs, mw)) {
-			updateLocal(bv);
-			return true;
-		}
-		cell = actcell;
-	}
-
-	while (cell) {
-		--cell;
-		InsetText & inset = tabular.getCellInset(cell);
-		if (inset.searchBackward(bv, str, cs, mw)) {
-			updateLocal(bv);
-			return true;
-		}
-	}
-	return false;
 }
 
 
Index: insets/insettabular.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettabular.h,v
retrieving revision 1.157
diff -u -p -u -r1.157 insettabular.h
--- insets/insettabular.h	1 Nov 2003 09:56:18 -0000	1.157
+++ insets/insettabular.h	1 Nov 2003 12:11:28 -0000
@@ -177,14 +177,6 @@ public:
 
 	void markErased();
 
-	/// find next change
-	bool nextChange(BufferView *, lyx::pos_type & length);
-	///
-	bool searchForward(BufferView *, std::string const &,
-			   bool = true, bool = false);
-	bool searchBackward(BufferView *, std::string const &,
-			    bool = true, bool = false);
-
 	// this should return true if we have a "normal" cell, otherwise true.
 	// "normal" means without width set!
 	bool forceDefaultParagraphs(InsetOld const * in) const;
Index: insets/insettext.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettext.C,v
retrieving revision 1.520
diff -u -p -u -r1.520 insettext.C
--- insets/insettext.C	31 Oct 2003 18:45:41 -0000	1.520
+++ insets/insettext.C	1 Nov 2003 12:11:30 -0000
@@ -369,6 +369,7 @@ void InsetText::lockInset(BufferView * b
 		font.setLanguage(bv->getParentLanguage(this));
 		setFont(bv, font, false);
 	}
+	lyxerr << "HERE" << std::endl;
 }
 
 
@@ -1490,81 +1491,6 @@ void InsetText::selectSelectedWord(Buffe
 	getLyXText(bv)->selectSelectedWord();
 	updateLocal(bv, false);
 }
-
-
-bool InsetText::nextChange(BufferView * bv, lyx::pos_type & length)
-{
-	if (the_locking_inset) {
-		if (the_locking_inset->nextChange(bv, length))
-			return true;
-		text_.cursorRight(true);
-	}
-	lyx::find::SearchResult result =
-		lyx::find::findNextChange(bv, &text_, length);
-
-	if (result == lyx::find::SR_FOUND) {
-		LyXCursor cur = text_.cursor;
-		bv->unlockInset(bv->theLockingInset());
-		if (bv->lockInset(this))
-			locked = true;
-		text_.cursor = cur;
-		text_.setSelectionRange(length);
-		updateLocal(bv, false);
-	}
-	return result != lyx::find::SR_NOT_FOUND;
-}
-
-
-bool InsetText::searchForward(BufferView * bv, string const & str,
-			      bool cs, bool mw)
-{
-	if (the_locking_inset) {
-		if (the_locking_inset->searchForward(bv, str, cs, mw))
-			return true;
-		text_.cursorRight(true);
-	}
-	lyx::find::SearchResult result =
-		lyx::find::find(bv, &text_, str, true, cs, mw);
-
-	if (result == lyx::find::SR_FOUND) {
-		LyXCursor cur = text_.cursor;
-		bv->unlockInset(bv->theLockingInset());
-		if (bv->lockInset(this))
-			locked = true;
-		text_.cursor = cur;
-		text_.setSelectionRange(str.length());
-		updateLocal(bv, false);
-	}
-	return result != lyx::find::SR_NOT_FOUND;
-}
-
-
-bool InsetText::searchBackward(BufferView * bv, string const & str,
-			       bool cs, bool mw)
-{
-	if (the_locking_inset) {
-		if (the_locking_inset->searchBackward(bv, str, cs, mw))
-			return true;
-	}
-	if (!locked) {
-		text_.setCursor(paragraphs.size() - 1, paragraphs.back().size());
-	}
-	lyx::find::SearchResult result =
-		lyx::find::find(bv, &text_, str, false, cs, mw);
-
-	if (result == lyx::find::SR_FOUND) {
-		LyXCursor cur = text_.cursor;
-		bv->unlockInset(bv->theLockingInset());
-		if (bv->lockInset(this))
-			locked = true;
-		text_.cursor = cur;
-		text_.setSelectionRange(str.length());
-		updateLocal(bv, false);
-	}
-	return result != lyx::find::SR_NOT_FOUND;
-}
-
-
 bool InsetText::checkInsertChar(LyXFont & font)
 {
 	return owner() ? owner()->checkInsertChar(font) : true;
Index: insets/insettext.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettext.h,v
retrieving revision 1.219
diff -u -p -u -r1.219 insettext.h
--- insets/insettext.h	1 Nov 2003 09:56:18 -0000	1.219
+++ insets/insettext.h	1 Nov 2003 12:11:30 -0000
@@ -177,15 +177,7 @@ public:
 	 * for the (empty) paragraph contained.
 	 */
 	void markNew(bool track_changes = false);
-	/// find next change
-	bool nextChange(BufferView *, lyx::pos_type & length);
 
-	///
-	bool searchForward(BufferView *, std::string const &,
-			   bool = true, bool = false);
-	///
-	bool searchBackward(BufferView *, std::string const &,
-			    bool = true, bool = false);
 	///
 	bool checkInsertChar(LyXFont &);
 	///
Index: insets/updatableinset.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/updatableinset.C,v
retrieving revision 1.30
diff -u -p -u -r1.30 updatableinset.C
--- insets/updatableinset.C	29 Oct 2003 19:19:26 -0000	1.30
+++ insets/updatableinset.C	1 Nov 2003 12:11:31 -0000
@@ -157,19 +157,3 @@ bool UpdatableInset::nextChange(BufferVi
 }
 
 
-bool UpdatableInset::searchForward(BufferView * bv, string const &,
-				   bool, bool)
-{
-	// we have to unlock ourself in this function by default!
-	bv->unlockInset(const_cast<UpdatableInset *>(this));
-	return false;
-}
-
-
-bool UpdatableInset::searchBackward(BufferView * bv, string const &,
-				    bool, bool)
-{
-	// we have to unlock ourself in this function by default!
-	bv->unlockInset(const_cast<UpdatableInset *>(this));
-	return false;
-}
Index: insets/updatableinset.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/updatableinset.h,v
retrieving revision 1.20
diff -u -p -u -r1.20 updatableinset.h
--- insets/updatableinset.h	29 Oct 2003 10:47:19 -0000	1.20
+++ insets/updatableinset.h	1 Nov 2003 12:11:31 -0000
@@ -101,15 +101,6 @@ public:
 	/// find the next change in the inset
 	virtual bool nextChange(BufferView * bv, lyx::pos_type & length);
 
-	///
-	// needed for search/replace functionality
-	///
-	virtual bool searchForward(BufferView *, std::string const &,
-				   bool = true, bool = false);
-	///
-	virtual bool searchBackward(BufferView *, std::string const &,
-				    bool = true, bool = false);
-
 protected:
 	///  An updatable inset could handle lyx editing commands
 	virtual

Reply via email to