]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView_pimpl.C
small fix with footnote, use stringstream some more
[lyx.git] / src / BufferView_pimpl.C
index 152a5bf0c590842383515b284ede86b302d4b5a1..fb46ea88cc2aa86342592d0291dde68db5c37e92 100644 (file)
@@ -3,6 +3,7 @@
 #include <ctime>
 #include <unistd.h>
 #include <sys/wait.h>
+#include <locale.h>
 
 #ifdef __GNUG__
 #pragma implementation
@@ -15,8 +16,6 @@
 #include "lyxrow.h"
 #include "LyXView.h"
 #include "commandtags.h"
-#include "lyxfunc.h"
-#include "minibuffer.h"
 #include "font.h"
 #include "bufferview_funcs.h"
 #include "TextCache.h"
 #include "insets/insettabular.h"
 #include "insets/insettheorem.h"
 #include "insets/insetcaption.h"
+#include "insets/insetfloatlist.h"
 #include "mathed/formulamacro.h"
+#include "gettext.h"
+
 extern LyXTextClass::size_type current_layout;
-extern void math_insert_symbol(BufferView *, string const &);
-extern bool math_insert_greek(BufferView *, char);
 extern int greek_kb_flag;
 
-#ifdef SIGC_CXX_NAMESPACES
-using SigC::slot;
-#endif
-
+using std::vector;
 using std::find_if;
 using std::pair;
 using std::endl;
 using std::make_pair;
 using std::min;
+using SigC::slot;
 
 /* the selection possible is needed, that only motion events are 
  * used, where the bottom press event was on the drawing area too */
@@ -77,19 +75,21 @@ bool selection_possible = false;
 extern BufferList bufferlist;
 extern char ascii_type;
 
+extern bool math_insert_greek(BufferView *, char);
 extern void sigchldhandler(pid_t pid, int * status);
 extern int bibitemMaxWidth(BufferView *, LyXFont const &);
 
 const unsigned int saved_positions_num = 20;
 
-static inline
+namespace {
+
+inline
 void waitForX()
 {
        XSync(fl_get_display(), 0);
 }
 
 
-static
 void SetXtermCursor(Window win)
 {
        static Cursor cursor;
@@ -103,6 +103,8 @@ void SetXtermCursor(Window win)
        XFlush(fl_get_display());
 }
 
+} // anon namespace
+
 
 BufferView::Pimpl::Pimpl(BufferView * b, LyXView * o,
             int xpos, int ypos, int width, int height)
@@ -110,9 +112,6 @@ BufferView::Pimpl::Pimpl(BufferView * b, LyXView * o,
          current_scrollbar_value(0), cursor_timeout(400),
          workarea_(xpos, ypos, width, height), using_xterm_cursor(false)
 {
-       //buffer_ = 0;
-       //workarea_ = new WorkArea(xpos, ypos, width, height);
-       
        // Setup the signals
        workarea_.scrollCB.connect(slot(this, &BufferView::Pimpl::scrollCB));
        workarea_.workAreaExpose
@@ -224,7 +223,7 @@ void BufferView::Pimpl::buffer(Buffer * b)
        }
        // should update layoutchoice even if we don't have a buffer.
        owner_->updateLayoutChoice();
-       owner_->getMiniBuffer()->Init();
+
        owner_->updateWindowTitle();
 }
 
@@ -253,7 +252,7 @@ void BufferView::Pimpl::redraw()
 
 bool BufferView::Pimpl::fitCursor(LyXText * text)
 {
-       Assert(screen_.get());
+       lyx::Assert(screen_.get());
  
        bool ret = screen_->FitCursor(text, bv_);
        if (ret)
@@ -281,15 +280,15 @@ int BufferView::Pimpl::resizeCurrentBuffer()
        LyXParagraph * selendpar = 0;
        UpdatableInset * the_locking_inset = 0;
        
-       int pos = 0;
-       int selstartpos = 0;
-       int selendpos = 0;
-       int selection = 0;
-       int mark_set = 0;
+       LyXParagraph::size_type pos = 0;
+       LyXParagraph::size_type selstartpos = 0;
+       LyXParagraph::size_type selendpos = 0;
+       bool selection = false;
+       bool mark_set  = false;
 
        ProhibitInput(bv_);
 
-       owner_->getMiniBuffer()->Set(_("Formatting document..."));   
+       owner_->message(_("Formatting document..."));
 
        if (bv_->text) {
                par = bv_->text->cursor.par();
@@ -346,11 +345,12 @@ int BufferView::Pimpl::resizeCurrentBuffer()
        // this will scroll the screen such that the cursor becomes visible
        updateScrollbar();
        redraw();
-       owner_->getMiniBuffer()->Init();
+
        bv_->setState();
        AllowInput(bv_);
 
-       owner_->getDialogs()->hideSplash();
+       /// get rid of the splash screen if it's not gone already
+       owner_->getDialogs()->destroySplash();
  
        return 0;
 }
@@ -360,8 +360,6 @@ void BufferView::Pimpl::updateScreen()
 {
        // Regenerate the screen.
        screen_.reset(new LyXScreen(workarea_));
-       //delete screen_;
-       //screen_ = new LyXScreen(workarea_);
 }
 
 
@@ -635,7 +633,7 @@ void BufferView::Pimpl::workAreaButtonPress(int xpos, int ypos,
                UpdatableInset * inset = static_cast<UpdatableInset *>(inset_hit);
                selection_possible = false;
                owner_->updateLayoutChoice();
-               owner_->getMiniBuffer()->Set(inset->EditMessage());
+               owner_->message(inset->EditMessage());
                inset->InsetButtonPress(bv_, xpos, ypos, button);
                inset->Edit(bv_, xpos, ypos, button);
                return;
@@ -767,7 +765,8 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y,
        
        selection_possible = false;
        
-       if (button >= 2) return;
+       if (button == 2)
+               return;
 
        bv_->setState();
        owner_->showState();
@@ -796,7 +795,8 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y,
                        bv_->text->SetCursorParUndo(bv_->buffer());
                }
 
-               owner_->getMiniBuffer()->Set(inset_hit->EditMessage());
+               owner_->message(inset_hit->EditMessage());
+
                if (inset_hit->Editable()==Inset::HIGHLY_EDITABLE) {
                        // Highly editable inset, like math
                        UpdatableInset *inset = (UpdatableInset *)inset_hit;
@@ -813,75 +813,19 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y,
                bool hit = false;
                char c = ' ';
                if (bv_->text->cursor.pos() <
-                   bv_->text->cursor.par()->Last()) {
+                   bv_->text->cursor.par()->size()) {
                        c = bv_->text->cursor.par()->
                                GetChar(bv_->text->cursor.pos());
                }
-#ifndef NEW_INSETS
-              if(!bv_->text->selection)
-               if (c == LyXParagraph::META_FOOTNOTE
-                   || c == LyXParagraph::META_MARGIN
-                   || c == LyXParagraph::META_FIG
-                   || c == LyXParagraph::META_TAB
-                   || c == LyXParagraph::META_WIDE_FIG
-                   || c == LyXParagraph::META_WIDE_TAB
-                    || c == LyXParagraph::META_ALGORITHM){
-                       hit = true;
-               } else
-#endif
                        if (bv_->text->cursor.pos() - 1 >= 0) {
                        c = bv_->text->cursor.par()->
                                GetChar(bv_->text->cursor.pos() - 1);
-#ifndef NEW_INSETS
-                       if (c == LyXParagraph::META_FOOTNOTE
-                           || c == LyXParagraph::META_MARGIN
-                           || c == LyXParagraph::META_FIG
-                           || c == LyXParagraph::META_TAB
-                           || c == LyXParagraph::META_WIDE_FIG 
-                           || c == LyXParagraph::META_WIDE_TAB
-                           || c == LyXParagraph::META_ALGORITHM){
-                               // We are one step too far to the right
-                               bv_->text->CursorLeft(bv_);
-                               hit = true;
-                       }
-#endif
                }
                if (hit == true) {
-#ifndef NEW_INSETS
-                       bv_->toggleFloat();
-#endif
-                       selection_possible = false;
-                       return;
-               }
-       }
-
-#ifndef NEW_INSETS
-       // Do we want to close a float? (click on the float-label)
-       if (bv_->text->cursor.row()->par()->footnoteflag == 
-           LyXParagraph::OPEN_FOOTNOTE
-           && bv_->text->cursor.row()->previous() &&
-           bv_->text->cursor.row()->previous()->par()->
-           footnoteflag != LyXParagraph::OPEN_FOOTNOTE){
-               LyXFont font(LyXFont::ALL_SANE);
-               font.setSize(LyXFont::SIZE_FOOTNOTE);
-
-               int box_x = 20; // LYX_PAPER_MARGIN;
-               box_x += lyxfont::width(" wide-tab ", font);
-
-               unsigned int screen_first = bv_->text->first;
-
-               if (x < box_x
-                   && y + screen_first > bv_->text->cursor.y() -
-                   bv_->text->cursor.row()->baseline()
-                   && y + screen_first < bv_->text->cursor.y() -
-                   bv_->text->cursor.row()->baseline()
-                   + lyxfont::maxAscent(font) * 1.2 + lyxfont::maxDescent(font) * 1.2) {
-                       bv_->toggleFloat();
                        selection_possible = false;
                        return;
                }
        }
-#endif
 
        // Maybe we want to edit a bibitem ale970302
        if (bv_->text->cursor.par()->bibkey && x < 20 + 
@@ -910,8 +854,10 @@ Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y,
   
        LyXCursor cursor;
        text->SetCursorFromCoordinates(bv_, cursor, x, y_tmp);
+       text->SetCursor(bv_, cursor, cursor.par(),cursor.pos(),true);
 
-       if (cursor.pos() < cursor.par()->Last()
+
+       if (cursor.pos() < cursor.par()->size()
            && cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET
            && cursor.par()->GetInset(cursor.pos())
            && cursor.par()->GetInset(cursor.pos())->Editable()) {
@@ -920,16 +866,16 @@ Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y,
                Inset * tmpinset = cursor.par()->GetInset(cursor.pos());
                LyXFont font = text->GetFont(bv_->buffer(),
                                                  cursor.par(), cursor.pos());
-               int width = tmpinset->width(bv_, font);
-               int inset_x = font.isVisibleRightToLeft()
+               int const width = tmpinset->width(bv_, font);
+               int const inset_x = font.isVisibleRightToLeft()
                        ? cursor.x() - width : cursor.x();
-               int start_x = inset_x + tmpinset->scroll();
-               int end_x = inset_x + width;
+               int const start_x = inset_x + tmpinset->scroll();
+               int const end_x = inset_x + width;
 
                if (x > start_x && x < end_x
                    && y_tmp > cursor.y() - tmpinset->ascent(bv_, font)
                    && y_tmp < cursor.y() + tmpinset->descent(bv_, font)) {
-                       text->SetCursor(bv_, cursor.par(),cursor.pos(),true);
+                       text->SetCursor(bv_, cursor.par(),cursor.pos(), true);
                        x = x - start_x;
                        // The origin of an inset is on the baseline
                        y = y_tmp - (text->cursor.y()); 
@@ -944,11 +890,11 @@ Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y,
                Inset * tmpinset = cursor.par()->GetInset(cursor.pos()-1);
                LyXFont font = text->GetFont(bv_->buffer(), cursor.par(),
                                                  cursor.pos()-1);
-               int width = tmpinset->width(bv_, font);
-               int inset_x = font.isVisibleRightToLeft()
+               int const width = tmpinset->width(bv_, font);
+               int const inset_x = font.isVisibleRightToLeft()
                        ? cursor.x() : cursor.x() - width;
-               int start_x = inset_x + tmpinset->scroll();
-               int end_x = inset_x + width;
+               int const start_x = inset_x + tmpinset->scroll();
+               int const end_x = inset_x + width;
 
                if (x > start_x && x < end_x
                    && y_tmp > cursor.y() - tmpinset->ascent(bv_, font)
@@ -956,7 +902,8 @@ Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y,
 #if 0
                        if (move_cursor && (tmpinset != bv_->theLockingInset()))
 #endif
-                               text->SetCursor(bv_, cursor.par(),cursor.pos()-1,true);
+                               text->SetCursor(bv_, cursor.par(),
+                                               cursor.pos() - 1, true);
                        x = x - start_x;
                        // The origin of an inset is on the baseline
                        y = y_tmp - (text->cursor.y()); 
@@ -972,8 +919,8 @@ void BufferView::Pimpl::workAreaExpose()
        static int work_area_width = 0;
        static unsigned int work_area_height = 0;
 
-       bool widthChange = workarea_.workWidth() != work_area_width;
-       bool heightChange = workarea_.height() != work_area_height;
+       bool const widthChange = workarea_.workWidth() != work_area_width;
+       bool const heightChange = workarea_.height() != work_area_height;
 
        // update from work area
        work_area_width = workarea_.workWidth();
@@ -1002,9 +949,6 @@ void BufferView::Pimpl::workAreaExpose()
 
                        // The main window size has changed, repaint most stuff
                        redraw();
-                       // ...including the minibuffer
-                       owner_->getMiniBuffer()->Init();
-
                } else if (screen_.get())
                    screen_->Redraw(bv_->text, bv_);
        } else {
@@ -1083,12 +1027,7 @@ void BufferView::Pimpl::update(LyXText * text, BufferView::UpdateCodes f)
        }
 
        if ((f & CHANGE)) {
-               if (buffer_->isLyxClean()) {
-                       buffer_->markDirty();
-                       owner_->getMiniBuffer()->setTimer(4);
-               } else {
-                       buffer_->markDirty();
-               }
+               buffer_->markDirty();
        }
 }
 
@@ -1199,8 +1138,10 @@ void BufferView::Pimpl::savePosition(unsigned int i)
        saved_positions[i] = Position(buffer_->fileName(),
                                      bv_->text->cursor.par()->id(),
                                      bv_->text->cursor.pos());
-       if (i > 0)
-               owner_->getMiniBuffer()->Set(_("Saved bookmark ") + tostr(i));
+       if (i > 0) {
+               string const str = _("Saved bookmark") + ' ' + tostr(i);
+               owner_->message(str);
+       }
 }
 
 
@@ -1209,7 +1150,7 @@ void BufferView::Pimpl::restorePosition(unsigned int i)
        if (i >= saved_positions_num)
                return;
 
-       string fname = saved_positions[i].filename;
+       string const fname = saved_positions[i].filename;
 
        beforeChange(bv_->text);
 
@@ -1225,10 +1166,13 @@ void BufferView::Pimpl::restorePosition(unsigned int i)
                return;
 
        bv_->text->SetCursor(bv_, par,
-                            min(par->Last(), saved_positions[i].par_pos));
+                            min(par->size(), saved_positions[i].par_pos));
+
        update(bv_->text, BufferView::SELECT|BufferView::FITCUR);
-       if (i > 0)
-               owner_->getMiniBuffer()->Set(_("Moved to bookmark ") + tostr(i));
+       if (i > 0) {
+               string const str = _("Moved to bookmark") + ' ' + tostr(i);
+               owner_->message(str);
+       }
 }
 
 
@@ -1249,10 +1193,10 @@ void BufferView::Pimpl::setState()
        LyXText * text = bv_->getLyXText();
        if (text->real_current_font.isRightToLeft() &&
            text->real_current_font.latex() != LyXFont::ON) {
-               if (owner_->getIntl()->primarykeymap)
+               if (owner_->getIntl()->keymap == Intl::PRIMARY)
                        owner_->getIntl()->KeyMapSec();
        } else {
-               if (!owner_->getIntl()->primarykeymap)
+               if (owner_->getIntl()->keymap == Intl::SECONDARY)
                        owner_->getIntl()->KeyMapPrim();
        }
 }
@@ -1411,7 +1355,7 @@ Inset * BufferView::Pimpl::getInsetByCode(Inset::Code code)
                find_if(Buffer::inset_iterator(
                        cursor.par(), cursor.pos()),
                        buffer_->inset_iterator_end(),
-                       compare_memfun(&Inset::LyxCode, code)
+                       lyx::compare_memfun(&Inset::LyxCode, code)
                        );
        return it != buffer_->inset_iterator_end() ? (*it) : 0;
 }
@@ -1446,7 +1390,7 @@ void BufferView::Pimpl::MenuInsertLyXFile(string const & filen)
 
                // check selected filename
                if (filename.empty()) {
-                       owner_->getMiniBuffer()->Set(_("Canceled."));
+                       owner_->message(_("Canceled."));
                        return;
                }
        }
@@ -1458,16 +1402,18 @@ void BufferView::Pimpl::MenuInsertLyXFile(string const & filen)
                filename += ".lyx";
 
        // Inserts document
-       owner_->getMiniBuffer()->Set(_("Inserting document"),
-                                    MakeDisplayPath(filename), "...");
+       string const s1 = _("Inserting document") + ' '
+               + MakeDisplayPath(filename) + " ...";
+       owner_->message(s1);
        bool const res = bv_->insertLyXFile(filename);
        if (res) {
-               owner_->getMiniBuffer()->Set(_("Document"),
-                                            MakeDisplayPath(filename),
-                                            _("inserted."));
+               string const str = _("Document") + ' '
+                       + MakeDisplayPath(filename) + ' ' + _("inserted.");
+               owner_->message(str);
        } else {
-               owner_->getMiniBuffer()->Set(_("Could not insert document"),
-                                            MakeDisplayPath(filename));
+               string const str = _("Could not insert document") + ' '
+                       + MakeDisplayPath(filename);
+               owner_->message(str);
        }
 }
 
@@ -1484,23 +1430,11 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                break;
 
        case LFUN_TOC_INSERT:
-       case LFUN_LOA_INSERT:
-       case LFUN_LOF_INSERT:
-       case LFUN_LOT_INSERT:
        {
                InsetCommandParams p;
-               
-               if (action == LFUN_TOC_INSERT )
-                       p.setCmdName( "tableofcontents" );
-               else if (action == LFUN_LOA_INSERT )
-                       p.setCmdName( "listofalgorithms" );
-               else if (action == LFUN_LOF_INSERT )
-                       p.setCmdName( "listoffigures" );
-               else
-                       p.setCmdName( "listoftables" );
-
-               Inset * inset = new InsetTOC( p );
-               if (!bv_->insertInset( inset, "Standard", true ) )
+               p.setCmdName("tableofcontents");
+               Inset * inset = new InsetTOC(p);
+               if (!bv_->insertInset(inset, "Standard", true))
                        delete inset;
                break;
        }
@@ -1750,7 +1684,16 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                        bv_->updateInset(TEXT(bv_)->inset_owner, true);
                update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
                break;
+
+       case LFUN_TRANSPOSE_CHARS:
+               update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR);
+               TEXT(bv_)->TransposeChars(*bv_);
+               if (TEXT(bv_)->inset_owner)
+                       bv_->updateInset(TEXT(bv_)->inset_owner, true);
+               update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
+               break;
                
+                                         
        case LFUN_INSERT_LABEL:
                MenuInsertLabel(bv_, argument);
                break;
@@ -1810,7 +1753,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR);
                if (is_rtl)
                        TEXT(bv_)->CursorLeft(bv_, false);
-               if (TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->Last()
+               if (TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->size()
                    && TEXT(bv_)->cursor.par()->GetChar(TEXT(bv_)->cursor.pos())
                    == LyXParagraph::META_INSET
                    && TEXT(bv_)->cursor.par()->GetInset(TEXT(bv_)->cursor.pos())
@@ -1819,10 +1762,10 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                        owner_->getLyXFunc()->setMessage(tmpinset->EditMessage());
                        int y = 0;
                        if (is_rtl) {
-                               LyXFont font = 
+                               LyXFont const font = 
                                        TEXT(bv_)->GetFont(buffer_,
-                                                             TEXT(bv_)->cursor.par(),
-                                                             TEXT(bv_)->cursor.pos()); 
+                                                          TEXT(bv_)->cursor.par(),
+                                                          TEXT(bv_)->cursor.pos());    
                                y = tmpinset->descent(bv_,font);
                        }
                        tmpinset->Edit(bv_, 0, y, 0);
@@ -1848,7 +1791,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                if (!is_rtl)
                        TEXT(bv_)->CursorLeft(bv_, false);
                if ((is_rtl || cur != TEXT(bv_)->cursor) && // only if really moved!
-                   TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->Last() &&
+                   TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->size() &&
                    (TEXT(bv_)->cursor.par()->GetChar(TEXT(bv_)->cursor.pos()) ==
                     LyXParagraph::META_INSET) &&
                    TEXT(bv_)->cursor.par()->GetInset(TEXT(bv_)->cursor.pos()) &&
@@ -2166,13 +2109,16 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                
        case LFUN_PROTECTEDSPACE:
        {
-               LyXLayout const & style =
-                       textclasslist.Style(buffer_->params.textclass,
-                                           TEXT(bv_)->cursor.par()->GetLayout());
+               LyXLayout const & style = textclasslist
+                       .Style(buffer_->params.textclass,
+                              TEXT(bv_)->cursor.par()->GetLayout());
 
                if (style.free_spacing) {
                        TEXT(bv_)->InsertChar(bv_, ' ');
-                       update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
+                       update(TEXT(bv_),
+                              BufferView::SELECT
+                              | BufferView::FITCUR
+                              | BufferView::CHANGE);
                } else {
                        bv_->protectedBlank(TEXT(bv_));
                }
@@ -2183,12 +2129,14 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
        case LFUN_SETMARK:
                if (TEXT(bv_)->mark_set) {
                        beforeChange(TEXT(bv_));
-                       update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR);
+                       update(TEXT(bv_),
+                              BufferView::SELECT|BufferView::FITCUR);
                        owner_->getLyXFunc()->setMessage(N_("Mark removed"));
                } else {
                        beforeChange(TEXT(bv_));
                        TEXT(bv_)->mark_set = 1;
-                       update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR);
+                       update(TEXT(bv_),
+                              BufferView::SELECT|BufferView::FITCUR);
                        owner_->getLyXFunc()->setMessage(N_("Mark set"));
                }
                TEXT(bv_)->sel_cursor = TEXT(bv_)->cursor;
@@ -2200,7 +2148,9 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                        TEXT(bv_)->sel_cursor = 
                                TEXT(bv_)->cursor;
                        update(TEXT(bv_),
-                              BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
+                              BufferView::SELECT
+                              | BufferView::FITCUR
+                              | BufferView::CHANGE);
                        // It is possible to make it a lot faster still
                        // just comment out the line below...
                        showCursor();
@@ -2219,7 +2169,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                LyXCursor cursor = TEXT(bv_)->cursor;
 
                if (!TEXT(bv_)->selection) {
-                       if (cursor.pos() == cursor.par()->Last()) {
+                       if (cursor.pos() == cursor.par()->size()) {
                                TEXT(bv_)->CursorRight(bv_);
                                cursor = TEXT(bv_)->cursor;
                                if (cursor.pos() == 0
@@ -2718,7 +2668,12 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
               
        case LFUN_INSERT_MATH:
        {
-               math_insert_symbol(bv_, argument);
+               if (!available())
+                       break;
+               InsetFormula * f = new InsetFormula(true);
+               bv_->open_new_inset(f);
+               f->LocalDispatch(bv_, LFUN_INSERT_MATH, argument);
        }
        break;
        
@@ -2891,21 +2846,34 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                if (!bv_->insertInset(inset, "Standard", true))
                        delete inset;
        }
+                
        break;
 
        case LFUN_CHILD_INSERT:
        {
-               InsetCommandParams p;
-               p.setFromString(argument);
+               InsetInclude::Params p;
+               p.cparams.setFromString(argument);
+               p.masterFilename_ = buffer_->fileName();
 
-               InsetInclude * inset = new InsetInclude(p, *buffer_);
+               InsetInclude * inset = new InsetInclude(p);
                if (!bv_->insertInset(inset))
                        delete inset;
-               else
+               else {
                        bv_->updateInset(inset, true);
+                       bv_->owner()->getDialogs()->showInclude(inset);
+               }
        }
        break; 
 
+       case LFUN_FLOAT_LIST:
+       {
+               // We should check the argument for validity. (Lgb)
+               Inset * inset = new InsetFloatList(argument);
+               if (!bv_->insertInset(inset, "Standard", true))
+                       delete inset;
+       }
+       break;
+       
        case LFUN_INSERT_NOTE:
                bv_->insertNote();
                break;
@@ -2987,8 +2955,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                        for (string::size_type i = 0;
                             i < argument.length(); ++i) {
                                if (greek_kb_flag) {
-                                       if (!math_insert_greek(bv_,
-                                                              argument[i]))
+                                       if (!math_insert_greek(bv_, argument[i]))
                                                owner_->getIntl()->getTrans().TranslateAndInsert(argument[i], TEXT(bv_));
                                } else
                                        owner_->getIntl()->getTrans().TranslateAndInsert(argument[i], TEXT(bv_));
@@ -3006,7 +2973,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                } else {
                        // if we don't have an argument there was something
                        // strange going on so we just tell this to someone!
-                       owner_->getLyXFunc()->setErrorMessage(N_("No argument givven"));
+                       owner_->getLyXFunc()->setErrorMessage(N_("No argument given"));
                }
                break;
        }