]> git.lyx.org Git - lyx.git/blobdiff - src/LyXFunc.cpp
cleanups: split Paragraph::Private::simpleTeXSpecialChars() in two. Remove two or...
[lyx.git] / src / LyXFunc.cpp
index fd787c22c0167343300654612c5f82d78c176194..ffcb368da6935c53629489e461cec3ec6f53ce8c 100644 (file)
@@ -59,7 +59,6 @@
 #include "Session.h"
 #include "TextClassList.h"
 #include "ToolbarBackend.h"
-#include "Undo.h"
 
 #include "insets/InsetBox.h"
 #include "insets/InsetBranch.h"
@@ -125,11 +124,8 @@ using support::FileFilterList;
 using support::FileName;
 using support::fileSearch;
 using support::i18nLibFileSearch;
-using support::isDirWriteable;
-using support::isFileReadable;
-using support::isStrInt;
-using support::makeAbsPath;
 using support::makeDisplayPath;
+using support::makeAbsPath;
 using support::package;
 using support::quoteName;
 using support::rtrim;
@@ -158,7 +154,7 @@ void reconfigure(LyXView & lv, string const & option)
        string configure_command = package().configure_command();
        configure_command += option;
        Systemcall one;
-       one.startscript(Systemcall::Wait, configure_command);
+       int ret = one.startscript(Systemcall::Wait, configure_command);
        p.pop();
        // emit message signal.
        lv.message(_("Reloading configuration..."));
@@ -166,7 +162,15 @@ void reconfigure(LyXView & lv, string const & option)
        // Re-read packages.lst
        LaTeXFeatures::getAvailable();
 
-       Alert::information(_("System reconfigured"),
+       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."));
@@ -314,6 +318,17 @@ void LyXFunc::gotoBookmark(unsigned int idx, bool openFile, bool switchToBuffer)
 }
 
 
+namespace {
+void restartCursor(LyXView * lv)
+{
+       /* 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;
@@ -322,11 +337,13 @@ void LyXFunc::processKeySym(KeySymbol const & keysym, KeyModifier state)
        if (!keysym.isOK()) {
                LYXERR(Debug::KEY) << "Empty kbd action (probably composing)"
                                   << endl;
+               restartCursor(lyx_view_);
                return;
        }
 
        if (keysym.isModifier()) {
                LYXERR(Debug::KEY) << "isModifier true" << endl;
+               restartCursor(lyx_view_);
                return;
        }
 
@@ -396,6 +413,7 @@ void LyXFunc::processKeySym(KeySymbol const & keysym, KeyModifier state)
                } else {
                        LYXERR(Debug::KEY) << "Unknown, !isText() - giving up" << endl;
                        lyx_view_->message(_("Unknown function."));
+                       restartCursor(lyx_view_);
                        return;
                }
        }
@@ -411,6 +429,8 @@ void LyXFunc::processKeySym(KeySymbol const & keysym, KeyModifier state)
        } else {
                dispatch(func);
        }
+
+       restartCursor(lyx_view_);
 }
 
 
@@ -470,8 +490,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                return flag;
        }
 
-       Cursor * cur = view()? &view()->cursor(): 0;
-
        // I would really like to avoid having this switch and rather try to
        // encode this in the function itself.
        // -- And I'd rather let an inset decide which LFUNs it is willing
@@ -502,15 +520,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                enable = Exporter::isExportable(*buf, "program");
                break;
 
-       case LFUN_LAYOUT_TABULAR:
-               enable = cur? cur->innerInsetOfType(Inset::TABULAR_CODE) : false;
-               break;
-
-       case LFUN_LAYOUT:
-       case LFUN_LAYOUT_PARAGRAPH:
-               enable = cur? !cur->inset().forceDefaultParagraphs(cur->idx()) : false;
-               break;
-
        case LFUN_VC_REGISTER:
                enable = !buf->lyxvc().inUse();
                break;
@@ -529,52 +538,17 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                        && (!buf->isClean() || buf->isExternallyModified(Buffer::timestamp_method));
                break;
 
-       case LFUN_INSET_SETTINGS: {
-               enable = false;
-               if (!cur)
-                       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: {
-               enable = false;
-               if (!cur)
+               if (!view()) {
+                       enable = false;
                        break;
+               }
                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);
                        }
@@ -591,9 +565,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                flag.setOnOff(lyx_view_->getDialogs().visible(cmd.getArg(0)));
                // fall through to set "enable"
        case LFUN_DIALOG_SHOW: {
-               enable = false;
-               if (!cur)
-                       break;
                string const name = cmd.getArg(0);
                if (!buf)
                        enable = name == "aboutlyx"
@@ -603,11 +574,16 @@ 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));
+                       enable = FileName(buf->getLogName().second).isFileReadable();
                else if (name == "spellchecker")
 #if defined (USE_ASPELL) || defined (USE_ISPELL) || defined (USE_PSPELL)
                        enable = !buf->isReadonly();
@@ -619,19 +595,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                break;
        }
 
-       case LFUN_DIALOG_SHOW_NEW_INSET:
-               enable = false;
-               if (!cur)
-                       break;
-               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)
@@ -764,10 +727,11 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                break;
 
        default:
-               enable = false;
-               if (!cur)
+               if (!view()) {
+                       enable = false;
                        break;
-               if (!getLocalStatus(*cur, cmd, flag))
+               }
+               if (!getLocalStatus(view()->cursor(), cmd, flag))
                        flag = view()->getStatus(cmd);
        }
 
@@ -783,8 +747,8 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
        }
 
        // Are we in a DELETED change-tracking region?
-       if (buf && cur 
-               && 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.")));
@@ -1185,7 +1149,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                FileName const filename(makeAbsPath(target_name,
                                                        lyx_view_->buffer()->filePath()));
                                FileName const dvifile(makeAbsPath(dviname, path));
-                               if (fs::exists(filename.toFilesystemEncoding())) {
+                               if (filename.exists()) {
                                        docstring text = bformat(
                                                _("The file %1$s already exists.\n\n"
                                                  "Do you want to overwrite that file?"),
@@ -1433,62 +1397,97 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                case LFUN_DIALOG_SHOW_NEW_INSET: {
                        BOOST_ASSERT(lyx_view_);
                        string const name = cmd.getArg(0);
+                       InsetCode code = insetCode(name);
                        string data = trim(to_utf8(cmd.argument()).substr(name.size()));
-                       if (name == "bibitem" ||
-                           name == "bibtex" ||
-                           name == "index" ||
-                           name == "label" ||
-                           name == "nomenclature" ||
-                           name == "ref" ||
-                           name == "toc" ||
-                           name == "url") {
-                               InsetCommandParams p(name);
+                       bool insetCodeOK = true;
+                       switch (code) {
+                       case BIBITEM_CODE:
+                       case BIBTEX_CODE:
+                       case INDEX_CODE:
+                       case LABEL_CODE:
+                       case NOMENCL_CODE:
+                       case REF_CODE:
+                       case TOC_CODE:
+                       case HYPERLINK_CODE: {
+                               InsetCommandParams p(code);
                                data = InsetCommandMailer::params2string(name, p);
-                       } else if (name == "include") {
+                               break;
+                       } 
+                       case INCLUDE_CODE: {
                                // data is the include type: one of "include",
                                // "input", "verbatiminput" or "verbatiminput*"
                                if (data.empty())
                                        // default type is requested
                                        data = "include";
-                               InsetCommandParams p(data);
+                               InsetCommandParams p(INCLUDE_CODE, data);
                                data = InsetIncludeMailer::params2string(p);
-                       } else if (name == "box") {
+                               break;
+                       } 
+                       case BOX_CODE: {
                                // \c data == "Boxed" || "Frameless" etc
                                InsetBoxParams p(data);
                                data = InsetBoxMailer::params2string(p);
-                       } else if (name == "branch") {
+                               break;
+                       } 
+                       case BRANCH_CODE: {
                                InsetBranchParams p;
                                data = InsetBranchMailer::params2string(p);
-                       } else if (name == "citation") {
-                               InsetCommandParams p("citation");
+                               break;
+                       } 
+                       case CITE_CODE: {
+                               InsetCommandParams p(CITE_CODE);
                                data = InsetCommandMailer::params2string(name, p);
-                       } else if (name == "ert") {
+                               break;
+                       } 
+                       case ERT_CODE: {
                                data = InsetERTMailer::params2string(InsetCollapsable::Open);
-                       } else if (name == "external") {
+                               break;
+                       } 
+                       case EXTERNAL_CODE: {
                                InsetExternalParams p;
                                Buffer const & buffer = *lyx_view_->buffer();
                                data = InsetExternalMailer::params2string(p, buffer);
-                       } else if (name == "float") {
+                               break;
+                       } 
+                       case FLOAT_CODE:  {
                                InsetFloatParams p;
                                data = InsetFloatMailer::params2string(p);
-                       } else if (name == "listings") {
+                               break;
+                       } 
+                       case LISTINGS_CODE: {
                                InsetListingsParams p;
                                data = InsetListingsMailer::params2string(p);
-                       } else if (name == "graphics") {
+                               break;
+                       } 
+                       case GRAPHICS_CODE: {
                                InsetGraphicsParams p;
                                Buffer const & buffer = *lyx_view_->buffer();
                                data = InsetGraphicsMailer::params2string(p, buffer);
-                       } else if (name == "note") {
+                               break;
+                       } 
+                       case NOTE_CODE: {
                                InsetNoteParams p;
                                data = InsetNoteMailer::params2string(p);
-                       } else if (name == "vspace") {
+                               break;
+                       } 
+                       case VSPACE_CODE: {
                                VSpace space;
                                data = InsetVSpaceMailer::params2string(space);
-                       } else if (name == "wrap") {
+                               break;
+                       } 
+                       case WRAP_CODE: {
                                InsetWrapParams p;
                                data = InsetWrapMailer::params2string(p);
+                               break;
                        }
-                       lyx_view_->getDialogs().show(name, data, 0);
+                       default:
+                               lyxerr << "Inset type '" << name << 
+                                       "' not recognized in LFUN_DIALOG_SHOW_NEW_INSET" << std:: endl;
+                               insetCodeOK = false;
+                               break;
+                       } // end switch(code)
+                       if (insetCodeOK)
+                               lyx_view_->getDialogs().show(name, data, 0);
                        break;
                }
 
@@ -1540,7 +1539,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                        arg = token(argument, '|', 0);
                                        opt1 = token(argument, '|', 1);
                                }
-                               InsetCommandParams icp("citation");
+                               InsetCommandParams icp(CITE_CODE);
                                icp["key"] = from_utf8(arg);
                                if (!opt1.empty())
                                        icp["before"] = from_utf8(opt1);
@@ -1726,8 +1725,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);
@@ -1737,7 +1735,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);
@@ -1796,7 +1794,9 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        Buffer * buffer = lyx_view_->buffer();
 
                        TextClassPtr oldClass = buffer->params().getTextClassPtr();
-                       recordUndoFullDocument(view());
+
+                       Cursor & cur = view()->cursor();
+                       cur.recordUndoFullDocument();
                        
                        istringstream ss(argument);
                        Lexer lex(0,0);
@@ -1816,14 +1816,13 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                        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() == Inset::CITE_CODE)
+                                       if (it->lyxCode() == CITE_CODE)
                                                it->dispatch(cur, fr);
                        }
                        
@@ -1835,7 +1834,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        BOOST_ASSERT(lyx_view_);
                        Buffer * buffer = lyx_view_->buffer();
                        TextClassPtr oldClass = buffer->params().getTextClassPtr();
-                       recordUndoFullDocument(view());
+                       view()->cursor().recordUndoFullDocument();
                        buffer->params().clearLayoutModules();
                        updateLayout(oldClass, buffer);
                        updateFlags = Update::Force | Update::FitCursor;
@@ -1846,7 +1845,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        BOOST_ASSERT(lyx_view_);
                        Buffer * buffer = lyx_view_->buffer();
                        TextClassPtr oldClass = buffer->params().getTextClassPtr();
-                       recordUndoFullDocument(view());
+                       view()->cursor().recordUndoFullDocument();
                        buffer->params().addLayoutModule(argument);
                        updateLayout(oldClass, buffer);
                        updateFlags = Update::Force | Update::FitCursor;
@@ -1874,7 +1873,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                        //Save the old, possibly modular, layout for use in conversion.
                        TextClassPtr oldClass = buffer->params().getTextClassPtr();
-                       recordUndoFullDocument(view());
+                       view()->cursor().recordUndoFullDocument();
                        buffer->params().setBaseClass(new_class);
                        updateLayout(oldClass, buffer);
                        updateFlags = Update::Force | Update::FitCursor;
@@ -2065,7 +2064,7 @@ void LyXFunc::menuNew(string const & name, bool fromTemplate)
        if (lyx_view_->buffer()) {
                string const trypath = lyx_view_->buffer()->filePath();
                // If directory is writeable, use this as default.
-               if (isDirWriteable(FileName(trypath)))
+               if (FileName(trypath).isDirWritable())
                        initpath = trypath;
        }
 
@@ -2075,7 +2074,7 @@ void LyXFunc::menuNew(string const & name, bool fromTemplate)
                filename = addName(lyxrc.document_path,
                            "newfile" + convert<string>(++newfile_number) + ".lyx");
                while (theBufferList().exists(filename) ||
-                      fs::is_readable(FileName(filename).toFilesystemEncoding())) {
+                      FileName(filename).isReadable()) {
                        ++newfile_number;
                        filename = addName(lyxrc.document_path,
                                           "newfile" +  convert<string>(newfile_number) +
@@ -2116,7 +2115,7 @@ void LyXFunc::open(string const & fname)
        if (lyx_view_->buffer()) {
                string const trypath = lyx_view_->buffer()->filePath();
                // If directory is writeable, use this as default.
-               if (isDirWriteable(FileName(trypath)))
+               if (FileName(trypath).isDirWritable())
                        initpath = trypath;
        }
 
@@ -2153,7 +2152,7 @@ void LyXFunc::open(string const & fname)
                filename = fullname.absFilename();
 
        // if the file doesn't exist, let the user create one
-       if (!fs::exists(fullname.toFilesystemEncoding())) {
+       if (!fullname.exists()) {
                // the user specifically chose this name. Believe him.
                Buffer * const b = newFile(filename, string(), true);
                if (b)
@@ -2193,7 +2192,7 @@ void LyXFunc::doImport(string const & argument)
                if (lyx_view_->buffer()) {
                        string const trypath = lyx_view_->buffer()->filePath();
                        // If directory is writeable, use this as default.
-                       if (isDirWriteable(FileName(trypath)))
+                       if (FileName(trypath).isDirWritable())
                                initpath = trypath;
                }
 
@@ -2245,7 +2244,7 @@ void LyXFunc::doImport(string const & argument)
 
        // if the file exists already, and we didn't do
        // -i lyx thefile.lyx, warn
-       if (fs::exists(lyxfile.toFilesystemEncoding()) && fullname != lyxfile) {
+       if (lyxfile.exists() && fullname != lyxfile) {
                docstring const file = makeDisplayPath(lyxfile.absFilename(), 30);
 
                docstring text = bformat(_("The document %1$s already exists.\n\n"
@@ -2401,9 +2400,8 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new)
        case LyXRC::RC_DISPLAY_GRAPHICS:
        case LyXRC::RC_DOCUMENTPATH:
                if (lyxrc_orig.document_path != lyxrc_new.document_path) {
-                       string const encoded = FileName(
-                               lyxrc_new.document_path).toFilesystemEncoding();
-                       if (fs::exists(encoded) && fs::is_directory(encoded))
+                       FileName path(lyxrc_new.document_path);
+                       if (path.exists() && path.isDirectory())
                                support::package().document_dir() = FileName(lyxrc.document_path);
                }
        case LyXRC::RC_ESC_CHARS: