]> git.lyx.org Git - lyx.git/blobdiff - src/LyXFunc.cpp
adjust
[lyx.git] / src / LyXFunc.cpp
index 19f29fc80b10b4800ff257e120bb4f6454f7dbcc..b3d135fc5a50a55114f2dde8e642de4aa46a8987 100644 (file)
 #include "LyXFunc.h"
 
 #include "BranchList.h"
-#include "Buffer.h"
 #include "buffer_funcs.h"
+#include "Buffer.h"
 #include "BufferList.h"
 #include "BufferParams.h"
 #include "BufferView.h"
-#include "bufferview_funcs.h"
+#include "Color.h"
 #include "Cursor.h"
 #include "CutAndPaste.h"
 #include "debug.h"
 #include "Intl.h"
 #include "KeyMap.h"
 #include "Language.h"
-#include "Color.h"
-#include "Session.h"
-#include "LyX.h"
-#include "callback.h"
+#include "Lexer.h"
 #include "LyXAction.h"
 #include "lyxfind.h"
-#include "Lexer.h"
+#include "LyX.h"
 #include "LyXRC.h"
-#include "Row.h"
-#include "Server.h"
-#include "TextClassList.h"
 #include "LyXVC.h"
 #include "Paragraph.h"
-#include "ParIterator.h"
 #include "ParagraphParameters.h"
+#include "ParIterator.h"
+#include "Row.h"
+#include "Server.h"
+#include "Session.h"
+#include "TextClassList.h"
+#include "ToolbarBackend.h"
 #include "Undo.h"
 
 #include "insets/InsetBox.h"
@@ -90,7 +89,6 @@
 #include "support/environment.h"
 #include "support/FileFilterList.h"
 #include "support/filetools.h"
-#include "support/ForkedcallsController.h"
 #include "support/fs_extras.h"
 #include "support/lstrings.h"
 #include "support/Path.h"
@@ -115,8 +113,6 @@ namespace fs = boost::filesystem;
 
 namespace lyx {
 
-using bv_funcs::freefont2string;
-
 using frontend::LyXView;
 
 using support::absolutePath;
@@ -128,7 +124,6 @@ using support::contains;
 using support::FileFilterList;
 using support::FileName;
 using support::fileSearch;
-using support::ForkedcallsController;
 using support::i18nLibFileSearch;
 using support::isDirWriteable;
 using support::isFileReadable;
@@ -147,11 +142,46 @@ using support::prefixIs;
 
 namespace Alert = frontend::Alert;
 
+extern bool quitting;
 
 namespace {
 
-bool getLocalStatus(Cursor cursor,
-              FuncRequest const & cmd, FuncStatus & status)
+// This function runs "configure" and then rereads lyx.defaults to
+// reconfigure the automatic settings.
+void reconfigure(LyXView & lv, string const & option)
+{
+       // emit message signal.
+       lv.message(_("Running configure..."));
+
+       // Run configure in user lyx directory
+       support::Path p(package().user_support());
+       string configure_command = package().configure_command();
+       configure_command += option;
+       Systemcall one;
+       int ret = one.startscript(Systemcall::Wait, configure_command);
+       p.pop();
+       // emit message signal.
+       lv.message(_("Reloading configuration..."));
+       lyxrc.read(support::libFileSearch(string(), "lyxrc.defaults"));
+       // Re-read packages.lst
+       LaTeXFeatures::getAvailable();
+
+       if (ret)
+               Alert::information(_("System reconfiguration failed"),
+                          _("The system reconfiguration has failed.\n"
+                                 "Default textclass is used but LyX may "
+                                 "not be able to work properly.\n"
+                                 "Please reconfigure again if needed."));
+       else
+
+               Alert::information(_("System reconfigured"),
+                          _("The system has been reconfigured.\n"
+                            "You need to restart LyX to make use of any\n"
+                            "updated document class specifications."));
+}
+
+
+bool getLocalStatus(Cursor cursor, FuncRequest const & cmd, FuncStatus & status)
 {
        // Try to fix cursor in case it is broken.
        cursor.fixIfBroken();
@@ -203,18 +233,17 @@ Change::Type lookupChangeType(DocIterator const & dit, bool outer = false)
 
 }
 
+
 LyXFunc::LyXFunc()
-       : lyx_view_(0),
-       encoded_last_key(0),
-       meta_fake_bit(key_modifier::none)
+       : lyx_view_(0), encoded_last_key(0), meta_fake_bit(NoModifier)
 {
 }
 
 
 void LyXFunc::initKeySequences(KeyMap * kb)
 {
-       keyseq.reset(new KeySequence(kb, kb));
-       cancel_meta_seq.reset(new KeySequence(kb, kb));
+       keyseq = KeySequence(kb, kb);
+       cancel_meta_seq = KeySequence(kb, kb);
 }
 
 
@@ -232,7 +261,7 @@ void LyXFunc::handleKeyFunc(kb_action action)
 {
        char_type c = encoded_last_key;
 
-       if (keyseq->length())
+       if (keyseq.length())
                c = 0;
 
        BOOST_ASSERT(lyx_view_ && lyx_view_->view());
@@ -240,10 +269,10 @@ void LyXFunc::handleKeyFunc(kb_action action)
                c, get_accent(action).accent, view()->cursor().innerText(), view()->cursor());
        // Need to clear, in case the minibuffer calls these
        // actions
-       keyseq->clear();
+       keyseq.clear();
        // copied verbatim from do_accent_char
        view()->cursor().resetAnchor();
-       view()->update();
+       view()->processUpdateFlags(Update::FitCursor);
 }
 
 
@@ -293,77 +322,87 @@ void LyXFunc::gotoBookmark(unsigned int idx, bool openFile, bool switchToBuffer)
 }
 
 
-void LyXFunc::processKeySym(KeySymbolPtr keysym, key_modifier::state state)
+namespace {
+void restartCursor(LyXView * lv)
 {
-       LYXERR(Debug::KEY) << "KeySym is " << keysym->getSymbolName() << endl;
+       /* When we move around, or type, it's nice to be able to see
+        * the cursor immediately after the keypress.
+        */
+       if (lv && lv->currentWorkArea())
+               lv->currentWorkArea()->startBlinkingCursor();
+}
+}
+
+void LyXFunc::processKeySym(KeySymbol const & keysym, KeyModifier state)
+{
+       LYXERR(Debug::KEY) << "KeySym is " << keysym.getSymbolName() << endl;
 
        // Do nothing if we have nothing (JMarc)
-       if (!keysym->isOK()) {
+       if (!keysym.isOK()) {
                LYXERR(Debug::KEY) << "Empty kbd action (probably composing)"
                                   << endl;
+               restartCursor(lyx_view_);
                return;
        }
 
-       if (keysym->isModifier()) {
+       if (keysym.isModifier()) {
                LYXERR(Debug::KEY) << "isModifier true" << endl;
+               restartCursor(lyx_view_);
                return;
        }
 
        //Encoding const * encoding = view()->cursor().getEncoding();
-       //encoded_last_key = keysym->getISOEncoded(encoding ? encoding->name() : "");
+       //encoded_last_key = keysym.getISOEncoded(encoding ? encoding->name() : "");
        // FIXME: encoded_last_key shadows the member variable of the same
        // name. Is that intended?
-       char_type encoded_last_key = keysym->getUCSEncoded();
+       char_type encoded_last_key = keysym.getUCSEncoded();
 
        // Do a one-deep top-level lookup for
        // cancel and meta-fake keys. RVDK_PATCH_5
-       cancel_meta_seq->reset();
+       cancel_meta_seq.reset();
 
-       FuncRequest func = cancel_meta_seq->addkey(keysym, state);
+       FuncRequest func = cancel_meta_seq.addkey(keysym, state);
        LYXERR(Debug::KEY) << BOOST_CURRENT_FUNCTION
                           << " action first set to [" << func.action << ']'
                           << endl;
 
        // When not cancel or meta-fake, do the normal lookup.
        // Note how the meta_fake Mod1 bit is OR-ed in and reset afterwards.
-       // Mostly, meta_fake_bit = key_modifier::none. RVDK_PATCH_5.
+       // Mostly, meta_fake_bit = NoModifier. RVDK_PATCH_5.
        if ((func.action != LFUN_CANCEL) && (func.action != LFUN_META_PREFIX)) {
                // remove Caps Lock and Mod2 as a modifiers
-               func = keyseq->addkey(keysym, (state | meta_fake_bit));
+               func = keyseq.addkey(keysym, (state | meta_fake_bit));
                LYXERR(Debug::KEY) << BOOST_CURRENT_FUNCTION
                                   << "action now set to ["
                                   << func.action << ']' << endl;
        }
 
        // Dont remove this unless you know what you are doing.
-       meta_fake_bit = key_modifier::none;
+       meta_fake_bit = NoModifier;
 
        // Can this happen now ?
-       if (func.action == LFUN_NOACTION) {
+       if (func.action == LFUN_NOACTION)
                func = FuncRequest(LFUN_COMMAND_PREFIX);
-       }
 
        LYXERR(Debug::KEY) << BOOST_CURRENT_FUNCTION
               << " Key [action="
               << func.action << "]["
-              << to_utf8(keyseq->print(false)) << ']'
+              << to_utf8(keyseq.print(false)) << ']'
               << endl;
 
        // already here we know if it any point in going further
        // why not return already here if action == -1 and
        // num_bytes == 0? (Lgb)
 
-       if (keyseq->length() > 1) {
-               lyx_view_->message(keyseq->print(true));
-       }
+       if (keyseq.length() > 1)
+               lyx_view_->message(keyseq.print(true));
 
 
        // Maybe user can only reach the key via holding down shift.
        // Let's see. But only if shift is the only modifier
-       if (func.action == LFUN_UNKNOWN_ACTION &&
-           state == key_modifier::shift) {
+       if (func.action == LFUN_UNKNOWN_ACTION && state == ShiftModifier) {
                LYXERR(Debug::KEY) << "Trying without shift" << endl;
-               func = keyseq->addkey(keysym, key_modifier::none);
+               func = keyseq.addkey(keysym, NoModifier);
                LYXERR(Debug::KEY) << "Action now " << func.action << endl;
        }
 
@@ -371,13 +410,14 @@ void LyXFunc::processKeySym(KeySymbolPtr keysym, key_modifier::state state)
                // Hmm, we didn't match any of the keysequences. See
                // if it's normal insertable text not already covered
                // by a binding
-               if (keysym->isText() && keyseq->length() == 1) {
+               if (keysym.isText() && keyseq.length() == 1) {
                        LYXERR(Debug::KEY) << "isText() is true, inserting." << endl;
                        func = FuncRequest(LFUN_SELF_INSERT,
                                           FuncRequest::KEYBOARD);
                } else {
                        LYXERR(Debug::KEY) << "Unknown, !isText() - giving up" << endl;
                        lyx_view_->message(_("Unknown function."));
+                       restartCursor(lyx_view_);
                        return;
                }
        }
@@ -394,11 +434,7 @@ void LyXFunc::processKeySym(KeySymbolPtr keysym, key_modifier::state state)
                dispatch(func);
        }
 
-       /* When we move around, or type, it's nice to be able to see
-        * the cursor immediately after the keypress.
-        */
-       if (lyx_view_ && lyx_view_->currentWorkArea())
-               lyx_view_->currentWorkArea()->startBlinkingCursor();
+       restartCursor(lyx_view_);
 }
 
 
@@ -407,8 +443,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
        //lyxerr << "LyXFunc::getStatus: cmd: " << cmd << endl;
        FuncStatus flag;
 
-       Cursor & cur = view()->cursor();
-
        /* In LyX/Mac, when a dialog is open, the menus of the
           application can still be accessed without giving focus to
           the main window. In this case, we want to disable the menu
@@ -490,15 +524,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                enable = Exporter::isExportable(*buf, "program");
                break;
 
-       case LFUN_LAYOUT_TABULAR:
-               enable = cur.innerInsetOfType(Inset::TABULAR_CODE);
-               break;
-
-       case LFUN_LAYOUT:
-       case LFUN_LAYOUT_PARAGRAPH:
-               enable = !cur.inset().forceDefaultParagraphs(cur.idx());
-               break;
-
        case LFUN_VC_REGISTER:
                enable = !buf->lyxvc().inUse();
                break;
@@ -517,49 +542,17 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                        && (!buf->isClean() || buf->isExternallyModified(Buffer::timestamp_method));
                break;
 
-       case LFUN_INSET_SETTINGS: {
-               enable = false;
-               if (!cur)
+       case LFUN_INSET_APPLY: {
+               if (!view()) {
+                       enable = false;
                        break;
-               Inset::Code code = cur.inset().lyxCode();
-               switch (code) {
-                       case Inset::TABULAR_CODE:
-                               enable = cmd.argument() == "tabular";
-                               break;
-                       case Inset::ERT_CODE:
-                               enable = cmd.argument() == "ert";
-                               break;
-                       case Inset::FLOAT_CODE:
-                               enable = cmd.argument() == "float";
-                               break;
-                       case Inset::WRAP_CODE:
-                               enable = cmd.argument() == "wrap";
-                               break;
-                       case Inset::NOTE_CODE:
-                               enable = cmd.argument() == "note";
-                               break;
-                       case Inset::BRANCH_CODE:
-                               enable = cmd.argument() == "branch";
-                               break;
-                       case Inset::BOX_CODE:
-                               enable = cmd.argument() == "box";
-                               break;
-                       case Inset::LISTINGS_CODE:
-                               enable = cmd.argument() == "listings";
-                               break;
-                       default:
-                               break;
                }
-               break;
-       }
-
-       case LFUN_INSET_APPLY: {
                string const name = cmd.getArg(0);
                Inset * inset = lyx_view_->getDialogs().getOpenInset(name);
                if (inset) {
                        FuncRequest fr(LFUN_INSET_MODIFY, cmd.argument());
                        FuncStatus fs;
-                       if (!inset->getStatus(cur, fr, fs)) {
+                       if (!inset->getStatus(view()->cursor(), fr, fs)) {
                                // Every inset is supposed to handle this
                                BOOST_ASSERT(false);
                        }
@@ -585,9 +578,14 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                else if (name == "print")
                        enable = Exporter::isExportable(*buf, "dvi")
                                && lyxrc.print_command != "none";
-               else if (name == "character")
-                       enable = cur.inset().lyxCode() != Inset::ERT_CODE &&
-                               cur.inset().lyxCode() != Inset::LISTINGS_CODE;
+               else if (name == "character") {
+                       if (!view())
+                               enable = false;
+                       else {
+                               InsetCode ic = view()->cursor().inset().lyxCode();
+                               enable = ic != ERT_CODE && ic != LISTINGS_CODE;
+                       }
+               }
                else if (name == "latexlog")
                        enable = isFileReadable(FileName(buf->getLogName().second));
                else if (name == "spellchecker")
@@ -601,16 +599,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                break;
        }
 
-       case LFUN_DIALOG_SHOW_NEW_INSET:
-               enable = cur.inset().lyxCode() != Inset::ERT_CODE &&
-                       cur.inset().lyxCode() != Inset::LISTINGS_CODE;
-               if (cur.inset().lyxCode() == Inset::CAPTION_CODE) {
-                       FuncStatus flag;
-                       if (cur.inset().getStatus(cur, cmd, flag))
-                               return flag;
-               }
-               break;
-
        case LFUN_DIALOG_UPDATE: {
                string const name = cmd.getArg(0);
                if (!buf)
@@ -695,6 +683,8 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
        case LFUN_BUFFER_WRITE_AS:
        case LFUN_BUFFER_UPDATE:
        case LFUN_BUFFER_VIEW:
+       case LFUN_MASTER_BUFFER_UPDATE:
+       case LFUN_MASTER_BUFFER_VIEW:
        case LFUN_BUFFER_IMPORT:
        case LFUN_BUFFER_AUTO_SAVE:
        case LFUN_RECONFIGURE:
@@ -731,6 +721,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
        case LFUN_BUFFER_PARAMS_APPLY:
        case LFUN_LAYOUT_MODULES_CLEAR:
        case LFUN_LAYOUT_MODULE_ADD:
+       case LFUN_LAYOUT_RELOAD:
        case LFUN_LYXRC_APPLY:
        case LFUN_BUFFER_NEXT:
        case LFUN_BUFFER_PREVIOUS:
@@ -740,7 +731,11 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                break;
 
        default:
-               if (!getLocalStatus(cur, cmd, flag))
+               if (!view()) {
+                       enable = false;
+                       break;
+               }
+               if (!getLocalStatus(view()->cursor(), cmd, flag))
                        flag = view()->getStatus(cmd);
        }
 
@@ -756,7 +751,8 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
        }
 
        // Are we in a DELETED change-tracking region?
-       if (buf && lookupChangeType(cur, true) == Change::DELETED
+       if (buf && view() 
+               && lookupChangeType(view()->cursor(), true) == Change::DELETED
            && !lyxaction.funcHasFlag(cmd.action, LyXAction::ReadOnly)
            && !lyxaction.funcHasFlag(cmd.action, LyXAction::NoBuffer)) {
                flag.message(from_utf8(N_("This portion of the document is deleted.")));
@@ -803,7 +799,7 @@ void showPrintError(string const & name)
 }
 
 
-void loadTextclass(string const & name)
+void loadTextClass(string const & name)
 {
        std::pair<bool, textclass_type> const tc_pair =
                textclasslist.numberOfClass(name);
@@ -883,7 +879,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                case LFUN_COMMAND_PREFIX:
                        BOOST_ASSERT(lyx_view_);
-                       lyx_view_->message(keyseq->printOptions(true));
+                       lyx_view_->message(keyseq.printOptions(true));
                        break;
 
                case LFUN_COMMAND_EXECUTE:
@@ -893,8 +889,8 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                case LFUN_CANCEL:
                        BOOST_ASSERT(lyx_view_ && lyx_view_->view());
-                       keyseq->reset();
-                       meta_fake_bit = key_modifier::none;
+                       keyseq.reset();
+                       meta_fake_bit = NoModifier;
                        if (lyx_view_->buffer())
                                // cancel any selection
                                dispatch(FuncRequest(LFUN_MARK_OFF));
@@ -902,18 +898,19 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        break;
 
                case LFUN_META_PREFIX:
-                       meta_fake_bit = key_modifier::alt;
-                       setMessage(keyseq->print(true));
+                       meta_fake_bit = AltModifier;
+                       setMessage(keyseq.print(true));
                        break;
 
-               case LFUN_BUFFER_TOGGLE_READ_ONLY:
+               case LFUN_BUFFER_TOGGLE_READ_ONLY: {
                        BOOST_ASSERT(lyx_view_ && lyx_view_->view() && lyx_view_->buffer());
-                       if (lyx_view_->buffer()->lyxvc().inUse())
-                               lyx_view_->buffer()->lyxvc().toggleReadOnly();
+                       Buffer * buf = lyx_view_->buffer();
+                       if (buf->lyxvc().inUse())
+                               buf->lyxvc().toggleReadOnly();
                        else
-                               lyx_view_->buffer()->setReadonly(
-                                       !lyx_view_->buffer()->isReadonly());
+                               buf->setReadonly(!lyx_view_->buffer()->isReadonly());
                        break;
+               }
 
                // --- Menus -----------------------------------------------
                case LFUN_BUFFER_NEW:
@@ -937,17 +934,17 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                docstring const str = bformat(_("Saving document %1$s..."),
                                         makeDisplayPath(lyx_view_->buffer()->fileName()));
                                lyx_view_->message(str);
-                               menuWrite(lyx_view_->buffer());
+                               lyx_view_->buffer()->menuWrite();
                                lyx_view_->message(str + _(" done."));
                        } else {
-                               writeAs(lyx_view_->buffer());
+                               lyx_view_->buffer()->writeAs();
                        }
                        updateFlags = Update::None;
                        break;
 
                case LFUN_BUFFER_WRITE_AS:
                        BOOST_ASSERT(lyx_view_ && lyx_view_->buffer());
-                       writeAs(lyx_view_->buffer(), argument);
+                       lyx_view_->buffer()->writeAs(argument);
                        updateFlags = Update::None;
                        break;
 
@@ -961,10 +958,10 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                do {
                                        if (!b->isClean()) {
                                                if (!b->isUnnamed()) {
-                                                       menuWrite(b);
+                                                       b->menuWrite();
                                                        lyxerr[Debug::ACTION] << "Saved " << b->fileName() << endl;
                                                } else
-                                                       writeAs(b);
+                                                       b->writeAs();
                                        }
                                        b = theBufferList().next(b);
                                } while (b != first); 
@@ -998,6 +995,16 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        Exporter::preview(lyx_view_->buffer(), argument);
                        break;
 
+               case LFUN_MASTER_BUFFER_UPDATE:
+                       BOOST_ASSERT(lyx_view_ && lyx_view_->buffer() && lyx_view_->buffer()->getMasterBuffer());
+                       Exporter::Export(lyx_view_->buffer()->getMasterBuffer(), argument, true);
+                       break;
+
+               case LFUN_MASTER_BUFFER_VIEW:
+                       BOOST_ASSERT(lyx_view_ && lyx_view_->buffer() && lyx_view_->buffer()->getMasterBuffer());
+                       Exporter::preview(lyx_view_->buffer()->getMasterBuffer(), argument);
+                       break;
+
                case LFUN_BUILD_PROGRAM:
                        BOOST_ASSERT(lyx_view_ && lyx_view_->buffer());
                        Exporter::Export(lyx_view_->buffer(), "program", true);
@@ -1089,7 +1096,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        }
 
                        // Push directory path.
-                       string const path(buffer->temppath());
+                       string const path = buffer->temppath();
                        // Prevent the compiler from optimizing away p
                        FileName pp(path);
                        support::Path p(pp);
@@ -1181,12 +1188,13 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        break;
 
                case LFUN_BUFFER_AUTO_SAVE:
-                       autoSave(view());
+                       lyx_view_->buffer()->autoSave();
                        break;
 
                case LFUN_RECONFIGURE:
                        BOOST_ASSERT(lyx_view_);
-                       reconfigure(*lyx_view_);
+                       // argument is any additional parameter to the configure.py command
+                       reconfigure(*lyx_view_, argument);
                        break;
 
                case LFUN_HELP_OPEN: {
@@ -1279,11 +1287,16 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        updateFlags = Update::None;
                        break;
 
-               case LFUN_FILE_NEW:
+               case LFUN_FILE_NEW: {
                        BOOST_ASSERT(lyx_view_);
-                       newFile(*lyx_view_, argument);
+                       string name;
+                       string tmpname = split(argument, name, ':'); // Split filename
+                       Buffer * const b = newFile(name, tmpname);
+                       if (b)
+                               lyx_view_->setBuffer(b);
                        updateFlags = Update::None;
                        break;
+               }
 
                case LFUN_FILE_OPEN:
                        BOOST_ASSERT(lyx_view_);
@@ -1311,7 +1324,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        break;
 
                case LFUN_SERVER_NOTIFY:
-                       dispatch_buffer = keyseq->print(false);
+                       dispatch_buffer = keyseq.print(false);
                        theServer().notifyClient(to_utf8(dispatch_buffer));
                        break;
 
@@ -1396,7 +1409,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                            name == "nomenclature" ||
                            name == "ref" ||
                            name == "toc" ||
-                           name == "url") {
+                           name == "href") {
                                InsetCommandParams p(name);
                                data = InsetCommandMailer::params2string(name, p);
                        } else if (name == "include") {
@@ -1415,7 +1428,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                InsetBranchParams p;
                                data = InsetBranchMailer::params2string(p);
                        } else if (name == "citation") {
-                               InsetCommandParams p("cite");
+                               InsetCommandParams p("citation");
                                data = InsetCommandMailer::params2string(name, p);
                        } else if (name == "ert") {
                                data = InsetERTMailer::params2string(InsetCollapsable::Open);
@@ -1495,7 +1508,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                        arg = token(argument, '|', 0);
                                        opt1 = token(argument, '|', 1);
                                }
-                               InsetCommandParams icp("cite");
+                               InsetCommandParams icp("citation");
                                icp["key"] = from_utf8(arg);
                                if (!opt1.empty())
                                        icp["before"] = from_utf8(opt1);
@@ -1681,8 +1694,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        BOOST_ASSERT(lyx_view_);
                        string action;
                        string const name = split(argument, action, ' ');
-                       Inset::Code const inset_code =
-                               Inset::translate(name);
+                       InsetCode const inset_code = insetCode(name);
 
                        Cursor & cur = view()->cursor();
                        FuncRequest fr(LFUN_INSET_TOGGLE, action);
@@ -1692,7 +1704,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        InsetIterator const end = inset_iterator_end(inset);
                        for (; it != end; ++it) {
                                if (!it->asInsetMath()
-                                   && (inset_code == Inset::NO_CODE
+                                   && (inset_code == NO_CODE
                                    || inset_code == it->lyxCode())) {
                                        Cursor tmpcur = cur;
                                        tmpcur.pushLeft(*it);
@@ -1745,47 +1757,66 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                case LFUN_BUFFER_PARAMS_APPLY: {
                        BOOST_ASSERT(lyx_view_);
-                       biblio::CiteEngine const engine =
-                               lyx_view_->buffer()->params().getEngine();
+                       biblio::CiteEngine const oldEngine =
+                                       lyx_view_->buffer()->params().getEngine();
+                       
+                       Buffer * buffer = lyx_view_->buffer();
 
+                       TextClassPtr oldClass = buffer->params().getTextClassPtr();
+                       recordUndoFullDocument(view());
+                       
                        istringstream ss(argument);
                        Lexer lex(0,0);
                        lex.setStream(ss);
-                       int const unknown_tokens =
-                               lyx_view_->buffer()->readHeader(lex);
+                       int const unknown_tokens = buffer->readHeader(lex);
 
                        if (unknown_tokens != 0) {
                                lyxerr << "Warning in LFUN_BUFFER_PARAMS_APPLY!\n"
-                                      << unknown_tokens << " unknown token"
-                                      << (unknown_tokens == 1 ? "" : "s")
-                                      << endl;
+                                               << unknown_tokens << " unknown token"
+                                               << (unknown_tokens == 1 ? "" : "s")
+                                               << endl;
                        }
-                       if (engine == lyx_view_->buffer()->params().getEngine())
-                               break;
-
-                       Cursor & cur = view()->cursor();
-                       FuncRequest fr(LFUN_INSET_REFRESH);
-
-                       Inset & inset = lyx_view_->buffer()->inset();
-                       InsetIterator it  = inset_iterator_begin(inset);
-                       InsetIterator const end = inset_iterator_end(inset);
-                       for (; it != end; ++it)
-                               if (it->lyxCode() == Inset::CITE_CODE)
-                                       it->dispatch(cur, fr);
+                       
+                       updateLayout(oldClass, buffer);
+                       
+                       biblio::CiteEngine const newEngine =
+                                       lyx_view_->buffer()->params().getEngine();
+                       
+                       if (oldEngine != newEngine) {
+                               Cursor & cur = view()->cursor();
+                               FuncRequest fr(LFUN_INSET_REFRESH);
+       
+                               Inset & inset = lyx_view_->buffer()->inset();
+                               InsetIterator it  = inset_iterator_begin(inset);
+                               InsetIterator const end = inset_iterator_end(inset);
+                               for (; it != end; ++it)
+                                       if (it->lyxCode() == CITE_CODE)
+                                               it->dispatch(cur, fr);
+                       }
+                       
+                       updateFlags = Update::Force | Update::FitCursor;
                        break;
                }
                
                case LFUN_LAYOUT_MODULES_CLEAR: {
                        BOOST_ASSERT(lyx_view_);
-                       lyx_view_->buffer()->params().clearLayoutModules();
-                       updateFlags = Update::Force;
+                       Buffer * buffer = lyx_view_->buffer();
+                       TextClassPtr oldClass = buffer->params().getTextClassPtr();
+                       recordUndoFullDocument(view());
+                       buffer->params().clearLayoutModules();
+                       updateLayout(oldClass, buffer);
+                       updateFlags = Update::Force | Update::FitCursor;
                        break;
                }
                
                case LFUN_LAYOUT_MODULE_ADD: {
                        BOOST_ASSERT(lyx_view_);
-                       lyx_view_->buffer()->params().addLayoutModule(argument);
-                       updateFlags = Update::Force;
+                       Buffer * buffer = lyx_view_->buffer();
+                       TextClassPtr oldClass = buffer->params().getTextClassPtr();
+                       recordUndoFullDocument(view());
+                       buffer->params().addLayoutModule(argument);
+                       updateLayout(oldClass, buffer);
+                       updateFlags = Update::Force | Update::FitCursor;
                        break;
                }
 
@@ -1793,7 +1824,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        BOOST_ASSERT(lyx_view_);
                        Buffer * buffer = lyx_view_->buffer();
 
-                       loadTextclass(argument);
+                       loadTextClass(argument);
 
                        std::pair<bool, textclass_type> const tc_pair =
                                textclasslist.numberOfClass(argument);
@@ -1808,28 +1839,29 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                // nothing to do
                                break;
 
-                       lyx_view_->message(_("Converting document to new document class..."));
-                       recordUndoFullDocument(view());
                        //Save the old, possibly modular, layout for use in conversion.
-                       TextClass_ptr oldClass = buffer->params().getTextClass_ptr();
+                       TextClassPtr oldClass = buffer->params().getTextClassPtr();
+                       recordUndoFullDocument(view());
                        buffer->params().setBaseClass(new_class);
-                       
-                       StableDocIterator backcur(view()->cursor());
-                       ErrorList & el = buffer->errorList("Class Switch");
-                       cap::switchBetweenClasses(
-                               oldClass, buffer->params().getTextClass_ptr(),
-                               static_cast<InsetText &>(buffer->inset()), el);
-
-                       view()->setCursor(backcur.asDocIterator(&(buffer->inset())));
-
-                       buffer->errors("Class Switch");
-                       updateLabels(*buffer);
+                       updateLayout(oldClass, buffer);
+                       updateFlags = Update::Force | Update::FitCursor;
+                       break;
+               }
+               
+               case LFUN_LAYOUT_RELOAD: {
+                       BOOST_ASSERT(lyx_view_);
+                       Buffer * buffer = lyx_view_->buffer();
+                       TextClassPtr oldClass = buffer->params().getTextClassPtr();
+                       textclass_type const tc = buffer->params().getBaseClass();
+                       textclasslist.reset(tc);
+                       buffer->params().setBaseClass(tc);
+                       updateLayout(oldClass, buffer);
                        updateFlags = Update::Force | Update::FitCursor;
                        break;
                }
 
                case LFUN_TEXTCLASS_LOAD:
-                       loadTextclass(argument);
+                       loadTextClass(argument);
                        break;
 
                case LFUN_LYXRC_APPLY: {
@@ -1919,13 +1951,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        // also initializes the position cache for all insets in
                        // (at least partially) visible top-level paragraphs.
                        // We will redraw the screen only if needed.
-                       if (view()->update(updateFlags)) {
-                               // Buffer::changed() signals that a repaint is needed.
-                               // The frontend (WorkArea) knows which area to repaint
-                               // thanks to the ViewMetricsInfo updated above.
-                               lyx_view_->buffer()->changed();
-                       }
-
+                       view()->processUpdateFlags(updateFlags);
                        lyx_view_->updateStatusBar();
 
                        // if we executed a mutating lfun, mark the buffer as dirty
@@ -2257,12 +2283,12 @@ docstring const LyXFunc::viewStatusMessage()
 {
        // When meta-fake key is pressed, show the key sequence so far + "M-".
        if (wasMetaKey())
-               return keyseq->print(true) + "M-";
+               return keyseq.print(true) + "M-";
 
        // Else, when a non-complete key sequence is pressed,
        // show the available options.
-       if (keyseq->length() > 0 && !keyseq->deleted())
-               return keyseq->printOptions(true);
+       if (keyseq.length() > 0 && !keyseq.deleted())
+               return keyseq.printOptions(true);
 
        BOOST_ASSERT(lyx_view_);
        if (!lyx_view_->buffer())
@@ -2281,7 +2307,25 @@ BufferView * LyXFunc::view() const
 
 bool LyXFunc::wasMetaKey() const
 {
-       return (meta_fake_bit != key_modifier::none);
+       return (meta_fake_bit != NoModifier);
+}
+
+
+void LyXFunc::updateLayout(TextClassPtr const & oldlayout,
+                           Buffer * buffer)
+{
+       lyx_view_->message(_("Converting document to new document class..."));
+       
+       StableDocIterator backcur(view()->cursor());
+       ErrorList & el = buffer->errorList("Class Switch");
+       cap::switchBetweenClasses(
+                       oldlayout, buffer->params().getTextClassPtr(),
+                       static_cast<InsetText &>(buffer->inset()), el);
+
+       view()->setCursor(backcur.asDocIterator(&(buffer->inset())));
+
+       buffer->errors("Class Switch");
+       updateLabels(*buffer);
 }