>>>>> "Georg" == Georg Baum <[EMAIL PROTECTED]> writes:

Georg> I could only find one: The error list is not shown if the file
Georg> is corrupt. This could probably be fixed by handing the temp
Georg> buffer to InsertLyXFile:

Is it really necessary to disconnect, or is it done when the buffer is
deleted? 

Here is my new update patch, where I removed the code in
buffer_funcs.*, since it was so short.

Is it OK?

JMarc

Index: src/BufferView_pimpl.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/BufferView_pimpl.C,v
retrieving revision 1.599
diff -u -p -r1.599 BufferView_pimpl.C
--- src/BufferView_pimpl.C	7 Nov 2005 15:06:41 -0000	1.599
+++ src/BufferView_pimpl.C	29 Nov 2005 11:20:49 -0000
@@ -25,6 +25,7 @@
 #include "bufferparams.h"
 #include "coordcache.h"
 #include "cursor.h"
+#include "CutAndPaste.h"
 #include "debug.h"
 #include "dispatchresult.h"
 #include "factory.h"
@@ -831,6 +832,7 @@ void BufferView::Pimpl::stuffClipboard(s
 
 void BufferView::Pimpl::MenuInsertLyXFile(string const & filenm)
 {
+	BOOST_ASSERT(cursor_.inTexted());
 	string filename = filenm;
 
 	if (filename.empty()) {
@@ -875,18 +877,19 @@ void BufferView::Pimpl::MenuInsertLyXFil
 	string const disp_fn = MakeDisplayPath(filename);
 	owner_->message(bformat(_("Inserting document %1$s..."), disp_fn));
 
-	cursor_.clearSelection();
-	bv_->getLyXText()->breakParagraph(cursor_);
-
-	BOOST_ASSERT(cursor_.inTexted());
+	string res;
+	Buffer buf("", false);
+	buf.error.connect(boost::bind(&BufferView::Pimpl::addError, this, _1));
+	if (::loadLyXFile(&buf, MakeAbsPath(filename))) {
+		lyx::cap::pasteParagraphList(cursor_, buf.paragraphs(), 
+					     buf.params().textclass);
+		res = _("Document %1$s inserted.");
+	} else
+		res = _("Could not insert document %1$s");
 
-	string const fname = MakeAbsPath(filename);
-	bool const res = buffer_->readFile(fname, cursor_.pit());
+	owner_->message(bformat(res, disp_fn));
+	bv_->showErrorList(_("Document insertion"));
 	resizeCurrentBuffer();
-
-	string s = res ? _("Document %1$s inserted.")
-	               : _("Could not insert document %1$s");
-	owner_->message(bformat(s, disp_fn));
 }
 
 
@@ -1022,6 +1025,9 @@ FuncStatus BufferView::Pimpl::getStatus(
 	case LFUN_FILE_INSERT:
 	case LFUN_FILE_INSERT_ASCII_PARA:
 	case LFUN_FILE_INSERT_ASCII:
+		// FIXME: Actually, these LFUNS should be moved to LyXText
+		flag.enabled(cursor_.inTexted());
+		break;
 	case LFUN_FONT_STATE:
 	case LFUN_INSERT_LABEL:
 	case LFUN_BOOKMARK_SAVE:
Index: src/ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/ChangeLog,v
retrieving revision 1.2330
diff -u -p -r1.2330 ChangeLog
--- src/ChangeLog	28 Nov 2005 18:58:15 -0000	1.2330
+++ src/ChangeLog	29 Nov 2005 11:20:50 -0000
@@ -1,3 +1,22 @@
+2005-11-29  Jean-Marc Lasgouttes  <[EMAIL PROTECTED]>
+
+	Fix bug 2096.
+	
+	* BufferView_pimpl.C (getStatus): it is only possible to insert a
+	file in a text inset.
+
+	* buffer.C (readDocument): remove pit argument and code releated
+	to it; set the inset owner correctly (unrelated, but useful).
+	(readFile): get rid of pit argument.
+
+	* CutAndPaste.C (pasteSelectionHelper): use a ParagraphList and a
+	textclass instead of a selection index.
+	(pasteParagraphList): new function.
+	(pasteSelection): make it a wrapper around pasteParagraphList.
+
+	* BufferView_pimpl.C (MenuInsertLyXFile): use
+	cap::pasteParagraphList to insert a file.
+
 2005-11-17  Michael Gerz  <[EMAIL PROTECTED]>
 
 	* exporter.C: fix typo in text message
@@ -12,7 +31,8 @@
 
 2005-11-25  Jürgen Spitzmüller  <[EMAIL PROTECTED]>
 
-	* paragraph.C (asString): use new inset->textString method (fix bug 2089)
+	* paragraph.C (asString): use new inset->textString method (fix
+	bug 2089) 
 
 2005-11-24  Jean-Marc Lasgouttes  <[EMAIL PROTECTED]>
 
Index: src/CutAndPaste.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/CutAndPaste.C,v
retrieving revision 1.159
diff -u -p -r1.159 CutAndPaste.C
--- src/CutAndPaste.C	25 Nov 2005 09:27:08 -0000	1.159
+++ src/CutAndPaste.C	29 Nov 2005 11:20:50 -0000
@@ -105,18 +105,19 @@ bool checkPastePossible(int index)
 
 
 pair<PitPosPair, pit_type>
-pasteSelectionHelper(Buffer const & buffer, ParagraphList & pars,
-	pit_type pit, int pos,
-	textclass_type tc, size_t cut_index, ErrorList & errorlist)
+pasteSelectionHelper(Buffer const & buffer, 
+		     ParagraphList & pars, pit_type pit, int pos,
+		     ParagraphList const & parlist, textclass_type textclass, 
+		     ErrorList & errorlist)
 {
-	if (!checkPastePossible(cut_index))
+	if (parlist.empty())
 		return make_pair(PitPosPair(pit, pos), pit);
 
 	BOOST_ASSERT (pos <= pars[pit].size());
 
 	// Make a copy of the CaP paragraphs.
-	ParagraphList insertion = theCuts[cut_index].first;
-	textclass_type const textclass = theCuts[cut_index].second;
+	ParagraphList insertion = parlist;
+	textclass_type const tc = buffer.params().textclass;
 
 	// Now remove all out of the pars which is NOT allowed in the
 	// new environment and set also another font if that is required.
@@ -608,13 +609,9 @@ std::string getSelection(Buffer const & 
 }
 
 
-void pasteSelection(LCursor & cur, size_t sel_index)
+void pasteParagraphList(LCursor & cur, ParagraphList const & parlist, 
+                        textclass_type textclass)
 {
-	// this does not make sense, if there is nothing to paste
-	lyxerr << "#### pasteSelection " << sel_index << endl;
-	if (!checkPastePossible(sel_index))
-		return;
-
 	if (cur.inTexted()) {
 		LyXText * text = cur.text();
 		BOOST_ASSERT(text);
@@ -623,26 +620,36 @@ void pasteSelection(LCursor & cur, size_
 
 		pit_type endpit;
 		PitPosPair ppp;
-
 		ErrorList el;
 
 		boost::tie(ppp, endpit) =
 			pasteSelectionHelper(cur.buffer(),
                                              text->paragraphs(),
                                              cur.pit(), cur.pos(),
-                                             cur.buffer().params().textclass,
-                                             sel_index, el);
+                                             parlist, textclass,
+                                             el);
 		bufferErrors(cur.buffer(), el);
-		cur.bv().showErrorList(_("Paste"));
-
+		updateCounters(cur.buffer());
 		cur.clearSelection();
 		text->setCursor(cur, ppp.first, ppp.second);
-		cur.setSelection();
-		updateCounters(cur.buffer());
 	}
 
 	// mathed is handled in MathNestInset/MathGridInset
 	BOOST_ASSERT(!cur.inMathed());
+}
+
+
+void pasteSelection(LCursor & cur, size_t sel_index)
+{
+	// this does not make sense, if there is nothing to paste
+	lyxerr[Debug::DEBUG] << "#### pasteSelection " << sel_index << endl;
+	if (!checkPastePossible(sel_index))
+		return;
+
+	pasteParagraphList(cur, theCuts[sel_index].first,
+			   theCuts[sel_index].second);
+	cur.bv().showErrorList(_("Paste"));
+	cur.setSelection();
 }
 
 
Index: src/CutAndPaste.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/CutAndPaste.h,v
retrieving revision 1.42
diff -u -p -r1.42 CutAndPaste.h
--- src/CutAndPaste.h	25 Nov 2005 09:27:08 -0000	1.42
+++ src/CutAndPaste.h	29 Nov 2005 11:20:50 -0000
@@ -56,6 +56,11 @@ void copySelection(LCursor & cur);
 ///
 void pasteSelection(LCursor & cur, size_t sel_index = 0);
 
+///
+void pasteParagraphList(LCursor & cur, ParagraphList const & parlist, 
+                        textclass_type textclass);
+
+
 /** Needed to switch between different classes. This works
  *  for a list of paragraphs beginning with the specified par.
  *  It changes layouts and character styles.
Index: src/buffer.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/buffer.C,v
retrieving revision 1.629
diff -u -p -r1.629 buffer.C
--- src/buffer.C	13 Oct 2005 10:59:37 -0000	1.629
+++ src/buffer.C	29 Nov 2005 11:20:50 -0000
@@ -470,25 +470,23 @@ bool Buffer::readDocument(LyXLex & lex)
 		error(ErrorItem(_("Document header error"), s, -1, 0, 0));
 	}
 
-	if (paragraphs().empty()) {
-		readHeader(lex);
-		if (!params().getLyXTextClass().load()) {
-			string theclass = params().getLyXTextClass().name();
-			Alert::error(_("Can't load document class"), bformat(
-					"Using the default document class, because the "
-					" class %1$s could not be loaded.", theclass));
-			params().textclass = 0;
-		}
-	} else {
-		// We don't want to adopt the parameters from the
-		// document we insert, so read them into a temporary buffer
-		// and then discard it
-
-		Buffer tmpbuf("", false);
-		tmpbuf.readHeader(lex);
-	}
+	// we are reading in a brand new document
+	BOOST_ASSERT(paragraphs().empty());
 
-	return text().read(*this, lex);
+	readHeader(lex);
+	if (!params().getLyXTextClass().load()) {
+		string theclass = params().getLyXTextClass().name();
+		Alert::error(_("Can't load document class"), bformat(
+				     "Using the default document class, because the "
+				     " class %1$s could not be loaded.", theclass));
+		params().textclass = 0;
+	}
+
+	bool const res = text().read(*this, lex);
+	for_each(text().paragraphs().begin(),
+		 text().paragraphs().end(),
+		 bind(&Paragraph::setInsetOwner, _1, &inset()));
+	return res;
 }
 
 
@@ -556,7 +554,9 @@ bool Buffer::readFile(string const & fil
 
 	// remove dummy empty par
 	paragraphs().clear();
-	bool ret = readFile(filename, paragraphs().size());
+	LyXLex lex(0, 0);
+	lex.setFile(filename);
+	bool ret = readFile(lex, filename);
 
 	// After we have read a file, we must ensure that the buffer
 	// language is set and used in the gui.
@@ -567,14 +567,6 @@ bool Buffer::readFile(string const & fil
 }
 
 
-bool Buffer::readFile(string const & filename, pit_type const pit)
-{
-	LyXLex lex(0, 0);
-	lex.setFile(filename);
-	return readFile(lex, filename, pit);
-}
-
-
 bool Buffer::fully_loaded() const
 {
 	return pimpl_->file_fully_loaded;
@@ -587,7 +579,7 @@ void Buffer::fully_loaded(bool const val
 }
 
 
-bool Buffer::readFile(LyXLex & lex, string const & filename, pit_type const pit)
+bool Buffer::readFile(LyXLex & lex, string const & filename)
 {
 	BOOST_ASSERT(!filename.empty());
 
@@ -668,7 +660,7 @@ bool Buffer::readFile(LyXLex & lex, stri
 					      filename));
 			return false;
 		} else {
-			bool const ret = readFile(tmpfile, pit);
+			bool const ret = readFile(tmpfile);
 			// Do stuff with tmpfile name and buffer name here.
 			return ret;
 		}
Index: src/buffer.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/buffer.h,v
retrieving revision 1.193
diff -u -p -r1.193 buffer.h
--- src/buffer.h	17 Jul 2005 23:02:58 -0000	1.193
+++ src/buffer.h	29 Nov 2005 11:20:50 -0000
@@ -93,8 +93,6 @@ public:
 	/// load a new file
 	bool readFile(std::string const & filename);
 
-	bool readFile(std::string const & filename, lyx::pit_type pit);
-
 	/// read the header, returns number of unknown tokens
 	int readHeader(LyXLex & lex);
 
@@ -338,11 +336,9 @@ public:
 
 private:
 	/** Inserts a file into a document
-	    \param par if != 0 insert the file.
 	    \return \c false if method fails.
 	*/
-	bool readFile(LyXLex &, std::string const & filename,
-		      lyx::pit_type pit);
+	bool readFile(LyXLex &, std::string const & filename);
 
 	bool do_writeFile(std::ostream & ofs) const;
 
Index: src/frontends/controllers/ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ChangeLog,v
retrieving revision 1.501
diff -u -p -r1.501 ChangeLog
--- src/frontends/controllers/ChangeLog	2 Nov 2005 20:11:35 -0000	1.501
+++ src/frontends/controllers/ChangeLog	29 Nov 2005 11:20:50 -0000
@@ -1,3 +1,8 @@
+2005-11-28  Jean-Marc Lasgouttes  <[EMAIL PROTECTED]>
+
+	* ControlErrorList.C (goTo): give a better error message when pid
+	is not found.
+
 2005-11-02  Angus Leeming  <[EMAIL PROTECTED]>
 
 	* helper_funcs.C: trivial fix to a MSVS warning.
Index: src/frontends/controllers/ControlErrorList.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ControlErrorList.C,v
retrieving revision 1.27
diff -u -p -r1.27 ControlErrorList.C
--- src/frontends/controllers/ControlErrorList.C	3 Jun 2005 08:48:04 -0000	1.27
+++ src/frontends/controllers/ControlErrorList.C	29 Nov 2005 11:20:50 -0000
@@ -64,7 +64,7 @@ void ControlErrorList::goTo(int item)
 	ParIterator pit = buf.getParFromID(err.par_id);
 
 	if (pit == buf.par_iterator_end()) {
-		lyxerr << "par id not found" << endl;
+		lyxerr << "par id " << err.par_id << " not found" << endl;
 		return;
 	}
 

Reply via email to