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: