Here is a patch for this bug, which boils down to: createInset should
create insets, and dispatch is responsible for spawning dialogs if
needed. The constification of getStringToIndex is not needed, but I
think it is better.

I will commit on monday if nobody objects.

JMarc

Index: ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/ChangeLog,v
retrieving revision 1.2188
diff -u -p -r1.2188 ChangeLog
--- ChangeLog	24 May 2005 10:23:29 -0000	1.2188
+++ ChangeLog	27 May 2005 13:28:15 -0000
@@ -1,3 +1,18 @@
+2005-05-27  Jean-Marc Lasgouttes  <[EMAIL PROTECTED]>
+
+	Fix bug 1892:
+	
+	* text2.C (getStringToIndex): constify cur argument.
+
+	* factory.C (createInset/LFUN_TABULAR_INSERT): return 0 if no
+	argument has been given
+	(createInset/LFUN_INDEX_INSERT): just return a new inset (do not
+	try to invoke LFUN_INSET_APPLY).
+
+	* text3.C (dispatch/LFUN_TABULAR_INSERT): open the tabular dialog
+	if no inset was created by doInsertInset
+	(doInsertInset): return true if an inset has been inserted.
+
 2005-05-23  Jean-Marc Lasgouttes  <[EMAIL PROTECTED]>
 
 	* vspace.C (asGUIName): new method. A version of the space
Index: factory.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/factory.C,v
retrieving revision 1.96
diff -u -p -r1.96 factory.C
--- factory.C	4 May 2005 11:21:13 -0000	1.96
+++ factory.C	27 May 2005 13:28:15 -0000
@@ -56,9 +56,6 @@
 #include "mathed/math_macrotemplate.h"
 #include "mathed/math_hullinset.h"
 
-#include "frontends/Dialogs.h"
-#include "frontends/LyXView.h"
-
 #include "support/lstrings.h"
 
 #include <boost/assert.hpp>
@@ -163,15 +160,8 @@ InsetBase * createInset(BufferView * bv,
 			cmd.argument;
 		icp.setContents(contents);
 
-		string data = InsetCommandMailer::params2string("index", icp);
-		LyXView * lv = bv->owner();
+		return new InsetIndex(icp);
 
-		if (icp.getContents().empty()) {
-			lv->getDialogs().show("index", data, 0);
-		} else {
-			lv->dispatch(FuncRequest(LFUN_INSET_APPLY, data));
-		}
-		return 0;
 	}
 
 	case LFUN_TABULAR_INSERT:
@@ -183,7 +173,6 @@ InsetBase * createInset(BufferView * bv,
 			if (c <= 0) c = 2;
 			return new InsetTabular(*bv->buffer(), r, c);
 		}
-		bv->owner()->getDialogs().show("tabularcreate");
 		return 0;
 
 	case LFUN_INSET_CAPTION: {
Index: lyxtext.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxtext.h,v
retrieving revision 1.321
diff -u -p -r1.321 lyxtext.h
--- lyxtext.h	12 Apr 2005 18:42:24 -0000	1.321
+++ lyxtext.h	27 May 2005 13:28:15 -0000
@@ -105,7 +105,7 @@ public:
 	void toggleFree(LCursor & cur, LyXFont const &, bool toggleall = false);
 
 	///
-	std::string getStringToIndex(LCursor & cur);
+	std::string getStringToIndex(LCursor const & cur);
 
 	/// insert a character at cursor position
 	void insertChar(LCursor & cur, char c);
Index: text2.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text2.C,v
retrieving revision 1.607
diff -u -p -r1.607 text2.C
--- text2.C	26 Apr 2005 11:12:12 -0000	1.607
+++ text2.C	27 May 2005 13:28:15 -0000
@@ -527,31 +527,27 @@ void LyXText::toggleFree(LCursor & cur, 
 }
 
 
-string LyXText::getStringToIndex(LCursor & cur)
+string LyXText::getStringToIndex(LCursor const & cur)
 {
 	BOOST_ASSERT(this == cur.text());
-	// Try implicit word selection
-	// If there is a change in the language the implicit word selection
-	// is disabled.
-	CursorSlice const reset_cursor = cur.top();
-	bool const implicitSelection =
-		selectWordWhenUnderCursor(cur, lyx::PREVIOUS_WORD);
 
 	string idxstring;
-	if (!cur.selection())
-		cur.message(_("Nothing to index!"));
-	else if (cur.selBegin().pit() != cur.selEnd().pit())
-		cur.message(_("Cannot index more than one paragraph!"));
-	else
+	if (cur.selection()) {
 		idxstring = cur.selectionAsString(false);
+	} else {
+		// Try implicit word selection. If there is a change
+		// in the language the implicit word selection is
+		// disabled.
+		LCursor tmpcur = cur;
+		selectWord(tmpcur, lyx::PREVIOUS_WORD);
 
-	// Reset cursors to their original position.
-	cur.top() = reset_cursor;
-	cur.resetAnchor();
-
-	// Clear the implicit selection.
-	if (implicitSelection)
-		cur.clearSelection();
+		if (!tmpcur.selection())
+			cur.message(_("Nothing to index!"));
+		else if (tmpcur.selBegin().pit() != tmpcur.selEnd().pit())
+			cur.message(_("Cannot index more than one paragraph!"));
+		else
+			idxstring = tmpcur.selectionAsString(false);
+	}
 
 	return idxstring;
 }
Index: text3.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text3.C,v
retrieving revision 1.293
diff -u -p -r1.293 text3.C
--- text3.C	5 May 2005 13:13:56 -0000	1.293
+++ text3.C	27 May 2005 13:28:15 -0000
@@ -235,12 +235,12 @@ void specialChar(LCursor & cur, InsetSpe
 }
 
 
-void doInsertInset(LCursor & cur, LyXText * text,
+bool doInsertInset(LCursor & cur, LyXText * text,
 	FuncRequest const & cmd, bool edit, bool pastesel)
 {
 	InsetBase * inset = createInset(&cur.bv(), cmd);
 	if (!inset)
-		return;
+		return false;
 
 	recordUndo(cur);
 	bool gotsel = false;
@@ -255,6 +255,7 @@ void doInsertInset(LCursor & cur, LyXTex
 
 	if (gotsel && pastesel)
 		cur.bv().owner()->dispatch(FuncRequest(LFUN_PASTE));
+	return true;
 }
 
 
@@ -1182,12 +1183,20 @@ void LyXText::dispatch(LCursor & cur, Fu
 	case LFUN_INSET_FOOTNOTE:
 	case LFUN_INSET_MARGINAL:
 	case LFUN_INSET_OPTARG:
-	case LFUN_TABULAR_INSERT:
 	case LFUN_ENVIRONMENT_INSERT:
 		// Open the inset, and move the current selection
 		// inside it.
 		doInsertInset(cur, this, cmd, true, true);
 		cur.posRight();
+		break;
+
+	case LFUN_TABULAR_INSERT:
+		// if there were no arguments, just open the dialog
+		if (doInsertInset(cur, this, cmd, false, true))
+			cur.posRight();
+		else
+			bv->owner()->getDialogs().show("tabularcreate");
+
 		break;
 
 	case LFUN_INSET_FLOAT:

Reply via email to