]> git.lyx.org Git - lyx.git/blobdiff - src/text3.C
Fix loop when opening TOC widget in an empty document, basically by Richard Heck.
[lyx.git] / src / text3.C
index fe9c9cd7846c6d43c9ed1cb73ff1369c32640d7e..8cb97ba60714f00fca1954526b2495fb90c34129 100644 (file)
@@ -300,7 +300,7 @@ bool LyXText::isRTL(Buffer const & buffer, Paragraph const & par) const
 
 void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
 {
-       lyxerr[Debug::ACTION] << "LyXText::dispatch: cmd: " << cmd << endl;
+       LYXERR(Debug::ACTION) << "LyXText::dispatch: cmd: " << cmd << endl;
 
        // FIXME: We use the update flag to indicates wether a singlePar or a
        // full screen update is needed. We reset it here but shall we restore it
@@ -333,6 +333,10 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                std::swap(pars_[pit], pars_[pit + 1]);
 
                ParIterator begin(cur);
+               // begin.pos() (== cur.pos()) may point beyond the end of the 
+               // paragraph referenced by begin. This would cause a crash
+               // in updateLabels()
+               begin.pos() = 0;
                ++cur.pit();
                ParIterator end = boost::next(ParIterator(cur));
                updateLabels(cur.buffer(), begin, end);
@@ -347,7 +351,12 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                finishUndo();
                std::swap(pars_[pit], pars_[pit - 1]);
 
-               ParIterator end = boost::next(ParIterator(cur));
+               ParIterator end = ParIterator(cur);
+               // end.pos() (== cur.pos()) may point beyond the end of the 
+               // paragraph referenced by end. This would cause a crash
+               // in boost::next()
+               end.pos() = 0;
+               end = boost::next(end);
                --cur.pit();
                ParIterator begin(cur);
                updateLabels(cur.buffer(), begin, end);
@@ -576,6 +585,8 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
        case LFUN_BREAK_LINE: {
                // Not allowed by LaTeX (labels or empty par)
                if (cur.pos() > cur.paragraph().beginOfBody()) {
+                       // this avoids a double undo
+                       // FIXME: should not be needed, ideally
                        if (!cur.selection())
                                recordUndo(cur);
                        cap::replaceSelection(cur);
@@ -719,13 +730,17 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                recordUndo(cur);
                InsetBase * inset = createInset(bv, cmd);
                if (inset) {
-                       Paragraph & par = pars_[cur.pit()];
-                       // FIXME (Abdel 01/02/2006:
-                       // What follows is a partial fix for bug 2154:
+                       // FIXME (Abdel 01/02/2006):
+                       // What follows would be a partial fix for bug 2154:
                        //   http://bugzilla.lyx.org/show_bug.cgi?id=2154
-                       // This will automatically put the label inset _after_ a 
-                       // numbered section. It is possible to extend the mechanism
+                       // This automatically put the label inset _after_ a 
+                       // numbered section. It should be possible to extend the mechanism
                        // to any kind of LateX environement.
+                       // The correct way to fix that bug would be at LateX generation.
+                       // I'll let the code here for reference as it could be used for some
+                       // other feature like "automatic labelling".
+                       /*
+                       Paragraph & par = pars_[cur.pit()];
                        if (inset->lyxCode() == InsetBase::LABEL_CODE
                                && par.layout()->labeltype == LABEL_COUNTER) {
                                // Go to the end of the paragraph
@@ -736,6 +751,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                                FuncRequest fr(LFUN_BREAK_PARAGRAPH);
                                dispatch(cur, fr);
                        }
+                       */
                        insertInset(cur, inset);
                        cur.posRight();
                }
@@ -858,7 +874,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
 
        case LFUN_LAYOUT: {
                string layout = to_ascii(cmd.argument());
-               lyxerr[Debug::INFO] << "LFUN_LAYOUT: (arg) " << layout << endl;
+               LYXERR(Debug::INFO) << "LFUN_LAYOUT: (arg) " << layout << endl;
 
                // Derive layout number from given argument (string)
                // and current buffer's textclass (number)
@@ -934,22 +950,25 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
        }
                
        case LFUN_QUOTE_INSERT: {
-               cap::replaceSelection(cur);
                Paragraph & par = cur.paragraph();
                pos_type pos = cur.pos();
-               char_type c;
-               if (pos == 0)
-                       c = ' ';
-               else if (cur.prevInset() && cur.prevInset()->isSpace())
-                       c = ' ';
-               else
-                       c = par.getChar(pos - 1);
-
-               LyXLayout_ptr const & style = par.layout();
-
                BufferParams const & bufparams = bv->buffer()->params();
+               LyXLayout_ptr const & style = par.layout();
                if (!style->pass_thru
                    && par.getFontSettings(bufparams, pos).language()->lang() != "hebrew") {
+                       // this avoids a double undo
+                       // FIXME: should not be needed, ideally
+                       if (!cur.selection())
+                               recordUndo(cur);
+                       cap::replaceSelection(cur);
+                       pos = cur.pos();
+                       char_type c;
+                       if (pos == 0)
+                               c = ' ';
+                       else if (cur.prevInset() && cur.prevInset()->isSpace())
+                               c = ' ';
+                       else
+                               c = par.getChar(pos - 1);
                        string arg = to_utf8(cmd.argument());
                        if (arg == "single")
                                cur.insert(new InsetQuotes(c,
@@ -1122,12 +1141,8 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                docstring::const_iterator cit = cmd.argument().begin();
                docstring::const_iterator end = cmd.argument().end();
                for (; cit != end; ++cit)
-#if 0
                        bv->getIntl().getTransManager().
-                               translateAndInsert(*cit, this);
-#else
-                       insertChar(bv->cursor(), *cit);
-#endif
+                               translateAndInsert(*cit, this, cur);
 
                cur.resetAnchor();
                moveCursor(cur, false);
@@ -1205,16 +1220,33 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
        case LFUN_FLOAT_INSERT:
        case LFUN_FLOAT_WIDE_INSERT:
        case LFUN_WRAP_INSERT: {
+               bool content = cur.selection();  // will some text be moved into the inset?
+
                doInsertInset(cur, this, cmd, true, true);
                cur.posRight();
                ParagraphList & pars = cur.text()->paragraphs();
-               // We create two additional empty paragraphs so that the
-               // user can choose where to put the graphics (or table).
-               pars.push_back(pars[0]);
-               pars.push_back(pars[0]);
-               // Now that we have three paragraphs, we reposition the cursor
-               // at the beginning of the second one.
-               cur.pit() = 1;
+
+               LyXTextClass const & tclass = bv->buffer()->params().getLyXTextClass();
+
+               // add a separate paragraph for the caption inset
+               pars.push_back(Paragraph());
+               pars.back().setInsetOwner(pars[0].inInset());
+               pars.back().layout(tclass.defaultLayout());
+
+               int cap_pit = pars.size() - 1;
+
+               // if an empty inset was created, we create an additional empty
+               // paragraph at the bottom so that the user can choose where to put
+               // the graphics (or table).
+               if (!content) {
+                       pars.push_back(Paragraph());
+                       pars.back().setInsetOwner(pars[0].inInset());
+                       pars.back().layout(tclass.defaultLayout());
+                       
+               }
+
+               // reposition the cursor to the caption
+               cur.pit() = cap_pit;
                cur.pos() = 0;
                cur.dispatch(FuncRequest(LFUN_CAPTION_INSERT));
                // FIXME: When leaving the Float (or Wrap) inset we should
@@ -1228,7 +1260,6 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                InsetBase * inset = createInset(&cur.bv(), cmd);
                if (!inset)
                        break;
-
                recordUndo(cur);
                cur.clearSelection();
                insertInset(cur, inset);
@@ -1401,21 +1432,21 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_FINISHED_LEFT:
-               lyxerr[Debug::DEBUG] << "handle LFUN_FINISHED_LEFT:\n" << cur << endl;
+               LYXERR(Debug::DEBUG) << "handle LFUN_FINISHED_LEFT:\n" << cur << endl;
                break;
 
        case LFUN_FINISHED_RIGHT:
-               lyxerr[Debug::DEBUG] << "handle LFUN_FINISHED_RIGHT:\n" << cur << endl;
+               LYXERR(Debug::DEBUG) << "handle LFUN_FINISHED_RIGHT:\n" << cur << endl;
                ++cur.pos();
                break;
 
        case LFUN_FINISHED_UP:
-               lyxerr[Debug::DEBUG] << "handle LFUN_FINISHED_UP:\n" << cur << endl;
+               LYXERR(Debug::DEBUG) << "handle LFUN_FINISHED_UP:\n" << cur << endl;
                cursorUp(cur);
                break;
 
        case LFUN_FINISHED_DOWN:
-               lyxerr[Debug::DEBUG] << "handle LFUN_FINISHED_DOWN:\n" << cur << endl;
+               LYXERR(Debug::DEBUG) << "handle LFUN_FINISHED_DOWN:\n" << cur << endl;
                cursorDown(cur);
                break;
 
@@ -1541,7 +1572,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                break;
 
        default:
-               lyxerr[Debug::ACTION]
+               LYXERR(Debug::ACTION)
                        << BOOST_CURRENT_FUNCTION
                        << ": Command " << cmd
                        << " not DISPATCHED by LyXText" << endl;
@@ -1903,6 +1934,7 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
        case LFUN_CLEARDOUBLEPAGE_INSERT:
        case LFUN_MATH_DISPLAY:
        case LFUN_MATH_IMPORT_SELECTION:
+       case LFUN_MATH_INSERT:
        case LFUN_MATH_MODE:
        case LFUN_MATH_MACRO:
        case LFUN_MATH_MATRIX: