]> git.lyx.org Git - lyx.git/blobdiff - src/lyx_cb.C
more keyboard/keysym changes
[lyx.git] / src / lyx_cb.C
index 975c51f4973557a381f13b2fad601a90ea2b62ad..a6f8f60d18a07e90f0d132621b2723a24f6540e2 100644 (file)
 #include <iostream>
 
 #include "LString.h"
-#include "support/lstrings.h"
-#include "lyx_main.h"
 #include FORMS_H_LOCATION
 #include "lyx.h"
 #include "layout_forms.h"
 #include "bullet_forms.h"
-#include "print_form.h"
 #include "form1.h"
-#include "spellchecker.h"
-#include "version.h"
+#include "lyx_main.h"
 #include "lyx_cb.h"
-#include "credits.h"
 #include "insets/insetref.h"
-#include "insets/insetquotes.h"
 #include "insets/insetlabel.h"
 #include "insets/figinset.h"
 #include "lyxfunc.h"
-#include "latexoptions.h"
-#include "lyxfont.h"
 #include "minibuffer.h"
 #include "combox.h"
 #include "bufferlist.h"
-#include "support/filetools.h"
-#include "support/path.h"
 #include "filedlg.h"
 #include "lyx_gui_misc.h"
 #include "LyXView.h"
+#include "BufferView.h"
 #include "lastfiles.h"
+#include "bufferview_funcs.h"
 #include "support/FileInfo.h"
-#include "debug.h"
 #include "support/syscall.h"
-#include "support/lyxlib.h"
+#include "support/filetools.h"
+#include "support/path.h"
 #include "lyxserver.h"
-#include "FontLoader.h"
 #include "lyxrc.h"
 #include "lyxtext.h"
-#include "gettext.h"
-#include "layout.h"
-#include "language.h"
+#include "CutAndPaste.h"
 
 using std::ifstream;
 using std::copy;
@@ -63,8 +52,12 @@ using std::cout;
 using std::ios;
 using std::istream_iterator;
 using std::pair;
+using std::vector;
+using std::sort;
+using std::equal;
 
 extern Combox * combo_language;
+extern Combox * combo_language2;
 extern BufferList bufferlist;
 extern void show_symbols_form();
 extern FD_form_title * fd_form_title;
@@ -74,12 +67,7 @@ extern FD_form_document * fd_form_document;
 extern FD_form_quotes * fd_form_quotes;
 extern FD_form_preamble * fd_form_preamble;
 extern FD_form_table * fd_form_table;
-extern FD_form_print * fd_form_print;
 extern FD_form_figure * fd_form_figure;
-extern FD_form_screen * fd_form_screen;
-extern FD_form_toc * fd_form_toc;
-extern FD_form_ref * fd_form_ref;
-extern FD_LaTeXOptions * fd_latex_options;
 extern FD_form_bullet * fd_form_bullet;
 
 extern BufferView * current_view; // called too many times in this file...
@@ -99,15 +87,6 @@ char ascii_type; /* for selection notify callbacks */
 
 bool scrolling = false;
 
-char updatetimer = 0;
-
-/* whether the work area should get callbacks */ 
-bool input_prohibited = false;
-
-/* the selection possible is needed, that only motion events are 
-* used, where the bottom press event was on the drawing area too */
-bool selection_possible = false;
-
 // This is used to make the dreaded font toggle problem hopefully go
 // away. Definitely not the best solution, but I think it sorta works.
 bool toggleall = true;
@@ -175,8 +154,8 @@ void ToggleLockedInsetCursor(long x, long y, int asc, int desc);
 
 int RunLinuxDoc(BufferView *, int, string const &);
 int RunDocBook(int, string const &);
-void MenuWrite(Buffer * buf);
-void MenuWriteAs(Buffer * buffer);
+bool MenuWrite(Buffer * buf);
+bool MenuWriteAs(Buffer * buffer);
 void MenuReload(Buffer * buf);
 void MenuLayoutSave();
 
@@ -195,96 +174,6 @@ void ShowMessage(Buffer * buf,
        }
 }
 
-// How should this actually work? Should it prohibit input in all BufferViews,
-// or just in the current one? If "just the current one", then it should be
-// placed in BufferView. If "all BufferViews" then LyXGUI (I think) should
-// run "ProhibitInput" on all LyXViews which will run prohibitInput on all
-// BufferViews. Or is it perhaps just the (input in) BufferViews in the
-// current LyxView that should be prohibited (Lgb) (This applies to
-// "AllowInput" as well.)
-void ProhibitInput()
-{
-       input_prohibited = true;
-       current_view->hideCursor();
-
-       static Cursor cursor;
-       static bool cursor_undefined = true;
-   
-       if (cursor_undefined){
-               cursor = XCreateFontCursor(fl_display, XC_watch);
-               XFlush(fl_display);
-               cursor_undefined = false;
-       }
-   
-       /* set the cursor to the watch for all forms and the canvas */ 
-       XDefineCursor(fl_display, current_view->owner()->getForm()->window, 
-                     cursor);
-       if (fd_form_paragraph->form_paragraph->visible)
-               XDefineCursor(fl_display,
-                             fd_form_paragraph->form_paragraph->window,
-                             cursor);
-       if (fd_form_character->form_character->visible)
-               XDefineCursor(fl_display,
-                             fd_form_character->form_character->window,
-                             cursor);
-
-       XFlush(fl_display);
-       fl_deactivate_all_forms();
-}
-
-
-// Should find a way to move this into BufferView.C
-void SetXtermCursor(Window win)
-{
-       static Cursor cursor;
-       static bool cursor_undefined = true;
-       if (cursor_undefined){
-               cursor = XCreateFontCursor(fl_display, XC_xterm);
-               XFlush(fl_display);
-               cursor_undefined = false;
-       }
-       XDefineCursor(fl_display, win, cursor);
-       XFlush(fl_display);
-}
-
-
-void AllowInput()
-{
-       input_prohibited = false;
-
-       /* reset the cursor from the watch for all forms and the canvas */
-   
-       XUndefineCursor(fl_display, current_view->owner()->getForm()->window);
-       if (fd_form_paragraph->form_paragraph->visible)
-               XUndefineCursor(fl_display,
-                               fd_form_paragraph->form_paragraph->window);
-       if (fd_form_character->form_character->visible)
-               XUndefineCursor(fl_display,
-                               fd_form_character->form_character->window);
-
-       // What to do about this? (Lgb)
-       if (current_view->belowMouse())
-               SetXtermCursor(current_view->owner()->getForm()->window);
-
-       XFlush(fl_display);
-       fl_activate_all_forms();
-}
-
-
-void FreeUpdateTimer()
-{
-       /* a real free timer would be better but I don't know 
-        * how to do this with xforms */
-       updatetimer = 0;
-}
-
-
-void SetUpdateTimer(float time)
-{
-       fl_set_timer(current_view->owner()->getMainForm()->timer_update, time);
-       updatetimer = 1;
-}
-
 
 //
 // Menu callbacks
@@ -295,7 +184,7 @@ void SetUpdateTimer(float time)
 //
 
 // should be moved to lyxfunc.C
-void MenuWrite(Buffer * buffer)
+bool MenuWrite(Buffer * buffer)
 {
        XFlush(fl_display);
        if (!buffer->save()) {
@@ -304,17 +193,19 @@ void MenuWrite(Buffer * buffer)
                if (AskQuestion(_("Save failed. Rename and try again?"),
                                MakeDisplayPath(s, 50),
                                _("(If not, document is not saved.)"))) {
-                       MenuWriteAs(buffer);
+                       return MenuWriteAs(buffer);
                }
+               return false;
        } else {
                lastfiles->newFile(buffer->fileName());
        }
+       return true;
 }
 
 
 // should be moved to BufferView.C
 // Half of this func should be in LyXView, the rest in BufferView.
-void MenuWriteAs(Buffer * buffer)
+bool MenuWriteAs(Buffer * buffer)
 {
        // Why do we require BufferView::text to be able to write a
        // document? I see no point in that. (Lgb)
@@ -324,21 +215,28 @@ void MenuWriteAs(Buffer * buffer)
        string oldname = fname;
        LyXFileDlg fileDlg;
 
-       ProhibitInput();
+       ProhibitInput(current_view);
        fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
        fileDlg.SetButton(1, _("Templates"), lyxrc.template_path);
 
        if (!IsLyXFilename(fname))
                fname += ".lyx";
 
-       fname = fileDlg.Select(_("Enter Filename to Save Document as"), 
-                              OnlyPath(fname),
-                              "*.lyx", 
-                              OnlyFilename(fname));
-       AllowInput();
+       if (buffer->isUnnamed()) {
+               fname = fileDlg.Select(_("Enter Filename to Save Document as"), 
+                                      "",
+                                      "*.lyx", 
+                                      "");
+       } else {
+               fname = fileDlg.Select(_("Enter Filename to Save Document as"), 
+                                      OnlyPath(fname),
+                                      "*.lyx", 
+                                      OnlyFilename(fname));
+       }
+       AllowInput(current_view);
 
        if (fname.empty()) {
-               return;
+               return false;
        }
        // Make sure the absolute filename ends with appropriate suffix
        string s = MakeAbsPath(fname);
@@ -350,7 +248,7 @@ void MenuWriteAs(Buffer * buffer)
                if (!AskQuestion(_("Same name as document already has:"),
                                 MakeDisplayPath(s, 50),
                                 _("Save anyway?")))
-                       return;
+                       return false;
                // Falls through to name change and save
        } 
        // No, but do we have another file with this name open?
@@ -368,24 +266,36 @@ void MenuWriteAs(Buffer * buffer)
                                ShowMessage(buffer, _("Document renamed to '"),
                                                MakeDisplayPath(s), _("', but not saved..."));
                        }
-               return;
+               return false;
        } // Check whether the file exists
        else {
                FileInfo myfile(s);
                if (myfile.isOK() && !AskQuestion(_("Document already exists:"), 
                                                  MakeDisplayPath(s, 50),
                                                  _("Replace file?")))
-                       return;
+                       return false;
        }
 
        // Ok, change the name of the buffer
        buffer->fileName(s);
        buffer->markDirty();
+       bool unnamed = buffer->isUnnamed();
+       buffer->setUnnamed(false);
        // And save
        // Small bug: If the save fails, we have irreversible changed the name
        // of the document.
-       MenuWrite(buffer);
-}    
+       // Hope this is fixed this way! (Jug)
+       if (!MenuWrite(buffer)) {
+           buffer->fileName(oldname);
+           buffer->setUnnamed(unnamed);
+           ShowMessage(buffer, _("Document could not be saved!"),
+                       _("Holding the old name."), MakeDisplayPath(oldname));
+           return false;
+       }
+       // now remove the oldname autosave file if existant!
+       removeAutosaveFile(oldname);
+       return true;
+}
 
 
 int MenuRunLaTeX(Buffer * buffer)
@@ -489,11 +399,11 @@ int MakeLaTeXOutput(Buffer * buffer)
        if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
                path = buffer->tmppath;
        }
-       if (!buffer->isDviClean()) {
-               Path p(path);
-               ret = MenuRunLaTeX(buffer);
-       }
-       return ret;
+               
+    Path p(path);
+       ret = MenuRunLaTeX(buffer);
+       
+    return ret;
 }
 
 
@@ -515,8 +425,7 @@ bool RunScript(Buffer * buffer, bool wait,
                return false;
        /* get DVI-Filename */
        if (name.empty())
-               name = ChangeExtension(buffer->getLatexName(),
-                                      ".dvi", true);
+               name = ChangeExtension(buffer->getLatexName(), ".dvi");
 
        path = OnlyPath(name);
        if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
@@ -565,9 +474,7 @@ bool RunScript(Buffer * buffer, bool wait,
                // the return code of the command. This means that all
                // the code I added in PrintApplyCB is currently
                // useless...
-#ifdef WITH_WARNINGS
-#warning What should we do here?
-#endif         
+               // CHECK What should we do here?
                ShowMessage(buffer, _("Executing command:"), cmd);
                result = one.startscript(Systemcalls::System, cmd);
        } else {
@@ -586,16 +493,16 @@ bool CreatePostscript(Buffer * buffer, bool wait = false)
        //if (!bv->text)
        //      return false;
 
-       ProhibitInput();
+       ProhibitInput(current_view);
 
        // Generate dvi file
         if (MakeLaTeXOutput(buffer) > 0) {
-               AllowInput();
+               AllowInput(current_view);
                return false;
         }
        // Generate postscript file
-       string psname = ChangeExtension (buffer->fileName(),
-                                        ".ps_tmp", true);
+       string psname = OnlyFilename(ChangeExtension (buffer->fileName(),
+                                        ".ps_tmp"));
 
        string paper;
 
@@ -662,7 +569,7 @@ bool CreatePostscript(Buffer * buffer, bool wait = false)
         }
         Path p(path);
        bool ret = RunScript(buffer, wait, command);
-       AllowInput();
+       AllowInput(current_view);
        return ret;
 }
 
@@ -681,9 +588,9 @@ bool PreviewPostscript(Buffer * buffer)
        }
 
        // Start postscript viewer
-       ProhibitInput();
-       string ps = ChangeExtension (buffer->fileName(),
-                                    ".ps_tmp", true);
+       ProhibitInput(current_view);
+       string ps = OnlyFilename(ChangeExtension (buffer->fileName(),
+                                    ".ps_tmp"));
        // push directorypath, if necessary 
         string path = OnlyPath(buffer->fileName());
         if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)){
@@ -691,7 +598,7 @@ bool PreviewPostscript(Buffer * buffer)
         }
         Path p(path);
        bool ret = RunScript(buffer, false, lyxrc.view_ps_command, ps);
-       AllowInput();
+       AllowInput(current_view);
        return ret;
 }
 
@@ -708,7 +615,8 @@ void MenuFax(Buffer * buffer)
        }
 
        // Send fax
-       string ps = ChangeExtension (buffer->fileName(), ".ps_tmp", true);
+       string ps = OnlyFilename(ChangeExtension (buffer->fileName(), 
+                                                 ".ps_tmp"));
        string path = OnlyPath (buffer->fileName());
        if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
                path = buffer->tmppath;
@@ -805,6 +713,7 @@ bool AskOverwrite(Buffer * buffer, string const & s)
        return true;
 }
 
+
 void MenuMakeLaTeX(Buffer * buffer)
 {
        // Why care about this?
@@ -826,7 +735,6 @@ void MenuMakeLaTeX(Buffer * buffer)
                        buffer->makeLaTeXFile(s, string(), true);
                ShowMessage(buffer, _("Nice LaTeX file saved as"), 
                            MakeDisplayPath(s));
-               buffer->markDviDirty();
        }
 }
 
@@ -842,8 +750,7 @@ void MenuMakeLinuxDoc(Buffer * buffer)
        }
        
        // Get LinuxDoc-Filename
-       string s = ChangeExtension(buffer->fileName(), 
-                                  ".sgml", false);
+       string s = ChangeExtension(buffer->fileName(), ".sgml");
 
        if (!AskOverwrite(buffer, s))
                return;
@@ -851,7 +758,7 @@ void MenuMakeLinuxDoc(Buffer * buffer)
        ShowMessage(buffer, _("Building LinuxDoc SGML file `"),
                                          MakeDisplayPath(s),"'...");
        
-       buffer->makeLinuxDocFile(s, 65);
+       buffer->makeLinuxDocFile(s, true);
        buffer->redraw();
        ShowMessage(buffer, _("LinuxDoc SGML file save as"),
                                          MakeDisplayPath(s)); 
@@ -870,8 +777,7 @@ void MenuMakeDocBook(Buffer * buffer)
        }
        
        // Get DocBook-Filename
-       string s = ChangeExtension(buffer->fileName(), 
-                                  ".sgml", false);
+       string s = ChangeExtension(buffer->fileName(), ".sgml");
 
        if (!AskOverwrite(buffer, s))
                return;
@@ -879,7 +785,7 @@ void MenuMakeDocBook(Buffer * buffer)
        ShowMessage(buffer, _("Building DocBook SGML file `"),
                                          MakeDisplayPath(s), "'..."); 
        
-       buffer->makeDocBookFile(s, 65);
+       buffer->makeDocBookFile(s, true);
        buffer->redraw();
        ShowMessage(buffer, _("DocBook SGML file save as"),
                                          MakeDisplayPath(s)); 
@@ -892,8 +798,7 @@ void MenuMakeAscii(Buffer * buffer)
        //if (!bv->text) return;
        
        /* get LaTeX-Filename */
-       string s = ChangeExtension (buffer->fileName(),
-                                   ".txt", false);
+       string s = ChangeExtension (buffer->fileName(), ".txt");
        
 
        if (!AskOverwrite(buffer, s))
@@ -905,27 +810,6 @@ void MenuMakeAscii(Buffer * buffer)
 }
 
 
-void MenuPrint(Buffer * buffer)
-{
-       // Who cares?
-       //if (!bv->text)
-       //      return;
-
-       string input_file = ChangeExtension(buffer->fileName(),
-                                           lyxrc.print_file_extension,
-                                           true);
-       fl_set_input(fd_form_print->input_file, input_file.c_str());
-       
-       if (fd_form_print->form_print->visible) {
-               fl_raise_form(fd_form_print->form_print);
-       } 
-       else {
-               fl_show_form(fd_form_print->form_print,
-                            FL_PLACE_MOUSE, FL_FULLBORDER,
-                            _("Print"));
-       }
-}
-
 void MenuMakeHTML(Buffer * buffer)
 {
        // First, create LaTeX file
@@ -937,7 +821,7 @@ void MenuMakeHTML(Buffer * buffer)
        // the tex file name has to be correct for
        // latex, but the html file name can be
        // anything.
-       string result = ChangeExtension(file, ".html", false);
+       string result = ChangeExtension(file, ".html");
        string infile = buffer->getLatexName(false);
        string tmp = lyxrc.html_command;
        tmp = subst(tmp, "$$FName", infile);
@@ -955,6 +839,7 @@ void MenuMakeHTML(Buffer * buffer)
 
 }
 
+
 void MenuMakeHTML_LinuxDoc(Buffer * buffer)
 {
        // First, create LinuxDoc file
@@ -963,8 +848,8 @@ void MenuMakeHTML_LinuxDoc(Buffer * buffer)
        // And now, run the converter
        string file = buffer->fileName();
 
-       string result = ChangeExtension(file, ".html", false);
-       string infile = ChangeExtension(file, ".sgml", false);
+       string result = ChangeExtension(file, ".html");
+       string infile = ChangeExtension(file, ".sgml");
        string tmp = lyxrc.linuxdoc_to_html_command;
        tmp = subst(tmp, "$$FName", infile);
        tmp = subst(tmp, "$$OutName", result);
@@ -988,8 +873,8 @@ void MenuMakeHTML_DocBook(Buffer * buffer)
 
        // And now, run the converter
        string file = buffer->fileName();
-       string result = ChangeExtension(file, ".html", false);
-       string infile = ChangeExtension(file, ".sgml", false);
+       string result = ChangeExtension(file, ".html");
+       string infile = ChangeExtension(file, ".sgml");
        string tmp = lyxrc.docbook_to_html_command;
        tmp = subst(tmp, "$$FName", infile);
        tmp = subst(tmp, "$$OutName", result);
@@ -1006,6 +891,7 @@ void MenuMakeHTML_DocBook(Buffer * buffer)
 
 }
 
+
 void MenuExport(Buffer * buffer, string const & extyp) 
 {
        // latex
@@ -1038,7 +924,9 @@ void MenuExport(Buffer * buffer, string const & extyp)
        // postscript
        else if (extyp == "postscript") {
                // Start Print-dialog. Not as good as dvi... Bernhard.
-               MenuPrint(buffer);
+       //should start lyxview->getDialogs()->showPrint();
+       // to get same as before
+       //              MenuPrint(buffer);
                // Since the MenuPrint is a pop-up, we can't use
                // the same trick as above. (Asger)
                // MISSING: Move of ps-file :-(
@@ -1053,15 +941,12 @@ void MenuExport(Buffer * buffer, string const & extyp)
        }
        // HTML
        else if (extyp == "html") {
-               MenuMakeHTML(buffer);
-       }
-       // HTML from linuxdoc
-       else if (extyp == "html-linuxdoc") {
-               MenuMakeHTML_LinuxDoc(buffer);
-       }
-       // HTML from docbook
-       else if (extyp == "html-docbook") {
-               MenuMakeHTML_DocBook(buffer);
+               if (buffer->isLinuxDoc())
+                       MenuMakeHTML_LinuxDoc(buffer);
+               else if (buffer->isDocBook())
+                       MenuMakeHTML_DocBook(buffer);
+               else
+                       MenuMakeHTML(buffer);
        }
        else {
                ShowMessage(buffer, _("Unknown export type: ") + extyp);
@@ -1095,26 +980,25 @@ void QuitLyX()
 
 
 
-void AutoSave()
+void AutoSave(BufferView * bv)
        // should probably be moved into BufferList (Lgb)
        // Perfect target for a thread...
 {
-       if (!current_view->available())
+       if (!bv->available())
                return;
 
-       if (current_view->buffer()->isBakClean()
-           || current_view->buffer()->isReadonly()) {
+       if (bv->buffer()->isBakClean() || bv->buffer()->isReadonly()) {
                // We don't save now, but we'll try again later
-               current_view->owner()->resetAutosaveTimer();
+               bv->owner()->resetAutosaveTimer();
                return;
        }
 
-       current_view->owner()->getMiniBuffer()->Set(_("Autosaving current document..."));
+       bv->owner()->getMiniBuffer()->Set(_("Autosaving current document..."));
        
        // create autosave filename
-       string fname =  OnlyPath(current_view->buffer()->fileName());
+       string fname =  OnlyPath(bv->buffer()->fileName());
        fname += "#";
-       fname += OnlyFilename(current_view->buffer()->fileName());
+       fname += OnlyFilename(bv->buffer()->fileName());
        fname += "#";
        
        // tmp_ret will be located (usually) in /tmp
@@ -1130,7 +1014,7 @@ void AutoSave()
                // anyway.
                bool failed = false;
                if (!tmp_ret.empty()) {
-                       current_view->buffer()->writeFile(tmp_ret, 1);
+                       bv->buffer()->writeFile(tmp_ret, 1);
                        // assume successful write of tmp_ret
                        if (rename(tmp_ret.c_str(), fname.c_str()) == -1) {
                                failed = true;
@@ -1145,11 +1029,11 @@ void AutoSave()
                
                if (failed) {
                        // failed to write/rename tmp_ret so try writing direct
-                       if (!current_view->buffer()->writeFile(fname, 1)) {
+                       if (!bv->buffer()->writeFile(fname, 1)) {
                                // It is dangerous to do this in the child,
                                // but safe in the parent, so...
                                if (pid == -1)
-                                       current_view->owner()->getMiniBuffer()->Set(_("Autosave Failed!"));
+                                       bv->owner()->getMiniBuffer()->Set(_("Autosave Failed!"));
                        }
                }
                if (pid == 0) { // we are the child so...
@@ -1157,8 +1041,8 @@ void AutoSave()
                }
        }
        
-       current_view->buffer()->markBakClean();
-       current_view->owner()->resetAutosaveTimer();
+       bv->buffer()->markBakClean();
+       bv->owner()->resetAutosaveTimer();
 }
 
 
@@ -1204,11 +1088,11 @@ void InsertAsciiFile(BufferView * bv, string const & f, bool asParagraph)
        if (!bv->available()) return;
      
        if (fname.empty()) {
-               ProhibitInput();
+               ProhibitInput(bv);
                fname = fileDlg.Select(_("File to Insert"), 
                                       bv->owner()->buffer()->filepath,
                                       "*");
-               AllowInput();
+               AllowInput(bv);
                if (fname.empty()) return;
        }
 
@@ -1230,47 +1114,36 @@ void InsertAsciiFile(BufferView * bv, string const & f, bool asParagraph)
        ifs.unsetf(ios::skipws);
        istream_iterator<char> ii(ifs);
        istream_iterator<char> end;
+#if !defined(USE_INCLUDED_STRING) && !defined(STD_STRING_IS_GOOD)
+       // We use this until the compilers get better...
+       vector<char> tmp;
+       copy(ii, end, back_inserter(tmp));
+       string tmpstr(tmp.begin(), tmp.end());
+#else
+       // This is what we want to use and what we will use once the
+       // compilers get good enough. 
        //string tmpstr(ii, end); // yet a reason for using std::string
        // alternate approach to get the file into a string:
        string tmpstr;
        copy(ii, end, back_inserter(tmpstr));
+#endif
        // insert the string
        current_view->hideCursor();
        
        // clear the selection
        bv->beforeChange();
        if (!asParagraph)
-               bv->text->InsertStringA(tmpstr);
+               bv->text->InsertStringA(bv, tmpstr);
        else
-               bv->text->InsertStringB(tmpstr);
-       bv->update(1);
-}
-
-
-void MenuShowTableOfContents()
-{
-       static int ow = -1, oh;
-
-       TocUpdateCB(0, 0);
-       if (fd_form_toc->form_toc->visible) {
-               fl_raise_form(fd_form_toc->form_toc);
-       } else {
-               fl_show_form(fd_form_toc->form_toc,
-                            FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
-                            _("Table Of Contents"));
-               if (ow < 0) {
-                       ow = fd_form_toc->form_toc->w;
-                       oh = fd_form_toc->form_toc->h;
-               }
-               fl_set_form_minsize(fd_form_toc->form_toc, ow, oh);
-       }
+               bv->text->InsertStringB(bv, tmpstr);
+       bv->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
 }
 
 
 void MenuInsertLabel(char const * arg)
 {
        string label = arg;
-       ProhibitInput();
+       ProhibitInput(current_view);
        if (label.empty()) {
                pair<bool, string>
                        result = askForText(_("Enter new label to insert:"));
@@ -1279,65 +1152,11 @@ void MenuInsertLabel(char const * arg)
                }
        }
        if (!label.empty()) {
-               InsetLabel * new_inset = new InsetLabel;
-               new_inset->setContents(label);
-               current_view->insertInset(new_inset);
-       }
-       AllowInput();
-}
-
-
-void MenuInsertRef()
-{
-       static int ow = -1, oh;
-
-       RefUpdateCB(0, 0);
-       if (fd_form_ref->form_ref->visible) {
-               fl_raise_form(fd_form_ref->form_ref);
-       } else {
-               fl_show_form(fd_form_ref->form_ref,
-                            FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
-                            _("Insert Reference"));
-               if (ow < 0) {
-                       ow = fd_form_ref->form_ref->w;
-                       oh = fd_form_ref->form_ref->h;
-               }
-               fl_set_form_minsize(fd_form_ref->form_ref, ow, oh);
+               InsetCommandParams p( "label", label );
+               InsetLabel * inset = new InsetLabel( p );
+               current_view->insertInset( inset );
        }
-}
-
-
-void MenuPasteSelection(char at)
-{
-       if (!current_view->available())
-               return;
-
-       ascii_type = at;
-  
-       Atom data_prop = XInternAtom(fl_display, 
-                                    "LyX_Primary",
-                                    false);
-       if (data_prop == None) 
-               return;
-       XConvertSelection(fl_display,
-                         XA_PRIMARY, XA_STRING, data_prop, 
-                         current_view->owner()->getForm()->window, 0);
-       XFlush(fl_display);
-}
-
-
-// candidate for move to BufferView
-void Foot(BufferView * bv)
-{
-       if (!bv->available()) 
-               return;
-       
-       bv->owner()->getMiniBuffer()
-               ->Set(_("Inserting Footnote..."));
-       bv->hideCursor();
-       bv->update(-2);
-       bv->text->InsertFootnoteEnvironment(LyXParagraph::FOOTNOTE);
-       bv->update(1);
+       AllowInput(current_view);
 }
 
 
@@ -1364,7 +1183,7 @@ int RunLinuxDoc(BufferView * bv, int flag, string const & filename)
        int errorcode = 0;
 
        /* generate a path-less extension name */
-       string name = ChangeExtension (filename, ".sgml", true);
+       string name = OnlyFilename(ChangeExtension (filename, ".sgml"));
        string path = OnlyPath (filename);
        if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
                path = bv->buffer()->tmppath;
@@ -1373,11 +1192,12 @@ int RunLinuxDoc(BufferView * bv, int flag, string const & filename)
        
        if (!bv->available())
                return 0;
-       bv->buffer()->makeLinuxDocFile(name, 0);
-#ifdef WITH_WARNINGS
-#warning remove this once we have a proper geometry class
-#endif
-       BufferParams::PAPER_SIZE ps = static_cast<BufferParams::PAPER_SIZE>(bv->buffer()->params.papersize);
+       bv->buffer()->makeLinuxDocFile(name, false);
+
+       // CHECK remove this once we have a proper geometry class
+
+       BufferParams::PAPER_SIZE ps =
+               static_cast<BufferParams::PAPER_SIZE>(bv->buffer()->params.papersize);
        switch (ps) {
        case BufferParams::PAPER_A4PAPER:
                add_flags = "-p a4";
@@ -1388,7 +1208,7 @@ int RunLinuxDoc(BufferView * bv, int flag, string const & filename)
        default: /* nothing to be done yet ;-) */     break; 
        }
        
-       ProhibitInput();
+       ProhibitInput(bv);
        
        Systemcalls one;
        switch (flag) {
@@ -1403,14 +1223,13 @@ int RunLinuxDoc(BufferView * bv, int flag, string const & filename)
                s2 = lyxrc.linuxdoc_to_latex_command + ' ' + add_flags + " -o dvi " + ' ' + name;
                if (one.startscript(Systemcalls::System, s2)) {
                        errorcode = 1;
-               } else
-                       bv->buffer()->markDviClean();
+               } 
                break;
        default: /* unknown output */
                break;
        }
        
-       AllowInput();
+       AllowInput(bv);
 
         bv->buffer()->redraw();
        return errorcode;
@@ -1424,7 +1243,7 @@ int RunLinuxDoc(BufferView * bv, int flag, string const & filename)
 int RunDocBook(int flag, string const & filename)
 {
        /* generate a path-less extension name */
-       string name = ChangeExtension (filename, ".sgml", true);
+       string name = OnlyFilename(ChangeExtension (filename, ".sgml"));
        string path = OnlyPath (filename);
        if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
                path = current_view->buffer()->tmppath;
@@ -1434,7 +1253,7 @@ int RunDocBook(int flag, string const & filename)
        if (!current_view->available())
                return 0;
        
-       current_view->buffer()->makeDocBookFile(name, 0);
+       current_view->buffer()->makeDocBookFile(name, false);
 
        // Shall this code go or should it stay? (Lgb)
        // This code is a placeholder for future implementation. (Jose')
@@ -1445,7 +1264,7 @@ int RunDocBook(int flag, string const & filename)
 //     case BufferParams::PAPER_USLETTER: add_flags = "-p letter"; break;
 //     default: /* nothing to be done yet ;-) */     break; 
 //     }
-       ProhibitInput();
+       ProhibitInput(current_view);
        
        int errorcode = 0;
        Systemcalls one;
@@ -1456,15 +1275,14 @@ int RunDocBook(int flag, string const & filename)
                string s2 = lyxrc.docbook_to_dvi_command + ' ' + name;
                if (one.startscript(Systemcalls::System, s2)) {
                        errorcode = 1;
-               } else
-                       current_view->buffer()->markDviClean();
+               }
        }
        break;
        default: /* unknown output */
                break;
        }
        
-       AllowInput();
+       AllowInput(current_view);
 
         current_view->buffer()->redraw();
        return errorcode;
@@ -1567,18 +1385,23 @@ bool UpdateLayoutParagraph()
        }
 
        Buffer * buf = current_view->buffer();
+       LyXText * text = 0;
+       if (current_view->the_locking_inset)
+           text = current_view->the_locking_inset->getLyXText(current_view);
+       if (!text)
+           text = current_view->text;
 
        fl_set_input(fd_form_paragraph->input_labelwidth,
-                    current_view->text->cursor.par->GetLabelWidthString().c_str());
+                    text->cursor.par()->GetLabelWidthString().c_str());
        fl_set_button(fd_form_paragraph->radio_align_right, 0);
        fl_set_button(fd_form_paragraph->radio_align_left, 0);
        fl_set_button(fd_form_paragraph->radio_align_center, 0);
        fl_set_button(fd_form_paragraph->radio_align_block, 0);
 
-       int align = current_view->text->cursor.par->GetAlign();
+       int align = text->cursor.par()->GetAlign();
        if (align == LYX_ALIGN_LAYOUT)
                align = textclasslist.Style(buf->params.textclass,
-                                           current_view->text->cursor.par->GetLayout()).align;
+                                           text->cursor.par()->GetLayout()).align;
         
        switch (align) {
        case LYX_ALIGN_RIGHT:
@@ -1594,20 +1417,41 @@ bool UpdateLayoutParagraph()
                fl_set_button(fd_form_paragraph->radio_align_block, 1);
                break;
        }
-        
+
+#ifndef NEW_INSETS
+       fl_set_button(fd_form_paragraph->check_lines_top,
+                     text->cursor.par()->FirstPhysicalPar()->line_top);
+
+       fl_set_button(fd_form_paragraph->check_lines_bottom,
+                     text->cursor.par()->FirstPhysicalPar()->line_bottom);
+
+       fl_set_button(fd_form_paragraph->check_pagebreaks_top,
+                     text->cursor.par()->FirstPhysicalPar()->pagebreak_top);
+
+       fl_set_button(fd_form_paragraph->check_pagebreaks_bottom,
+                     text->cursor.par()->FirstPhysicalPar()->pagebreak_bottom);
+       fl_set_button(fd_form_paragraph->check_noindent,
+                     text->cursor.par()->FirstPhysicalPar()->noindent);
+#else
        fl_set_button(fd_form_paragraph->check_lines_top,
-                     current_view->text->cursor.par->FirstPhysicalPar()->line_top);
+                     text->cursor.par()->line_top);
        fl_set_button(fd_form_paragraph->check_lines_bottom,
-                     current_view->text->cursor.par->FirstPhysicalPar()->line_bottom);
+                     text->cursor.par()->line_bottom);
        fl_set_button(fd_form_paragraph->check_pagebreaks_top,
-                     current_view->text->cursor.par->FirstPhysicalPar()->pagebreak_top);
+                     text->cursor.par()->pagebreak_top);
        fl_set_button(fd_form_paragraph->check_pagebreaks_bottom,
-                     current_view->text->cursor.par->FirstPhysicalPar()->pagebreak_bottom);
+                     text->cursor.par()->pagebreak_bottom);
        fl_set_button(fd_form_paragraph->check_noindent,
-                     current_view->text->cursor.par->FirstPhysicalPar()->noindent);
+                     text->cursor.par()->noindent);
+#endif
        fl_set_input (fd_form_paragraph->input_space_above, "");
-       
-       switch (current_view->text->cursor.par->FirstPhysicalPar()->added_space_top.kind()) {
+
+#ifndef NEW_INSETS
+       switch (text->cursor.par()->FirstPhysicalPar()->added_space_top.kind()) {
+#else
+       switch (text->cursor.par()->added_space_top.kind()) {
+#endif
+
        case VSpace::NONE:
                fl_set_choice (fd_form_paragraph->choice_space_above, 1);
                break;
@@ -1627,15 +1471,27 @@ bool UpdateLayoutParagraph()
                fl_set_choice (fd_form_paragraph->choice_space_above, 6);
                break;
        case VSpace::LENGTH:
-               fl_set_choice (fd_form_paragraph->choice_space_above, 7); 
+               fl_set_choice (fd_form_paragraph->choice_space_above, 7);
+#ifndef NEW_INSETS
                fl_set_input  (fd_form_paragraph->input_space_above, 
-                              current_view->text->cursor.par->FirstPhysicalPar()->added_space_top.length().asString().c_str());
+                              text->cursor.par()->FirstPhysicalPar()->added_space_top.length().asString().c_str());
+#else
+               fl_set_input  (fd_form_paragraph->input_space_above, 
+                              text->cursor.par()->added_space_top.length().asString().c_str());
+#endif
                break;
        }
+#ifndef NEW_INSETS
+       fl_set_button (fd_form_paragraph->check_space_above,
+                      text->cursor.par()->FirstPhysicalPar()->added_space_top.keep());
+       fl_set_input (fd_form_paragraph->input_space_below, "");
+       switch (text->cursor.par()->FirstPhysicalPar()->added_space_bottom.kind()) {
+#else
        fl_set_button (fd_form_paragraph->check_space_above,
-                      current_view->text->cursor.par->FirstPhysicalPar()->added_space_top.keep());
+                      text->cursor.par()->added_space_top.keep());
        fl_set_input (fd_form_paragraph->input_space_below, "");
-       switch (current_view->text->cursor.par->FirstPhysicalPar()->added_space_bottom.kind()) {
+       switch (text->cursor.par()->added_space_bottom.kind()) {
+#endif
        case VSpace::NONE:
                fl_set_choice (fd_form_paragraph->choice_space_below,
                               1);
@@ -1662,17 +1518,28 @@ bool UpdateLayoutParagraph()
                break;
        case VSpace::LENGTH:
                fl_set_choice (fd_form_paragraph->choice_space_below,
-                              7); 
+                              7);
+#ifndef NEW_INSETS
                fl_set_input  (fd_form_paragraph->input_space_below, 
-                              current_view->text->cursor.par->FirstPhysicalPar()->added_space_bottom.length().asString().c_str());
+                              text->cursor.par()->FirstPhysicalPar()->added_space_bottom.length().asString().c_str());
                break;
        }
        fl_set_button (fd_form_paragraph->check_space_below,
-                      current_view->text->cursor.par->FirstPhysicalPar()->added_space_bottom.keep());
+                      text->cursor.par()->FirstPhysicalPar()->added_space_bottom.keep());
 
        fl_set_button(fd_form_paragraph->check_noindent,
-                     current_view->text->cursor.par->FirstPhysicalPar()->noindent);
+                     text->cursor.par()->FirstPhysicalPar()->noindent);
+#else
+               fl_set_input  (fd_form_paragraph->input_space_below, 
+                              text->cursor.par()->added_space_bottom.length().asString().c_str());
+               break;
+       }
+       fl_set_button (fd_form_paragraph->check_space_below,
+                      text->cursor.par()->added_space_bottom.keep());
 
+       fl_set_button(fd_form_paragraph->check_noindent,
+                     text->cursor.par()->noindent);
+#endif
        if (current_view->buffer()->isReadonly()) {
                DisableParagraphLayout();
        } else {
@@ -1875,6 +1742,7 @@ bool UpdateLayoutDocument(BufferParams * params)
    
        fl_set_input(fd_form_document->input_spacing, "");
        switch (params->spacing.getSpace()) {
+       case Spacing::Default: // nothing bad should happen with this
        case Spacing::Single:
        {
                // \singlespacing
@@ -2069,324 +1937,113 @@ void MenuLayoutSave()
 }
 
 
-/* -------> These CB's use ToggleFree() as the (one and only?) font-changer. 
-                       They also show the current font state. */
-
-static
-void ToggleAndShow(BufferView *, LyXFont const &);
-
-
-void FontSize(string const & size)
+// This is both GUI and LyXFont dependent. Don't know where to put it. (Asger)
+// Well, it's mostly GUI dependent, so I guess it will stay here. (Asger)
+LyXFont UserFreeFont(BufferParams const & params)
 {
        LyXFont font(LyXFont::ALL_IGNORE);
-       font.setGUISize(size);
-       ToggleAndShow(current_view, font);
-}
 
+       int pos = fl_get_choice(fd_form_character->choice_family);
+       switch(pos) {
+       case 1: font.setFamily(LyXFont::IGNORE_FAMILY); break;
+       case 2: font.setFamily(LyXFont::ROMAN_FAMILY); break;
+       case 3: font.setFamily(LyXFont::SANS_FAMILY); break;
+       case 4: font.setFamily(LyXFont::TYPEWRITER_FAMILY); break;
+       case 5: font.setFamily(LyXFont::INHERIT_FAMILY); break;
+       }
 
-void Emph()
-{
-       LyXFont font(LyXFont::ALL_IGNORE);
-       font.setEmph(LyXFont::TOGGLE);
-       ToggleAndShow(current_view, font);
-}
+       pos = fl_get_choice(fd_form_character->choice_series);
+       switch(pos) {
+       case 1: font.setSeries(LyXFont::IGNORE_SERIES); break;
+       case 2: font.setSeries(LyXFont::MEDIUM_SERIES); break;
+       case 3: font.setSeries(LyXFont::BOLD_SERIES); break;
+       case 4: font.setSeries(LyXFont::INHERIT_SERIES); break;
+       }
 
+       pos = fl_get_choice(fd_form_character->choice_shape);
+       switch(pos) {
+       case 1: font.setShape(LyXFont::IGNORE_SHAPE); break;
+       case 2: font.setShape(LyXFont::UP_SHAPE); break;
+       case 3: font.setShape(LyXFont::ITALIC_SHAPE); break;
+       case 4: font.setShape(LyXFont::SLANTED_SHAPE); break;
+       case 5: font.setShape(LyXFont::SMALLCAPS_SHAPE); break;
+       case 6: font.setShape(LyXFont::INHERIT_SHAPE); break;
+       }
 
-void Noun()
-{
-       LyXFont font(LyXFont::ALL_IGNORE);
-       font.setNoun(LyXFont::TOGGLE);
-       ToggleAndShow(current_view, font);
-}
+       pos = fl_get_choice(fd_form_character->choice_size);
+       switch(pos) {
+       case 1: font.setSize(LyXFont::IGNORE_SIZE); break;
+       case 2: font.setSize(LyXFont::SIZE_TINY); break;
+       case 3: font.setSize(LyXFont::SIZE_SCRIPT); break;
+       case 4: font.setSize(LyXFont::SIZE_FOOTNOTE); break;
+       case 5: font.setSize(LyXFont::SIZE_SMALL); break;
+       case 6: font.setSize(LyXFont::SIZE_NORMAL); break;
+       case 7: font.setSize(LyXFont::SIZE_LARGE); break;
+       case 8: font.setSize(LyXFont::SIZE_LARGER); break;
+       case 9: font.setSize(LyXFont::SIZE_LARGEST); break;
+       case 10: font.setSize(LyXFont::SIZE_HUGE); break;
+       case 11: font.setSize(LyXFont::SIZE_HUGER); break;
+       case 12: font.setSize(LyXFont::INCREASE_SIZE); break;
+       case 13: font.setSize(LyXFont::DECREASE_SIZE); break;
+       case 14: font.setSize(LyXFont::INHERIT_SIZE); break;
+       }
 
+       pos = fl_get_choice(fd_form_character->choice_bar);
+       switch(pos) {
+       case 1: font.setEmph(LyXFont::IGNORE);
+               font.setUnderbar(LyXFont::IGNORE);
+               font.setNoun(LyXFont::IGNORE);
+               font.setLatex(LyXFont::IGNORE);
+               break;
+       case 2: font.setEmph(LyXFont::TOGGLE); break;
+       case 3: font.setUnderbar(LyXFont::TOGGLE); break;
+       case 4: font.setNoun(LyXFont::TOGGLE); break;
+       case 5: font.setLatex(LyXFont::TOGGLE); break;
+       case 6: font.setEmph(LyXFont::INHERIT);
+               font.setUnderbar(LyXFont::INHERIT);
+               font.setNoun(LyXFont::INHERIT);
+               font.setLatex(LyXFont::INHERIT);
+               break;
+       }
 
-void Bold()
-{
-       LyXFont font(LyXFont::ALL_IGNORE);
-       font.setSeries(LyXFont::BOLD_SERIES);
-       ToggleAndShow(current_view, font);
-}
+       pos = fl_get_choice(fd_form_character->choice_color);
+       switch(pos) {
+       case 1: font.setColor(LColor::ignore); break;
+       case 2: font.setColor(LColor::none); break;
+       case 3: font.setColor(LColor::black); break;
+       case 4: font.setColor(LColor::white); break;
+       case 5: font.setColor(LColor::red); break;
+       case 6: font.setColor(LColor::green); break;
+       case 7: font.setColor(LColor::blue); break;
+       case 8: font.setColor(LColor::cyan); break;
+       case 9: font.setColor(LColor::magenta); break;
+       case 10: font.setColor(LColor::yellow); break;
+       case 11: font.setColor(LColor::inherit); break;
+       }
 
+       int choice = combo_language2->get();
+       if (choice == 1)
+               font.setLanguage(ignore_language);
+       else if (choice == 2)
+               font.setLanguage(params.language_info);
+       else
+               font.setLanguage(&languages[combo_language2->getline()]);
 
-void Underline()
-{
-       LyXFont font(LyXFont::ALL_IGNORE);
-       font.setUnderbar(LyXFont::TOGGLE);
-       ToggleAndShow(current_view, font);
+       return font; 
 }
 
 
-void Code()
+/* callbacks for form form_title */
+extern "C" void TimerCB(FL_OBJECT *, long)
 {
-       LyXFont font(LyXFont::ALL_IGNORE);
-       font.setFamily(LyXFont::TYPEWRITER_FAMILY); // no good
-       ToggleAndShow(current_view, font);
-}
-
-
-void Sans()
-{
-       LyXFont font(LyXFont::ALL_IGNORE);
-       font.setFamily(LyXFont::SANS_FAMILY);
-       ToggleAndShow(current_view, font);
-}
-
-
-void Roman()
-{
-       LyXFont font(LyXFont::ALL_IGNORE);
-       font.setFamily(LyXFont::ROMAN_FAMILY);
-       ToggleAndShow(current_view, font);
-}
-
-
-void Tex()
-{
-       LyXFont font(LyXFont::ALL_IGNORE);
-       font.setLatex (LyXFont::TOGGLE);
-       ToggleAndShow(current_view, font);
-}
-
-void LangCB(string const & l)
-{
-       LyXFont font(LyXFont::ALL_IGNORE);
-       Languages::iterator lit = languages.find(l);
-       if (lit != languages.end()) {
-               font.setLanguage(&(*lit).second);
-               ToggleAndShow(current_view, font);
-       } else
-               WriteAlert(_("Error! unknown language"),l);
-}
-
-
-void StyleReset()
-{
-       LyXFont font(LyXFont::ALL_INHERIT, ignore_language);
-       ToggleAndShow(current_view, font);
-}
-
-
-/* -------> Returns the current font and depth by printing a message. In the
- * future perhaps we could try to implement a callback to the button-bar.
- * That is, `light' the bold button when the font is currently bold, etc.
- */
-string CurrentState()
-{
-       string state;
-       if (current_view->available()) { 
-               // I think we should only show changes from the default
-               // font. (Asger)
-               Buffer * buffer = current_view->buffer();
-               LyXFont font = current_view->text->real_current_font;
-               LyXFont defaultfont = textclasslist.TextClass(buffer->
-                                                             params.textclass).defaultfont();
-               font.reduce(defaultfont);
-               state = _("Font: ") + font.stateText();
-
-               int depth = current_view->text->GetDepth();
-               if (depth > 0) 
-                       state += string(_(", Depth: ")) + tostr(depth);
-       }
-       return state;
-}
-
-
-// candidate for move to BufferView
-/* -------> Does the actual toggle job of the XxxCB() calls above.
- * Also shows the current font state.
- */
-static
-void ToggleAndShow(BufferView * bv, LyXFont const & font)
-{
-       if (bv->available()) { 
-               bv->hideCursor();
-               bv->update(-2);
-               if (bv->the_locking_inset)
-                       bv->the_locking_inset->SetFont(bv, font, toggleall);
-               else
-                       bv->text->ToggleFree(font, toggleall);
-               bv->update(1);
-       }
-}
-
-
-// candidate for move to BufferView
-void Margin(BufferView * bv)
-{
-       if (bv->available()) {
-               bv->owner()->getMiniBuffer()->Set(_("Inserting margin note..."));
-               bv->hideCursor();
-               bv->update(-2);
-               bv->text->InsertFootnoteEnvironment(LyXParagraph::MARGIN);
-               bv->update(1);
-       }
-}
-
-
-void Figure()
-{
-       if (fd_form_figure->form_figure->visible) {
-               fl_raise_form(fd_form_figure->form_figure);
-       } else {
-               fl_show_form(fd_form_figure->form_figure,
-                            FL_PLACE_MOUSE, FL_FULLBORDER,
-                            _("Insert Figure"));
-       }
-}
-
-
-void Table()
-{
-       if (fd_form_table->form_table->visible) {
-               fl_raise_form(fd_form_table->form_table);
-       } else {
-               fl_show_form(fd_form_table->form_table,
-                            FL_PLACE_MOUSE, FL_FULLBORDER,
-                            _("Insert Table"));
-       }
-}
-
-
-// candidate for move to BufferView
-void Melt(BufferView * bv)
-{
-       if (!bv->available()) return;
-       
-       bv->owner()->getMiniBuffer()->Set(_("Melt"));
-       bv->hideCursor();
-       bv->beforeChange();
-       bv->update(-2);
-       bv->text->MeltFootnoteEnvironment();
-       bv->update(1);
-}
-
-
-// candidate for move to BufferView
-// Change environment depth.
-// if decInc >= 0, increment depth
-// if decInc <  0, decrement depth
-void changeDepth(BufferView * bv, int decInc)
-{
-       if (!bv->available()) return;
-       
-       bv->hideCursor();
-       bv->update(-2);
-       if (decInc >= 0)
-               bv->text->IncDepth();
-       else
-               bv->text->DecDepth();
-       bv->update(1);
-       bv->owner()->getMiniBuffer()
-               ->Set(_("Changed environment depth"
-                       " (in possible range, maybe not)"));
-}
-
-
-// This is both GUI and LyXFont dependent. Don't know where to put it. (Asger)
-// Well, it's mostly GUI dependent, so I guess it will stay here. (Asger)
-LyXFont UserFreeFont()
-{
-       LyXFont font(LyXFont::ALL_IGNORE);
-
-       int pos = fl_get_choice(fd_form_character->choice_family);
-       switch(pos) {
-       case 1: font.setFamily(LyXFont::IGNORE_FAMILY); break;
-       case 2: font.setFamily(LyXFont::ROMAN_FAMILY); break;
-       case 3: font.setFamily(LyXFont::SANS_FAMILY); break;
-       case 4: font.setFamily(LyXFont::TYPEWRITER_FAMILY); break;
-       case 5: font.setFamily(LyXFont::INHERIT_FAMILY); break;
-       }
-
-       pos = fl_get_choice(fd_form_character->choice_series);
-       switch(pos) {
-       case 1: font.setSeries(LyXFont::IGNORE_SERIES); break;
-       case 2: font.setSeries(LyXFont::MEDIUM_SERIES); break;
-       case 3: font.setSeries(LyXFont::BOLD_SERIES); break;
-       case 4: font.setSeries(LyXFont::INHERIT_SERIES); break;
-       }
-
-       pos = fl_get_choice(fd_form_character->choice_shape);
-       switch(pos) {
-       case 1: font.setShape(LyXFont::IGNORE_SHAPE); break;
-       case 2: font.setShape(LyXFont::UP_SHAPE); break;
-       case 3: font.setShape(LyXFont::ITALIC_SHAPE); break;
-       case 4: font.setShape(LyXFont::SLANTED_SHAPE); break;
-       case 5: font.setShape(LyXFont::SMALLCAPS_SHAPE); break;
-       case 6: font.setShape(LyXFont::INHERIT_SHAPE); break;
-       }
-
-       pos = fl_get_choice(fd_form_character->choice_size);
-       switch(pos) {
-       case 1: font.setSize(LyXFont::IGNORE_SIZE); break;
-       case 2: font.setSize(LyXFont::SIZE_TINY); break;
-       case 3: font.setSize(LyXFont::SIZE_SCRIPT); break;
-       case 4: font.setSize(LyXFont::SIZE_FOOTNOTE); break;
-       case 5: font.setSize(LyXFont::SIZE_SMALL); break;
-       case 6: font.setSize(LyXFont::SIZE_NORMAL); break;
-       case 7: font.setSize(LyXFont::SIZE_LARGE); break;
-       case 8: font.setSize(LyXFont::SIZE_LARGER); break;
-       case 9: font.setSize(LyXFont::SIZE_LARGEST); break;
-       case 10: font.setSize(LyXFont::SIZE_HUGE); break;
-       case 11: font.setSize(LyXFont::SIZE_HUGER); break;
-       case 12: font.setSize(LyXFont::INCREASE_SIZE); break;
-       case 13: font.setSize(LyXFont::DECREASE_SIZE); break;
-       case 14: font.setSize(LyXFont::INHERIT_SIZE); break;
-       }
-
-       pos = fl_get_choice(fd_form_character->choice_bar);
-       switch(pos) {
-       case 1: font.setEmph(LyXFont::IGNORE);
-               font.setUnderbar(LyXFont::IGNORE);
-               font.setNoun(LyXFont::IGNORE);
-               font.setLatex(LyXFont::IGNORE);
-               break;
-       case 2: font.setEmph(LyXFont::TOGGLE); break;
-       case 3: font.setUnderbar(LyXFont::TOGGLE); break;
-       case 4: font.setNoun(LyXFont::TOGGLE); break;
-       case 5: font.setLatex(LyXFont::TOGGLE); break;
-       case 6: font.setEmph(LyXFont::INHERIT);
-               font.setUnderbar(LyXFont::INHERIT);
-               font.setNoun(LyXFont::INHERIT);
-               font.setLatex(LyXFont::INHERIT);
-               break;
-       }
-
-       pos = fl_get_choice(fd_form_character->choice_color);
-       switch(pos) {
-       case 1: font.setColor(LColor::ignore); break;
-       case 2: font.setColor(LColor::none); break;
-       case 3: font.setColor(LColor::black); break;
-       case 4: font.setColor(LColor::white); break;
-       case 5: font.setColor(LColor::red); break;
-       case 6: font.setColor(LColor::green); break;
-       case 7: font.setColor(LColor::blue); break;
-       case 8: font.setColor(LColor::cyan); break;
-       case 9: font.setColor(LColor::magenta); break;
-       case 10: font.setColor(LColor::yellow); break;
-       case 11: font.setColor(LColor::inherit); break;
-       }
-
-       return font; 
-}
-
-
-void Free()
-{
-       ToggleAndShow(current_view, UserFreeFont());
-}
-
-
-/* callbacks for form form_title */
-extern "C" void TimerCB(FL_OBJECT *, long)
-{
-       // only if the form still exists
-       if (lyxrc.show_banner && fd_form_title->form_title != 0) {
-               if (fd_form_title->form_title->visible) {
-                       fl_hide_form(fd_form_title->form_title);
-               }
-               fl_free_form(fd_form_title->form_title);
-               fd_form_title->form_title = 0;
-       }
+       // only if the form still exists
+       if (lyxrc.show_banner && fd_form_title->form_title != 0) {
+               if (fd_form_title->form_title->visible) {
+                       fl_hide_form(fd_form_title->form_title);
+               }
+               fl_free_form(fd_form_title->form_title);
+               fd_form_title->form_title = 0;
+       }
 }
 
 
@@ -2503,16 +2160,22 @@ extern "C" void ParagraphApplyCB(FL_OBJECT *, long)
        labelwidthstring = fl_get_input(fd_form_paragraph->input_labelwidth);
        noindent = fl_get_button(fd_form_paragraph->check_noindent);
 
-       current_view->text->SetParagraph(line_top,
-                                        line_bottom,
-                                        pagebreak_top,
-                                        pagebreak_bottom,
-                                        space_top,
-                                        space_bottom,
-                                        align, 
-                                        labelwidthstring,
-                                        noindent);
-       current_view->update(1);
+       LyXText * text = 0;
+       if (current_view->the_locking_inset)
+           text = current_view->the_locking_inset->getLyXText(current_view);
+       if (!text)
+           text = current_view->text;
+       text->SetParagraph(current_view,
+                          line_top,
+                          line_bottom,
+                          pagebreak_top,
+                          pagebreak_bottom,
+                          space_top,
+                          space_bottom,
+                          align, 
+                          labelwidthstring,
+                          noindent);
+       current_view->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
        current_view->owner()->getMiniBuffer()->Set(_("Paragraph layout set"));
 }
 
@@ -2537,7 +2200,8 @@ extern "C" void CharacterApplyCB(FL_OBJECT *, long)
        // we set toggleall locally here, since it should be true for
        // all other uses of ToggleAndShow() (JMarc)
        toggleall = fl_get_button(fd_form_character->check_toggle_all);
-       ToggleAndShow(current_view, UserFreeFont());
+       ToggleAndShow(current_view, UserFreeFont(current_view->buffer()->params));
+       current_view->setState();
        toggleall = true;
 }
 
@@ -2585,7 +2249,7 @@ void UpdateDocumentButtons(BufferParams const & params)
 
 extern "C" void ChoiceClassCB(FL_OBJECT * ob, long)
 {
-       ProhibitInput();
+       ProhibitInput(current_view);
        if (textclasslist.Load(fl_get_choice(ob)-1)) {
                if (AskQuestion(_("Should I set some parameters to"),
                                fl_get_choice_text(ob),
@@ -2604,7 +2268,7 @@ extern "C" void ChoiceClassCB(FL_OBJECT * ob, long)
                fl_set_choice(fd_form_document->choice_class, 
                              current_view->buffer()->params.textclass + 1);
        }
-       AllowInput();
+       AllowInput(current_view);
 }
 
 
@@ -2664,12 +2328,28 @@ extern "C" void DocumentApplyCB(FL_OBJECT *, long)
        bool redo = false;
        BufferParams * params = &(current_view->buffer()->params);
 
+       Language const * old_language = params->language_info;
        params->language = combo_language->getline();
        Languages::iterator lit = languages.find(params->language);
+
+       Language const * new_language;
        if (lit != languages.end()) 
-               params->language_info = &(*lit).second;
+               new_language = &(*lit).second;
        else
-               params->language_info = default_language;
+               new_language = default_language;
+
+       if (current_view->available()) {
+               if (old_language != new_language
+                   && old_language->RightToLeft() == new_language->RightToLeft()
+                   && !current_view->buffer()->isMultiLingual())
+                       current_view->buffer()->ChangeLanguage(old_language,
+                                                              new_language);
+               if (old_language != new_language) {
+                               //current_view->buffer()->redraw();
+                       redo = true;
+               }
+       }
+       params->language_info = new_language;
 
        // If default skip is a "Length" but there's no text in the
        // input field, reset the kind to "Medskip", which is the default.
@@ -2698,9 +2378,11 @@ extern "C" void DocumentApplyCB(FL_OBJECT *, long)
    
        if (!current_view->available())
                return;
-       current_view->text->SetCursor(current_view->text->cursor.par,
-                                     current_view->text->cursor.pos);
-       current_view->setState();
+
+        current_view->text->SetCursor(current_view,
+                                     current_view->text->cursor.par(),
+                                      current_view->text->cursor.pos());
+        current_view->setState();
 
        LyXTextClassList::ClassList::size_type new_class =
                fl_get_choice(fd_form_document->choice_class) - 1;
@@ -2710,13 +2392,13 @@ extern "C" void DocumentApplyCB(FL_OBJECT *, long)
                if (textclasslist.Load(new_class)) {
                        // successfully loaded
                        redo = true;
-                       current_view->owner()->getMiniBuffer()->Set(_("Converting document to new document class..."));
-                       int ret = current_view->text->
-                               SwitchLayoutsBetweenClasses(current_view->buffer()->
-                                                           params.textclass,
-                                                           new_class,
-                                                           current_view->buffer()->
-                                                           paragraph);
+                       current_view->owner()->getMiniBuffer()->
+                               Set(_("Converting document to new document class..."));
+                       CutAndPaste cap;
+                       int ret = cap.SwitchLayoutsBetweenClasses(
+                               current_view->buffer()->params.textclass,
+                               new_class,
+                               current_view->buffer()->paragraph);
 
                        if (ret) {
                                string s;
@@ -2815,10 +2497,9 @@ extern "C" void DocumentApplyCB(FL_OBJECT *, long)
    
        current_view->owner()->getMiniBuffer()->Set(_("Document layout set"));
        current_view->buffer()->markDirty();
-
+       
         params->options = 
                fl_get_input(fd_form_document->input_extra);
-   
 }
 
 
@@ -2924,19 +2605,21 @@ extern "C" void PreambleOKCB(FL_OBJECT * ob, long data)
 
 /* callbacks for form form_table */
 
-extern "C" void TableApplyCB(FL_OBJECT *, long)
+extern "C"
+void TableApplyCB(FL_OBJECT *, long)
 {
        if (!current_view->available())
                return;
-   
+
+#ifndef NEW_TABULAR
        // check for tables in tables
-       if (current_view->text->cursor.par->table){
+       if (current_view->text->cursor.par()->table){
                WriteAlert(_("Impossible Operation!"),
                           _("Cannot insert table in table."),
                           _("Sorry."));
                return;
        }
+#endif
        current_view->owner()->getMiniBuffer()->Set(_("Inserting table..."));
 
        int ysize = int(fl_get_slider_value(fd_form_table->slider_columns) + 0.5);
@@ -2945,29 +2628,31 @@ extern "C" void TableApplyCB(FL_OBJECT *, long)
    
        current_view->hideCursor();
        current_view->beforeChange();
-       current_view->update(-2);
+       current_view->update(BufferView::SELECT|BufferView::FITCUR);
    
-       current_view->text->SetCursorParUndo(); 
+       current_view->text->SetCursorParUndo(current_view->buffer()); 
        current_view->text->FreezeUndo();
 
-       current_view->text->BreakParagraph();
-       current_view->update(-1);
+       current_view->text->BreakParagraph(current_view);
+       current_view->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
    
-       if (current_view->text->cursor.par->Last()) {
-               current_view->text->CursorLeft();
+       if (current_view->text->cursor.par()->Last()) {
+               current_view->text->CursorLeft(current_view);
       
-               current_view->text->BreakParagraph();
-               current_view->update(-1);
+               current_view->text->BreakParagraph(current_view);
+               current_view->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
        }
 
        current_view->text->current_font.setLatex(LyXFont::OFF);
        //if (!fl_get_button(fd_form_table->check_latex)){
        // insert the new wysiwy table
-       current_view->text->SetLayout(0); // standard layout
-       if (current_view->text->cursor.par->footnoteflag == 
+       current_view->text->SetLayout(current_view, 0); // standard layout
+#ifndef NEW_INSETS
+       if (current_view->text->cursor.par()->footnoteflag == 
            LyXParagraph::NO_FOOTNOTE) {
+#endif
                current_view->text
-                       ->SetParagraph(0, 0,
+                       ->SetParagraph(current_view, 0, 0,
                                       0, 0,
                                       VSpace (0.3 * current_view->buffer()->
                                               params.spacing.getValue(),
@@ -2978,9 +2663,10 @@ extern "C" void TableApplyCB(FL_OBJECT *, long)
                                       LYX_ALIGN_CENTER,
                                       string(),
                                       0);
+#ifndef NEW_INSETS
        } else {
                current_view->text
-                       ->SetParagraph(0, 0,
+                       ->SetParagraph(current_view, 0, 0,
                                       0, 0,
                                       VSpace(VSpace::NONE),
                                       VSpace(VSpace::NONE),
@@ -2988,229 +2674,70 @@ extern "C" void TableApplyCB(FL_OBJECT *, long)
                                       string(),
                                       0);
        }
-       
-       current_view->text->cursor.par->table =
+#endif
+#ifndef NEW_TABULAR
+       current_view->text->cursor.par()->table =
                new LyXTable(xsize, ysize);
-
+#endif
        Language const * lang = 
-               current_view->text->cursor.par->getParLanguage();
-       LyXFont font(LyXFont::ALL_INHERIT,lang);
+               current_view->text->cursor.par()->getParLanguage(current_view->buffer()->params);
+       LyXFont font(LyXFont::ALL_INHERIT, lang);
        for (int i = 0; i < xsize * ysize - 1; ++i) {
-               current_view->text->cursor.par->InsertChar(0, LyXParagraph::META_NEWLINE);
-               current_view->text->cursor.par->SetFont(0, font);
+               current_view->text->cursor.par()
+                       ->InsertChar(0, LyXParagraph::META_NEWLINE, font);
        }
-       current_view->text->RedoParagraph();
+       current_view->text->RedoParagraph(current_view);
    
        current_view->text->UnFreezeUndo();
      
-       current_view->update(1);
+       current_view->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
        current_view->owner()->getMiniBuffer()->Set(_("Table inserted"));
        current_view->setState();
 }
 
 
-extern "C" void TableCancelCB(FL_OBJECT *, long)
+extern "C"
+void TableCancelCB(FL_OBJECT *, long)
 {
        fl_hide_form(fd_form_table->form_table);
 }
 
 
-extern "C" void TableOKCB(FL_OBJECT * ob, long data)
+extern "C"
+void TableOKCB(FL_OBJECT * ob, long data)
 {
        TableApplyCB(ob, data);
        TableCancelCB(ob, data);
 }
 
 
-/* callbacks for form form_print */
-
-extern "C" void PrintCancelCB(FL_OBJECT *, long)
-{
-       fl_hide_form(fd_form_print->form_print);
-}
-
-
-static
-bool stringOnlyContains (string const & LStr, char const * cset)
-{
-#if 0
-       char const * cstr = LStr.c_str();
-
-       return strspn(cstr, cset) == strlen(cstr);
-#else
-       return LStr.find_first_not_of(cset) == string::npos;
-#endif
-}
-
-
-extern "C" void PrintApplyCB(FL_OBJECT *, long)
+void Figure()
 {
-       if (!current_view->available())
-               return;
-        Buffer * buffer = current_view->buffer();
-        string path = OnlyPath(buffer->fileName());
-
-       string pageflag;
-       if (fl_get_button(fd_form_print->radio_even_pages))
-               pageflag = lyxrc.print_evenpage_flag + ' ';
-       else if (fl_get_button(fd_form_print->radio_odd_pages))
-               pageflag = lyxrc.print_oddpage_flag + ' ';
-
-// Changes by Stephan Witt (stephan.witt@beusen.de), 19-Jan-99
-// User may give a page (range) list
-// User may print multiple (unsorted) copies
-       string pages = subst(fl_get_input(fd_form_print->input_pages), ';',',');
-       pages = subst(pages, '+',',');
-       pages = frontStrip(strip(pages)) ;
-       while (!pages.empty()) { // a page range was given
-               string piece ;
-               pages = split (pages, piece, ',') ;
-               piece = strip(piece) ;
-               piece = frontStrip(piece) ;
-               if ( !stringOnlyContains (piece, "0123456789-") ) {
-                       WriteAlert(_("ERROR!  Unable to print!"),
-                                  _("Check 'range of pages'!"));
-                       return;
-               }
-               if (piece.find('-') == string::npos) { // not found
-                       pageflag += lyxrc.print_pagerange_flag + piece + '-' + piece + ' ' ;
-               } else if (suffixIs(piece, "-") ) { // missing last page
-                       pageflag += lyxrc.print_pagerange_flag + piece + "1000 ";
-               } else if (prefixIs(piece, "-") ) { // missing first page
-                       pageflag += lyxrc.print_pagerange_flag + '1' + piece + ' ' ;
-               } else {
-                       pageflag += lyxrc.print_pagerange_flag + piece + ' ' ;
-               }
-       }
-   
-       string copies = frontStrip(strip(fl_get_input(fd_form_print->input_copies)));
-       if (!copies.empty()) { // a number of copies was given
-               if ( !stringOnlyContains (copies, "0123456789") ) {
-                       WriteAlert(_("ERROR!  Unable to print!"),
-                                  _("Check 'number of copies'!"));
-                       return;
-               }
-               if (fl_get_button(fd_form_print->do_unsorted))
-                       pageflag += lyxrc.print_copies_flag;
-               else
-                       pageflag += lyxrc.print_collcopies_flag;
-               pageflag += " " + copies + ' ' ;
-       }
-
-       string reverseflag;
-       if (fl_get_button(fd_form_print->radio_order_reverse))
-               reverseflag = lyxrc.print_reverse_flag + ' ';
-   
-       string orientationflag;
-       if (buffer->params.orientation == BufferParams::ORIENTATION_LANDSCAPE)
-               orientationflag = lyxrc.print_landscape_flag + ' ';
-   
-       string ps_file = fl_get_input(fd_form_print->input_file);
-       string printer = strip(fl_get_input(fd_form_print->input_printer));
-
-       string printerflag;
-       if (lyxrc.print_adapt_output // printer name should be passed to dvips
-           && ! printer.empty()) // a printer name has been given
-               printerflag = lyxrc.print_to_printer + printer + ' ';
-     
-       string extraflags;
-       if (!lyxrc.print_extra_options.empty())
-               extraflags = lyxrc.print_extra_options + ' ';
-
-       string command = lyxrc.print_command + ' ' 
-               + printerflag + pageflag + reverseflag 
-               + orientationflag + extraflags;
-       char real_papersize = buffer->params.papersize;
-       if (real_papersize == BufferParams::PAPER_DEFAULT)
-               real_papersize = lyxrc.default_papersize;
-       
-        string paper;
-       switch (real_papersize) {
-       case BufferParams::PAPER_USLETTER:
-               paper = "letter";
-               break;
-       case BufferParams::PAPER_A3PAPER:
-               paper = "a3";
-               break;
-       case BufferParams::PAPER_A4PAPER:
-               paper = "a4";
-               break;
-       case BufferParams::PAPER_A5PAPER:
-               paper = "a5";
-               break;
-       case BufferParams::PAPER_B5PAPER:
-               paper = "b5";
-               break;
-       case BufferParams::PAPER_EXECUTIVEPAPER:
-               paper = "foolscap";
-               break;
-       case BufferParams::PAPER_LEGALPAPER:
-               paper = "legal";
-               break;
-       default: /* If nothing else fits, keep an empty value... */
-               break;
+       if (fd_form_figure->form_figure->visible) {
+               fl_raise_form(fd_form_figure->form_figure);
+       } else {
+               fl_show_form(fd_form_figure->form_figure,
+                            FL_PLACE_MOUSE, FL_FULLBORDER,
+                            _("Insert Figure"));
        }
-
-       if (buffer->params.use_geometry
-           && buffer->params.papersize2 == BufferParams::VM_PAPER_CUSTOM
-           && !lyxrc.print_paper_dimension_flag.empty()
-           && !buffer->params.paperwidth.empty()
-           && !buffer->params.paperheight.empty()) {
-               // using a custom papersize
-               command += ' ';
-               command += lyxrc.print_paper_dimension_flag + ' ';
-               command += buffer->params.paperwidth + ',';
-               command += buffer->params.paperheight + ' ';
-       } else if (!lyxrc.print_paper_flag.empty()
-                  && !paper.empty()
-                  && (real_papersize != BufferParams::PAPER_USLETTER ||
-                      buffer->params.orientation == BufferParams::ORIENTATION_PORTRAIT)) {
-               command += " " + lyxrc.print_paper_flag + " " + paper + " ";
-       }
-       if (fl_get_button(fd_form_print->radio_file))
-               command += lyxrc.print_to_file 
-                       + QuoteName(MakeAbsPath(ps_file, path));
-       else if (!lyxrc.print_spool_command.empty())
-               command += lyxrc.print_to_file 
-                       + QuoteName(ps_file);
-       
-       // push directorypath, if necessary 
-        if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)){
-               path = buffer->tmppath;
-        }
-        Path p(path);
-
-       bool result;
-       if (!lyxrc.print_spool_command.empty() && 
-           !fl_get_button(fd_form_print->radio_file)) {
-               string command2 = lyxrc.print_spool_command + ' ';
-               if (!printer.empty())
-                       command2 += lyxrc.print_spool_printerprefix 
-                               + printer;
-               // First run dvips and, if succesful, then spool command
-               if ((result = RunScript(buffer, true, command))) {
-                       result = RunScript(buffer, false, command2, ps_file);
-               }
-        } else
-               result = RunScript(buffer, false, command);
-
-       if (!result)
-               WriteAlert(_("Error:"),
-                          _("Unable to print"),
-                          _("Check that your parameters are correct"));
 }
 
 
-extern "C" void PrintOKCB(FL_OBJECT * ob, long data)
+void Table()
 {
-       PrintCancelCB(ob, data);  
-       PrintApplyCB(ob, data);
+       if (fd_form_table->form_table->visible) {
+               fl_raise_form(fd_form_table->form_table);
+       } else {
+               fl_show_form(fd_form_table->form_table,
+                            FL_PLACE_MOUSE, FL_FULLBORDER,
+                            _("Insert Table"));
+       }
 }
 
 
 /* callbacks for form form_figure */
-extern "C" void FigureApplyCB(FL_OBJECT *, long)
+extern "C"
+void FigureApplyCB(FL_OBJECT *, long)
 {
        if (!current_view->available())
                return;
@@ -3221,7 +2748,10 @@ extern "C" void FigureApplyCB(FL_OBJECT *, long)
        
        current_view->owner()->getMiniBuffer()->Set(_("Inserting figure..."));
        if (fl_get_button(fd_form_figure->radio_inline)
-           || current_view->text->cursor.par->table) {
+#ifndef NEW_TABULAR
+           || current_view->text->cursor.par()->table
+#endif
+               ) {
                InsetFig * new_inset = new InsetFig(100, 20, buffer);
                current_view->insertInset(new_inset);
                current_view->owner()->getMiniBuffer()->Set(_("Figure inserted"));
@@ -3230,29 +2760,31 @@ extern "C" void FigureApplyCB(FL_OBJECT *, long)
        }
        
        current_view->hideCursor();
-       current_view->update(-2);
+       current_view->update(BufferView::SELECT|BufferView::FITCUR);
        current_view->beforeChange();
       
-       current_view->text->SetCursorParUndo(); 
+       current_view->text->SetCursorParUndo(current_view->buffer()); 
        current_view->text->FreezeUndo();
 
-       current_view->text->BreakParagraph();
-       current_view->update(-1);
+       current_view->text->BreakParagraph(current_view);
+       current_view->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
       
-       if (current_view->text->cursor.par->Last()) {
-               current_view->text->CursorLeft();
+       if (current_view->text->cursor.par()->Last()) {
+               current_view->text->CursorLeft(current_view);
         
-               current_view->text->BreakParagraph();
-               current_view->update(-1);
+               current_view->text->BreakParagraph(current_view);
+               current_view->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
        }
 
        // The standard layout should always be numer 0;
-       current_view->text->SetLayout(0);
-       
-       if (current_view->text->cursor.par->footnoteflag == 
+       current_view->text->SetLayout(current_view, 0);
+
+#ifndef NEW_INSETS
+       if (current_view->text->cursor.par()->footnoteflag == 
            LyXParagraph::NO_FOOTNOTE) {
+#endif
                current_view->text->
-                       SetParagraph(0, 0,
+                       SetParagraph(current_view, 0, 0,
                                     0, 0,
                                     VSpace (0.3 * buffer->params.spacing.getValue(),
                                             LyXLength::CM),
@@ -3260,8 +2792,9 @@ extern "C" void FigureApplyCB(FL_OBJECT *, long)
                                             buffer->params.spacing.getValue(),
                                             LyXLength::CM),
                                     LYX_ALIGN_CENTER, string(), 0);
+#ifndef NEW_INSETS
        } else {
-               current_view->text->SetParagraph(0, 0,
+               current_view->text->SetParagraph(current_view, 0, 0,
                                                 0, 0,
                                                 VSpace(VSpace::NONE),
                                                 VSpace(VSpace::NONE),
@@ -3269,13 +2802,14 @@ extern "C" void FigureApplyCB(FL_OBJECT *, long)
                                                 string(),
                                                 0);
        }
+#endif
        
-       current_view->update(-1);
+       current_view->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
       
        Inset * new_inset = new InsetFig(100, 100, buffer);
        current_view->insertInset(new_inset);
        new_inset->Edit(current_view, 0, 0, 0);
-       current_view->update(0);
+       current_view->update(BufferView::SELECT|BufferView::FITCUR);
        current_view->owner()->getMiniBuffer()->Set(_("Figure inserted"));
        current_view->text->UnFreezeUndo();
        current_view->setState();
@@ -3295,53 +2829,6 @@ extern "C" void FigureOKCB(FL_OBJECT * ob, long data)
 }
 
 
-extern "C" void ScreenApplyCB(FL_OBJECT *, long)
-{
-       lyxrc.roman_font_name = fl_get_input(fd_form_screen->input_roman);
-       lyxrc.sans_font_name = fl_get_input(fd_form_screen->input_sans);
-       lyxrc.typewriter_font_name = fl_get_input(fd_form_screen->input_typewriter);
-       lyxrc.font_norm = fl_get_input(fd_form_screen->input_font_norm);
-       lyxrc.zoom = atoi(fl_get_input(fd_form_screen->intinput_size));
-       fontloader.update();
-   
-       // All buffers will need resize
-       bufferlist.resize();
-
-       current_view->owner()->getMiniBuffer()->Set(_("Screen options set"));
-}
-
-
-extern "C" void ScreenCancelCB(FL_OBJECT *, long)
-{
-       fl_hide_form(fd_form_screen->form_screen);
-}
-
-
-extern "C" void ScreenOKCB(FL_OBJECT * ob, long data)
-{
-       ScreenCancelCB(ob, data);
-       ScreenApplyCB(ob, data);
-}
-
-
-void LaTeXOptions(BufferView * bv)
-{
-       if (!bv->available())
-               return;
-
-       fl_set_button(fd_latex_options->accents,
-                     int(bv->buffer()->params.allowAccents));
-       
-       if (fd_latex_options->LaTeXOptions->visible) {
-               fl_raise_form(fd_latex_options->LaTeXOptions);
-       } else {
-               fl_show_form(fd_latex_options->LaTeXOptions,
-                            FL_PLACE_MOUSE, FL_FULLBORDER,
-                            _("LaTeX Options"));
-       }
-}
-
-
 // This function runs "configure" and then rereads lyx.defaults to
 // reconfigure the automatic settings.
 void Reconfigure(BufferView * bv)
@@ -3359,264 +2846,3 @@ void Reconfigure(BufferView * bv)
                   _("You need to restart LyX to make use of any"),
                   _("updated document class specifications."));
 }
-
-
-//
-// Table of Contents
-//
-
-struct TocList {
-       int counter[6];
-       bool appendix;
-       TocList * next;
-};
-
-
-static TocList * toclist = 0;
-
-
-extern "C" void TocSelectCB(FL_OBJECT * ob, long)
-{
-       if (!current_view->available())
-               return;
-   
-       TocList * tmptoclist = toclist;
-       int i = fl_get_browser(ob);
-       for (int a = 1; a < i && tmptoclist->next; ++a) {
-               tmptoclist = tmptoclist->next;
-       }
-
-       if (!tmptoclist)
-               return;
-     
-
-       LyXParagraph * par = current_view->buffer()->paragraph;
-       while (par && (par->GetFirstCounter(0) != tmptoclist->counter[0] ||
-                      par->GetFirstCounter(1) != tmptoclist->counter[1] ||
-                      par->GetFirstCounter(2) != tmptoclist->counter[2] ||
-                      par->GetFirstCounter(3) != tmptoclist->counter[3] ||
-                      par->GetFirstCounter(4) != tmptoclist->counter[4] ||
-                      par->GetFirstCounter(5) != tmptoclist->counter[5] ||
-                      par->appendix != tmptoclist->appendix)) {
-               par = par->LastPhysicalPar()->Next();
-       }
-   
-       if (par) {
-               current_view->beforeChange();
-               current_view->text->SetCursor(par, 0);
-               current_view->text->sel_cursor = 
-                       current_view->text->cursor;
-               current_view->update(0);
-       }
-       else {
-               WriteAlert(_("Error"), 
-                          _("Couldn't find this label"), 
-                          _("in current document."));
-       }
-         
-}
-
-
-extern "C" void TocCancelCB(FL_OBJECT *, long)
-{
-       fl_hide_form(fd_form_toc->form_toc);
-}
-
-
-extern "C" void TocUpdateCB(FL_OBJECT *, long)
-{
-       static LyXParagraph * stapar = 0;
-       TocList * tmptoclist = 0;
-   
-       /* deleted the toclist */ 
-       if (toclist){
-               while (toclist){
-                       tmptoclist = toclist->next;
-                       delete toclist;
-                       toclist = tmptoclist;
-               }
-       }
-       toclist = 0;
-       tmptoclist = toclist;
-
-
-       fl_clear_browser(fd_form_toc->browser_toc);
-       if (!current_view->available()) {
-               fl_add_browser_line(fd_form_toc->browser_toc,
-                                   _("*** No Document ***"));
-               return;
-       }
-       fl_hide_object(fd_form_toc->browser_toc);
-       /* get the table of contents */ 
-       LyXParagraph * par = current_view->buffer()->paragraph;
-       char labeltype;
-       char * line = new char[200];
-       int pos = 0;
-       unsigned char c;
-       int topline = 0;
-   
-       if (stapar == par)
-               topline = fl_get_browser_topline(fd_form_toc->browser_toc);
-       stapar = par;
-   
-       while (par) {
-               labeltype = textclasslist.Style(current_view->buffer()->params.textclass, 
-                                               par->GetLayout()).labeltype;
-      
-               if (labeltype >= LABEL_COUNTER_CHAPTER
-                   && labeltype <= LABEL_COUNTER_CHAPTER +
-                   current_view->buffer()->params.tocdepth) {
-                       /* insert this into the table of contents */ 
-                       /* first indent a little bit */ 
-                       
-                       for (pos = 0; 
-                            pos < (labeltype - 
-                                   textclasslist.TextClass(current_view->buffer()->
-                                                           params.textclass).maxcounter()) * 4 + 2;
-                            ++pos)
-                               line[pos] = ' ';
-                       
-                       // Then the labestring
-                       if (!par->labelstring.empty()) {
-                               string::size_type i = 0;
-                               while (pos < 199 && i < par->labelstring.length()) {
-                                       line[pos] = par->labelstring[i];
-                                       ++i;
-                                       ++pos;
-                               }
-                       }
-        
-                       line[pos] = ' ';
-                       ++pos;
-                       
-                       /* now the contents */
-                       LyXParagraph::size_type i = 0;
-                       while (pos < 199 && i < par->size()) {
-                               c = par->GetChar(i);
-                               if (isprint(c) || c >= 128) {
-                                       line[pos] = c;
-                                       ++pos;
-                               }
-                               ++i;
-                       }
-                       line[pos] = '\0';
-                       fl_add_browser_line(fd_form_toc->browser_toc, line);
-                       
-                       /* make a toclist entry */
-                       if (!tmptoclist){
-                               tmptoclist = new TocList;
-                               toclist = tmptoclist;
-                       } else {
-                               tmptoclist->next = new TocList;
-                               tmptoclist = tmptoclist->next;
-                       }
-                       
-                       tmptoclist->next = 0;
-                       int a = 0;
-                       for (a = 0; a < 6; ++a) {
-                               tmptoclist->counter[a] = par->GetFirstCounter(a);
-                       }
-                       tmptoclist->appendix = par->appendix;
-               }
-               par = par->LastPhysicalPar()->Next();
-               
-       }
-       delete[] line;
-       fl_set_browser_topline(fd_form_toc->browser_toc, topline);
-       fl_show_object(fd_form_toc->browser_toc);
-}
-
-
-/* callbacks for form form_ref */
-extern "C" void RefSelectCB(FL_OBJECT *, long data)
-{
-       if (!current_view->available())
-               return;
-
-       string s = 
-               fl_get_browser_line(fd_form_ref->browser_ref,
-                                   fl_get_browser(fd_form_ref->browser_ref));
-       string u = frontStrip(strip(fl_get_input(fd_form_ref->ref_name)));
-
-       if (s.empty())
-               return;
-
-        if (data == 2) {
-                current_view->owner()->getLyXFunc()->Dispatch(LFUN_REFGOTO, s.c_str());
-               return;
-       }
-           
-       string t;
-       if (data == 0)
-               t += "\\ref";
-       else
-               t += "\\pageref";
-
-       if(current_view->buffer()->isSGML())
-               t += "[" + u + "]" + "{" + s + "}";
-       else
-               t += "{" + s + "}";
-
-       Inset * new_inset = 
-               new InsetRef(t, current_view->buffer());
-       current_view->insertInset(new_inset);
-}
-
-
-extern "C" void RefUpdateCB(FL_OBJECT *, long)
-{
-       if (!current_view->available()) {
-               fl_clear_browser(fd_form_ref->browser_ref);
-               return;
-       }
-
-       FL_OBJECT * brow = fd_form_ref->browser_ref;
-
-       // Get the current line, in order to restore it later
-       char const * const btmp = fl_get_browser_line(brow,
-                                                     fl_get_browser(brow));
-       string currentstr = btmp ? btmp : "";
-
-       fl_clear_browser(brow);
-
-       string refs = current_view->buffer()->getReferenceList('\n');
-       int topline = 1;
-
-       fl_addto_browser_chars(brow, refs.c_str());
-       int total_lines = fl_get_browser_maxline(brow);
-       for (int i = 1; i <= total_lines ; ++i) {
-               if (fl_get_browser_line(brow, i) == currentstr) {
-                       topline = i;
-                       break;
-               }
-       }
-       fl_set_browser_topline(brow, topline);
-
-       if (!fl_get_browser_maxline(brow)) {
-               fl_add_browser_line(brow, 
-                                   _("*** No labels found in document ***"));
-               fl_deactivate_object(brow);
-       } else {
-               fl_select_browser_line(brow, topline);
-               fl_activate_object(brow);
-       }
-       if (current_view->buffer()->isReadonly()) {
-               // would be better to de/activate insert buttons
-               // but that's more work... besides this works. ARRae
-               fl_hide_form(fd_form_ref->form_ref);
-       }
-       if (!current_view->buffer()->isSGML()) {
-               fl_deactivate_object(fd_form_ref->ref_name);
-               fl_set_object_lcol(fd_form_ref->ref_name, FL_INACTIVE);
-       }
-       else {
-               fl_activate_object(fd_form_ref->ref_name);
-               fl_set_object_lcol(fd_form_ref->ref_name, FL_BLACK);
-       }
-}
-
-
-extern "C" void RefHideCB(FL_OBJECT *, long)
-{
-       fl_hide_form(fd_form_ref->form_ref);
-}