]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insettext.C
Insert mouse_x/y positon to have a REAL motion check. Fixed the spurious
[lyx.git] / src / insets / insettext.C
index 1e0a9906fbfc36df01b4c07797c90e1fd64a8cd2..4133732325f9ee46ee023724806c3002dfd269bf 100644 (file)
 
 #include <config.h>
 
-#include <fstream>
-#include <algorithm>
-
-#include <cstdlib>
-//#include <signal.h>
-
 #ifdef __GNUG__
 #pragma implementation
 #endif
 #include "layout.h"
 #include "LaTeXFeatures.h"
 #include "Painter.h"
-#include "frontends/Alert.h"
 #include "lyxtext.h"
 #include "lyxcursor.h"
 #include "CutAndPaste.h"
 #include "font.h"
 #include "LColor.h"
-#include "support/textutils.h"
-#include "support/LAssert.h"
-#include "support/lstrings.h"
 #include "lyxrow.h"
 #include "lyxrc.h"
 #include "intl.h"
 #include "undo_funcs.h"
 #include "lyxfind.h"
 
+#include "frontends/Alert.h"
+
+#include "support/textutils.h"
+#include "support/LAssert.h"
+#include "support/lstrings.h"
+
+#include <fstream>
+#include <algorithm>
+#include <cstdlib>
+//#include <csignal>
+
 using std::ostream;
 using std::ifstream;
 using std::endl;
@@ -292,29 +293,17 @@ void InsetText::read(Buffer const * buf, LyXLex & lex)
 
 int InsetText::ascent(BufferView * bv, LyXFont const &) const
 {
-       bool clear = false;
-       if (!lt) {
-               lt = getLyXText(bv);
-               clear = true;
-       }
-       insetAscent = lt->firstRow()->ascent_of_text() + TEXT_TO_INSET_OFFSET;
-       if (clear)
-               lt = 0;
+       insetAscent = getLyXText(bv)->firstRow()->ascent_of_text() +
+               TEXT_TO_INSET_OFFSET;
        return insetAscent;
 }
 
 
 int InsetText::descent(BufferView * bv, LyXFont const &) const
 {
-       bool clear = false;
-       if (!lt) {
-               lt = getLyXText(bv);
-               clear = true;
-       }
-       insetDescent = lt->height - lt->firstRow()->ascent_of_text() +
+       LyXText * llt = getLyXText(bv);
+       insetDescent = llt->height - llt->firstRow()->ascent_of_text() +
                TEXT_TO_INSET_OFFSET;
-       if (clear)
-               lt = 0;
        return insetDescent;
 }
 
@@ -507,7 +496,6 @@ void InsetText::draw(BufferView * bv, LyXFont const & f,
        } else if (need_update != INIT) {
                need_update = NONE;
        }
-       
        if (clear)
                lt = 0;
 }
@@ -571,18 +559,6 @@ void InsetText::update(BufferView * bv, LyXFont const & font, bool reinit)
                lt = getLyXText(bv);
                clear = true;
        }
-#if 0
-       int oldw = insetWidth;
-       insetWidth = lt->width + (2 * TEXT_TO_INSET_OFFSET);
-       if (oldw != insetWidth) {
-               resizeLyXText(bv);
-               need_update |= FULL;
-               if (clear)
-                       lt = 0;
-               in_update = false;
-               return;
-       }
-#endif
        if ((need_update & CURSOR_PAR) && (lt->status() == LyXText::UNCHANGED) &&
                the_locking_inset)
        {
@@ -598,36 +574,34 @@ void InsetText::update(BufferView * bv, LyXFont const & font, bool reinit)
 
 void InsetText::setUpdateStatus(BufferView * bv, int what) const
 {
-       bool clear = false;
-       if (!lt) {
-               lt = getLyXText(bv);
-               clear = true;
-       }
+       // this does nothing dangerous so use only a localized buffer
+       LyXText * llt = getLyXText(bv);
+       
        need_update |= what;
        // we have to redraw us full if our LyXText NEEDS_MORE_REFRES or
        // if we don't break row so that we only have one row to update!
-       if ((lt->status() == LyXText::NEED_MORE_REFRESH) ||
+       if ((llt->status() == LyXText::NEED_MORE_REFRESH) ||
            (!autoBreakRows &&
-            (lt->status() == LyXText::NEED_VERY_LITTLE_REFRESH)))
+            (llt->status() == LyXText::NEED_VERY_LITTLE_REFRESH)))
        {
                need_update |= FULL;
-       } else if (lt->status() == LyXText::NEED_VERY_LITTLE_REFRESH) {
+       } else if (llt->status() == LyXText::NEED_VERY_LITTLE_REFRESH) {
                need_update |= CURSOR_PAR;
        }
 
        // this to not draw a selection when we redraw all of it!
        if (need_update & CURSOR && !(need_update & SELECTION)) {
-               if (lt->selection.set())
+               if (llt->selection.set())
                        need_update = FULL;
-               lt->clearSelection();
+               llt->clearSelection();
        }
-       if (clear)
-               lt = 0;
 }
 
 
 void InsetText::updateLocal(BufferView * bv, int what, bool mark_dirty) const
 {
+       if (!autoBreakRows && par->next())
+               collapseParagraphs(bv->buffer()->params);
        bool clear = false;
        if (!lt) {
                lt = getLyXText(bv);
@@ -635,11 +609,12 @@ void InsetText::updateLocal(BufferView * bv, int what, bool mark_dirty) const
        }
        lt->fullRebreak(bv);
        setUpdateStatus(bv, what);
-       if (((need_update != CURSOR) && (need_update != NONE)) ||
-           (lt->status() != LyXText::UNCHANGED) || lt->selection.set())
-       {
+       bool flag = (((need_update != CURSOR) && (need_update != NONE)) ||
+                    (lt->status() != LyXText::UNCHANGED) || lt->selection.set());
+       if (clear)
+               lt = 0;
+       if (flag)
                bv->updateInset(const_cast<InsetText *>(this), mark_dirty);
-       }
        if (need_update == CURSOR)
                need_update = NONE;
        bv->owner()->showState();
@@ -647,8 +622,6 @@ void InsetText::updateLocal(BufferView * bv, int what, bool mark_dirty) const
                bv->owner()->setLayout(cpar(bv)->getLayout());
                old_par = cpar(bv);
        }
-       if (clear)
-               lt = 0;
 }
 
 
@@ -678,25 +651,24 @@ void InsetText::edit(BufferView * bv, int x, int y, unsigned int button)
                lt = getLyXText(bv);
                clear = true;
        }
-
        if (!checkAndActivateInset(bv, x, tmp_y, button))
                lt->setCursorFromCoordinates(bv, x - drawTextXOffset,
                                            y + insetAscent);
        lt->clearSelection();
        finishUndo();
-       showInsetCursor(bv);
-       updateLocal(bv, CURSOR, false);
-
        // If the inset is empty set the language of the current font to the
        // language to the surronding text (if different).
        if (par->size() == 0 && !par->next() &&
-               bv->getParentLanguage(this) != lt->current_font.language()) {
+               bv->getParentLanguage(this) != lt->current_font.language())
+       {
                LyXFont font(LyXFont::ALL_IGNORE);
                font.setLanguage(bv->getParentLanguage(this));
                setFont(bv, font, false);
        }
+       showInsetCursor(bv);
        if (clear)
                lt = 0;
+       updateLocal(bv, CURSOR, false);
 }
 
 
@@ -730,9 +702,6 @@ void InsetText::edit(BufferView * bv, bool front)
        }
        lt->clearSelection();
        finishUndo();
-       showInsetCursor(bv);
-       updateLocal(bv, CURSOR, false);
-
        // If the inset is empty set the language of the current font to the
        // language to the surronding text (if different).
        if (par->size() == 0 && !par->next() &&
@@ -741,8 +710,10 @@ void InsetText::edit(BufferView * bv, bool front)
                font.setLanguage(bv->getParentLanguage(this));
                setFont(bv, font, false);
        }
+       showInsetCursor(bv);
        if (clear)
                lt = 0;
+       updateLocal(bv, CURSOR, false);
 }
 
 
@@ -775,9 +746,9 @@ void InsetText::insetUnlock(BufferView * bv)
                bv->owner()->setLayout(bv->text->cursor.par()->getLayout());
        // hack for deleteEmptyParMech
        lt->setCursor(bv, par, 0);
-       updateLocal(bv, code, false);
        if (clear)
                lt = 0;
+       updateLocal(bv, code, false);
 }
 
 void InsetText::lockInset(BufferView * bv, UpdatableInset * inset)
@@ -866,6 +837,10 @@ bool InsetText::unlockInsetInInset(BufferView * bv, UpdatableInset * inset,
 
 bool InsetText::updateInsetInInset(BufferView * bv, Inset * inset)
 {
+       if (!autoBreakRows && par->next())
+               collapseParagraphs(bv->buffer()->params);
+       if (inset == this)
+               return true;
        bool clear = false;
        if (!lt) {
                lt = getLyXText(bv);
@@ -880,10 +855,6 @@ bool InsetText::updateInsetInInset(BufferView * bv, Inset * inset)
                return found;
        }
        if (the_locking_inset != inset) {
-#if 0
-               lt->updateInset(bv, the_locking_inset);
-               setUpdateStatus(bv, CURSOR_PAR);
-#endif
                bool found = the_locking_inset->updateInsetInInset(bv, inset);
                if (clear)
                        lt = 0;
@@ -896,9 +867,6 @@ bool InsetText::updateInsetInInset(BufferView * bv, Inset * inset)
                lt = 0;
        if (found) {
                setUpdateStatus(bv, CURSOR_PAR);
-#if 0
-               updateLocal(bv, CURSOR_PAR, false);
-#endif
                if (cpar(bv) == inset_par && cpos(bv) == inset_pos) {
                        inset_x = cx(bv) - top_x + drawTextXOffset;
                        inset_y = cy(bv) + drawTextYOffset;
@@ -912,14 +880,21 @@ void InsetText::insetButtonPress(BufferView * bv, int x, int y, int button)
 {
        no_selection = true;
 
+       // use this to check mouse motion for selection!
+       mouse_x = x;
+       mouse_y = y;
+
        int tmp_x = x - drawTextXOffset;
        int tmp_y = y + insetAscent - getLyXText(bv)->first;
-       Inset * inset = bv->checkInsetHit(getLyXText(bv), tmp_x, tmp_y, button);
+       Inset * inset = bv->checkInsetHit(getLyXText(bv), tmp_x, tmp_y);
 
        hideInsetCursor(bv);
        if (the_locking_inset) {
                if (the_locking_inset == inset) {
-                       the_locking_inset->insetButtonPress(bv,x-inset_x,y-inset_y,button);
+                       the_locking_inset->insetButtonPress(bv,
+                                                           x - inset_x,
+                                                           y - inset_y,
+                                                           button);
                        no_selection = false;
                        return;
                } else if (inset) {
@@ -928,7 +903,8 @@ void InsetText::insetButtonPress(BufferView * bv, int x, int y, int button)
                        inset_x = cx(bv) - top_x + drawTextXOffset;
                        inset_y = cy(bv) + drawTextYOffset;
                        the_locking_inset = static_cast<UpdatableInset*>(inset);
-                       inset->insetButtonPress(bv, x - inset_x, y - inset_y, button);
+                       inset->insetButtonPress(bv, x - inset_x,
+                                               y - inset_y, button);
                        inset->edit(bv, x - inset_x, y - inset_y, button);
                        if (the_locking_inset)
                                updateLocal(bv, CURSOR, false);
@@ -968,12 +944,22 @@ void InsetText::insetButtonPress(BufferView * bv, int x, int y, int button)
                        lt = getLyXText(bv);
                        clear = true;
                }
-               lt->setCursorFromCoordinates(bv, x-drawTextXOffset, y + insetAscent);
+
+               lt->setCursorFromCoordinates(bv, x - drawTextXOffset,
+                                            y + insetAscent);
+               // set the selection cursor!
+               lt->selection.cursor = lt->cursor;
+               lt->cursor.x_fix(lt->cursor.x());
+
                if (lt->selection.set()) {
                        lt->clearSelection();
+                       if (clear)
+                               lt = 0;
                        updateLocal(bv, FULL, false);
                } else {
                        lt->clearSelection();
+                       if (clear)
+                               lt = 0;
                }
                bv->owner()->setLayout(cpar(bv)->getLayout());
                old_par = cpar(bv);
@@ -987,52 +973,50 @@ void InsetText::insetButtonPress(BufferView * bv, int x, int y, int button)
                                localDispatch(bv, LFUN_PASTESELECTION,
                                              "paragraph");
                }
-               if (clear)
-                       lt = 0;
+       } else {
+               getLyXText(bv)->clearSelection();
        }
        showInsetCursor(bv);
        no_selection = false;
 }
 
 
-void InsetText::insetButtonRelease(BufferView * bv, int x, int y, int button)
+bool InsetText::insetButtonRelease(BufferView * bv, int x, int y, int button)
 {
-       UpdatableInset * inset = 0;
-
        if (the_locking_inset) {
-               the_locking_inset->insetButtonRelease(bv,
-                                                     x - inset_x, y - inset_y,
-                                                     button);
-       } else {
-               if (cpar(bv)->isInset(cpos(bv))) {
-                       inset = static_cast<UpdatableInset*>(cpar(bv)->getInset(cpos(bv)));
-                       if (isHighlyEditableInset(inset)) {
-                               inset->insetButtonRelease(bv,
-                                                         x - inset_x,
-                                                         y - inset_y, button);
-                       } else {
-                               inset_x = cx(bv) - top_x + drawTextXOffset;
-                               inset_y = cy(bv) + drawTextYOffset;
-                               inset->insetButtonRelease(bv,
-                                                         x - inset_x,
-                                                         y - inset_y, button);
-                               inset->edit(bv,
-                                           x - inset_x, y - inset_y, button);
-                       }
-                       updateLocal(bv, CURSOR_PAR, false);
+               return the_locking_inset->insetButtonRelease(bv,
+                                                            x - inset_x, y - inset_y,
+                                                            button);
+       }
+       int tmp_x = x - drawTextXOffset;
+       int tmp_y = y + insetAscent - getLyXText(bv)->first;
+       Inset * inset = bv->checkInsetHit(getLyXText(bv), tmp_x, tmp_y);
+       bool ret = false;
+       if (inset) {
+               if (isHighlyEditableInset(inset)) {
+                       ret = inset->insetButtonRelease(bv, x - inset_x,
+                                                       y - inset_y, button);
+               } else {
+                       inset_x = cx(bv) - top_x + drawTextXOffset;
+                       inset_y = cy(bv) + drawTextYOffset;
+                       ret = inset->insetButtonRelease(bv, x - inset_x,
+                                                       y - inset_y, button);
+                       inset->edit(bv, x - inset_x,
+                                   y - inset_y, button);
                }
+               updateLocal(bv, CURSOR_PAR, false);
        }
-       no_selection = false;
+       return ret;
 }
 
 
 void InsetText::insetMotionNotify(BufferView * bv, int x, int y, int state)
 {
-       if (no_selection)
+       if (no_selection || ((mouse_x == x) && (mouse_y == y)))
                return;
        if (the_locking_inset) {
                the_locking_inset->insetMotionNotify(bv, x - inset_x,
-                                                    y - inset_y,state);
+                                                    y - inset_y,state);
                return;
        }
        bool clear = false;
@@ -1041,16 +1025,22 @@ void InsetText::insetMotionNotify(BufferView * bv, int x, int y, int state)
                clear = true;
        }
        hideInsetCursor(bv);
+       LyXCursor cur = lt->cursor;
        lt->setCursorFromCoordinates(bv, x - drawTextXOffset, y + insetAscent);
+       if (cur == lt->cursor) {
+               if (clear)
+                       lt = 0;
+               return;
+       }
        lt->setSelection(bv);
-       if (lt->toggle_cursor.par() != lt->toggle_end_cursor.par() ||
-               lt->toggle_cursor.pos() != lt->toggle_end_cursor.pos())
-       {
+       bool flag = (lt->toggle_cursor.par() != lt->toggle_end_cursor.par() ||
+                                lt->toggle_cursor.pos() != lt->toggle_end_cursor.pos());
+       if (clear)
+               lt = 0;
+       if (flag) {
                updateLocal(bv, SELECTION, false);
        }
        showInsetCursor(bv);
-       if (clear)
-               lt = 0;
 }
 
 
@@ -1121,6 +1111,8 @@ InsetText::localDispatch(BufferView * bv,
                lt = getLyXText(bv);
                clear = true;
        }
+       int updwhat = 0;
+       int updflag = false;
        switch (action) {
        // Normal chars
        case LFUN_SELFINSERT:
@@ -1149,7 +1141,8 @@ InsetText::localDispatch(BufferView * bv,
                        }
                }
                lt->selection.cursor = lt->cursor;
-               updateLocal(bv, CURSOR_PAR, true);
+               updwhat = CURSOR_PAR;
+               updflag = true;
                result = DISPATCHED_NOUPDATE;
                break;
                // --- Cursor Movements -----------------------------------
@@ -1157,54 +1150,54 @@ InsetText::localDispatch(BufferView * bv,
                finishUndo();
                moveRight(bv, false, true);
                lt->setSelection(bv);
-               updateLocal(bv, SELECTION, false);
+               updwhat = SELECTION;
                break;
        case LFUN_RIGHT:
                result = moveRight(bv);
                finishUndo();
-               updateLocal(bv, CURSOR, false);
+               updwhat = CURSOR;
                break;
        case LFUN_LEFTSEL:
                finishUndo();
                moveLeft(bv, false, true);
                lt->setSelection(bv);
-               updateLocal(bv, SELECTION, false);
+               updwhat = SELECTION;
                break;
        case LFUN_LEFT:
                finishUndo();
                result = moveLeft(bv);
-               updateLocal(bv, CURSOR, false);
+               updwhat = CURSOR;
                break;
        case LFUN_DOWNSEL:
                finishUndo();
                moveDown(bv);
                lt->setSelection(bv);
-               updateLocal(bv, SELECTION, false);
+               updwhat = SELECTION;
                break;
        case LFUN_DOWN:
                finishUndo();
                result = moveDown(bv);
-               updateLocal(bv, CURSOR, false);
+               updwhat = CURSOR;
                break;
        case LFUN_UPSEL:
                finishUndo();
                moveUp(bv);
                lt->setSelection(bv);
-               updateLocal(bv, SELECTION, false);
+               updwhat = SELECTION;
                break;
        case LFUN_UP:
                finishUndo();
                result = moveUp(bv);
-               updateLocal(bv, CURSOR, false);
+               updwhat = CURSOR;
                break;
        case LFUN_HOME:
                finishUndo();
                lt->cursorHome(bv);
-               updateLocal(bv, CURSOR, false);
+               updwhat = CURSOR;
                break;
        case LFUN_END:
                lt->cursorEnd(bv);
-               updateLocal(bv, CURSOR, false);
+               updwhat = CURSOR;
                break;
        case LFUN_BACKSPACE: {
                setUndo(bv, Undo::DELETE,
@@ -1213,7 +1206,8 @@ InsetText::localDispatch(BufferView * bv,
                        lt->cutSelection(bv);
                else
                        lt->backspace(bv);
-               updateLocal(bv, CURSOR_PAR, true);
+               updwhat = CURSOR_PAR;
+               updflag = true;
        }
        break;
        
@@ -1225,7 +1219,8 @@ InsetText::localDispatch(BufferView * bv,
                } else {
                        lt->Delete(bv);
                }
-               updateLocal(bv, CURSOR_PAR, true);
+               updwhat = CURSOR_PAR;
+               updflag = true;
        }
        break;
        
@@ -1233,14 +1228,15 @@ InsetText::localDispatch(BufferView * bv,
                setUndo(bv, Undo::DELETE,
                        lt->cursor.par(), lt->cursor.par()->next());
                lt->cutSelection(bv);
-               updateLocal(bv, CURSOR_PAR, true);
+               updwhat = CURSOR_PAR;
+               updflag = true;
        }
        break;
 
        case LFUN_COPY:
                finishUndo();
                lt->copySelection(bv);
-               updateLocal(bv, CURSOR_PAR, false);
+               updwhat = CURSOR_PAR;
                break;
        case LFUN_PASTESELECTION:
        {
@@ -1253,7 +1249,8 @@ InsetText::localDispatch(BufferView * bv,
                } else {
                        lt->insertStringAsLines(bv, clip);
                }
-               updateLocal(bv, CURSOR_PAR, true);
+               updwhat = CURSOR_PAR;
+               updflag = true;
                break;
        }
        case LFUN_PASTE: {
@@ -1269,7 +1266,8 @@ InsetText::localDispatch(BufferView * bv,
                setUndo(bv, Undo::INSERT,
                        lt->cursor.par(), lt->cursor.par()->next());
                lt->pasteSelection(bv);
-               updateLocal(bv, CURSOR_PAR, true);
+               updwhat = CURSOR_PAR;
+               updflag = true;
        }
        break;
 
@@ -1279,7 +1277,8 @@ InsetText::localDispatch(BufferView * bv,
                        break;
                }
                lt->breakParagraph(bv, 0);
-               updateLocal(bv, FULL, true);
+               updwhat = FULL;
+               updflag = true;
                break;
        case LFUN_BREAKPARAGRAPHKEEPLAYOUT:
                if (!autoBreakRows) {
@@ -1287,7 +1286,8 @@ InsetText::localDispatch(BufferView * bv,
                        break;
                }
                lt->breakParagraph(bv, 1);
-               updateLocal(bv, FULL, true);
+               updwhat = FULL;
+               updflag = true;
                break;
 
        case LFUN_BREAKLINE: {
@@ -1298,7 +1298,8 @@ InsetText::localDispatch(BufferView * bv,
                setUndo(bv, Undo::INSERT,
                        lt->cursor.par(), lt->cursor.par()->next());
                lt->insertChar(bv, Paragraph::META_NEWLINE);
-               updateLocal(bv, CURSOR_PAR, true);
+               updwhat = CURSOR_PAR;
+               updflag = true;
        }
        break;
 
@@ -1332,7 +1333,8 @@ InsetText::localDispatch(BufferView * bv,
                                cur_layout = layout.second;
                                lt->setLayout(bv, layout.second);
                                bv->owner()->setLayout(cpar(bv)->getLayout());
-                               updateLocal(bv, CURSOR_PAR, true);
+                               updwhat = CURSOR_PAR;
+                               updflag = true;
                        }
                } else {
                        // reset the layout box
@@ -1380,7 +1382,8 @@ InsetText::localDispatch(BufferView * bv,
                }
                if (cur_spacing != new_spacing || cur_value != new_value) {
                        par->params().spacing(Spacing(new_spacing, new_value));
-                       updateLocal(bv, CURSOR_PAR, true);
+                       updwhat = CURSOR_PAR;
+                       updflag = true;
                }
        }
        break;
@@ -1391,6 +1394,10 @@ InsetText::localDispatch(BufferView * bv,
                break;
        }
 
+       if (clear)
+               lt = 0;
+       if (updwhat > 0)
+               updateLocal(bv, updwhat, updflag);
        /// If the action has deleted all text in the inset, we need to change the
        // language to the language of the surronding text.
        if (!was_empty && par->size() == 0 && !par->next()) {
@@ -1403,8 +1410,6 @@ InsetText::localDispatch(BufferView * bv,
                showInsetCursor(bv);
        } else
                bv->unlockInset(this);
-       if (clear)
-               lt = 0;
        return result;
 }
 
@@ -1814,16 +1819,10 @@ bool InsetText::insertInset(BufferView * bv, Inset * inset)
                clear = true;
        }
        lt->insertInset(bv, inset);
-#if 0
-       if ((!cpar(bv)->isInset(cpos(bv))) ||
-               (cpar(bv)->getInset(cpos(bv)) != inset))
-               lt->cursorLeft(bv);
-#endif
        bv->fitCursor();
-       updateLocal(bv, CURSOR_PAR|CURSOR, true);
-//     showInsetCursor(bv);
        if (clear)
                lt = 0;
+       updateLocal(bv, CURSOR_PAR|CURSOR, true);
        return true;
 }
 
@@ -1915,12 +1914,13 @@ void InsetText::setFont(BufferView * bv, LyXFont const & font, bool toggleall,
        if (selectall)
                lt->clearSelection();
        bv->fitCursor();
-       if (selectall || lt->selection.set())
+       bool flag = (selectall || lt->selection.set());
+       if (clear)
+               lt = 0;
+       if (flag)
                updateLocal(bv, FULL, true);
        else
                updateLocal(bv, CURSOR_PAR, true);
-       if (clear)
-               lt = 0;
 }
 
 
@@ -1960,7 +1960,7 @@ bool InsetText::checkAndActivateInset(BufferView * bv, int x, int y,
        x -= drawTextXOffset;
        int dummyx = x;
        int dummyy = y + insetAscent;
-       Inset * inset = bv->checkInsetHit(getLyXText(bv), dummyx, dummyy, button);
+       Inset * inset = bv->checkInsetHit(getLyXText(bv), dummyx, dummyy);
 
        if (inset) {
                if (x < 0)
@@ -2065,21 +2065,15 @@ void InsetText::setFrameColor(BufferView * bv, LColor::color col)
 
 int InsetText::cx(BufferView * bv) const
 {
-       bool clear = false;
-       if (!lt) {
-               lt = getLyXText(bv);
-               clear = true;
-       }
-       int x = lt->cursor.x() + top_x + TEXT_TO_INSET_OFFSET;
+       // we do nothing dangerous so we use a local cache
+       LyXText * llt = getLyXText(bv);
+       int x = llt->cursor.x() + top_x + TEXT_TO_INSET_OFFSET;
        if (the_locking_inset) {
-               LyXFont font = lt->getFont(bv->buffer(),
-                                            lt->cursor.par(),
-                                            lt->cursor.pos());
+               LyXFont font = llt->getFont(bv->buffer(), llt->cursor.par(),
+                                           llt->cursor.pos());
                if (font.isVisibleRightToLeft())
                        x -= the_locking_inset->width(bv, font);
        }
-       if (clear)
-               lt = 0;
        return x;
 }
 
@@ -2197,8 +2191,14 @@ void InsetText::resizeLyXText(BufferView * bv, bool force) const
        }
        do_resize = 0;
 //     lyxerr << "InsetText::resizeLyXText\n";
-       if (!par->next() && !par->size()) // no data, resize not neccessary!
+       if (!par->next() && !par->size()) { // no data, resize not neccessary!
+               // we have to do this as a fixed width may have changed!
+               LyXText * t = getLyXText(bv);
+               saveLyXTextState(t);
+               t->init(bv, true);
+               restoreLyXTextState(bv, t);
                return;
+       }
        // one endless line, resize normally not necessary
        if (!force && getMaxWidth(bv, this) < 0)
                return;
@@ -2534,7 +2534,7 @@ void InsetText::toggleSelection(BufferView * bv, bool kill_selection)
 
 
 bool InsetText::searchForward(BufferView * bv, string const & str,
-                              bool const & cs, bool const & mw)
+                              bool cs, bool mw)
 {
        if (the_locking_inset) {
                if (the_locking_inset->searchForward(bv, str, cs, mw))
@@ -2572,7 +2572,7 @@ bool InsetText::searchForward(BufferView * bv, string const & str,
 }
 
 bool InsetText::searchBackward(BufferView * bv, string const & str,
-                               bool const & cs, bool const & mw)
+                               bool cs, bool mw)
 {
        if (the_locking_inset)
                if (the_locking_inset->searchBackward(bv, str, cs, mw))
@@ -2592,3 +2592,14 @@ bool InsetText::checkInsertChar(LyXFont & font)
                return owner()->checkInsertChar(font);
        return true;
 }
+
+
+void InsetText::collapseParagraphs(BufferParams const & bparams) const
+{
+       while(par->next()) {
+               if (!par->isSeparator(par->size()-1))
+                       par->insertChar(par->size()-1, ' ');
+               par->pasteParagraph(bparams);
+       }
+       reinitLyXText();
+}