]> git.lyx.org Git - lyx.git/blobdiff - src/LyXFunc.cpp
* src/LyXRC.{cpp,h}:
[lyx.git] / src / LyXFunc.cpp
index e0d370ed48482d7399f2ce7e6485d41084ee0d97..0300b52b7597f5c216f8ceb985aca50f244fb15c 100644 (file)
 #include "BufferList.h"
 #include "BufferParams.h"
 #include "BufferView.h"
-#include "Color.h"
+#include "CmdDef.h"
+#include "Converter.h"
 #include "Cursor.h"
 #include "CutAndPaste.h"
 #include "debug.h"
 #include "DispatchResult.h"
 #include "Encoding.h"
 #include "ErrorList.h"
-#include "Exporter.h"
 #include "Format.h"
 #include "FuncRequest.h"
 #include "FuncStatus.h"
 #include "gettext.h"
-#include "Importer.h"
 #include "InsetIterator.h"
 #include "Intl.h"
 #include "KeyMap.h"
@@ -59,7 +58,6 @@
 #include "Session.h"
 #include "TextClassList.h"
 #include "ToolbarBackend.h"
-#include "Undo.h"
 
 #include "insets/InsetBox.h"
 #include "insets/InsetBranch.h"
@@ -108,6 +106,8 @@ using std::pair;
 using std::string;
 using std::istringstream;
 using std::ostringstream;
+using std::find;
+using std::vector;
 
 namespace fs = boost::filesystem;
 
@@ -125,11 +125,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;
@@ -140,12 +137,80 @@ using support::token;
 using support::trim;
 using support::prefixIs;
 
+
 namespace Alert = frontend::Alert;
 
 extern bool quitting;
 
 namespace {
 
+
+bool import(LyXView * lv, FileName const & filename,
+                     string const & format, ErrorList & errorList)
+{
+       docstring const displaypath = makeDisplayPath(filename.absFilename());
+       lv->message(bformat(_("Importing %1$s..."), displaypath));
+
+       FileName const lyxfile(changeExtension(filename.absFilename(), ".lyx"));
+
+       string loader_format;
+       vector<string> loaders = theConverters().loaders();
+       if (find(loaders.begin(), loaders.end(), format) == loaders.end()) {
+               for (vector<string>::const_iterator it = loaders.begin();
+                    it != loaders.end(); ++it) {
+                       if (theConverters().isReachable(format, *it)) {
+                               string const tofile =
+                                       changeExtension(filename.absFilename(),
+                                               formats.extension(*it));
+                               if (!theConverters().convert(0, filename, FileName(tofile),
+                                                       filename, format, *it, errorList))
+                                       return false;
+                               loader_format = *it;
+                               break;
+                       }
+               }
+               if (loader_format.empty()) {
+                       frontend::Alert::error(_("Couldn't import file"),
+                                    bformat(_("No information for importing the format %1$s."),
+                                        formats.prettyName(format)));
+                       return false;
+               }
+       } else {
+               loader_format = format;
+       }
+
+
+       if (loader_format == "lyx") {
+               Buffer * buf = lv->loadLyXFile(lyxfile);
+               if (!buf) {
+                       // we are done
+                       lv->message(_("file not imported!"));
+                       return false;
+               }
+               updateLabels(*buf);
+               lv->setBuffer(buf);
+               lv->showErrorList("Parse");
+       } else {
+               Buffer * const b = newFile(lyxfile.absFilename(), string(), true);
+               if (b)
+                       lv->setBuffer(b);
+               else
+                       return false;
+               bool as_paragraphs = loader_format == "textparagraph";
+               string filename2 = (loader_format == format) ? filename.absFilename()
+                       : changeExtension(filename.absFilename(),
+                                         formats.extension(loader_format));
+               lv->view()->insertPlaintextFile(filename2, as_paragraphs);
+               lv->dispatch(FuncRequest(LFUN_MARK_OFF));
+       }
+
+       // we are done
+       lv->message(_("imported."));
+       return true;
+}
+
+
+
 // This function runs "configure" and then rereads lyx.defaults to
 // reconfigure the automatic settings.
 void reconfigure(LyXView & lv, string const & option)
@@ -296,7 +361,7 @@ void LyXFunc::gotoBookmark(unsigned int idx, bool openFile, bool switchToBuffer)
                return;
 
        // if the current buffer is not that one, switch to it.
-       if (lyx_view_->buffer()->fileName() != file) {
+       if (lyx_view_->buffer()->absFileName() != file) {
                if (!switchToBuffer)
                        return;
                dispatch(FuncRequest(LFUN_BUFFER_SWITCH, file));
@@ -387,7 +452,7 @@ void LyXFunc::processKeySym(KeySymbol const & keysym, KeyModifier state)
        LYXERR(Debug::KEY) << BOOST_CURRENT_FUNCTION
               << " Key [action="
               << func.action << "]["
-              << to_utf8(keyseq.print(false)) << ']'
+              << to_utf8(keyseq.print(KeySequence::Portable)) << ']'
               << endl;
 
        // already here we know if it any point in going further
@@ -395,7 +460,7 @@ void LyXFunc::processKeySym(KeySymbol const & keysym, KeyModifier state)
        // num_bytes == 0? (Lgb)
 
        if (keyseq.length() > 1)
-               lyx_view_->message(keyseq.print(true));
+               lyx_view_->message(keyseq.print(KeySequence::ForGui));
 
 
        // Maybe user can only reach the key via holding down shift.
@@ -507,13 +572,13 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
        case LFUN_BUFFER_SWITCH:
                // toggle on the current buffer, but do not toggle off
                // the other ones (is that a good idea?)
-               if (buf && to_utf8(cmd.argument()) == buf->fileName())
+               if (buf && to_utf8(cmd.argument()) == buf->absFileName())
                        flag.setOnOff(true);
                break;
 
        case LFUN_BUFFER_EXPORT:
                enable = cmd.argument() == "custom"
-                       || Exporter::isExportable(*buf, to_utf8(cmd.argument()));
+                       || buf->isExportable(to_utf8(cmd.argument()));
                break;
 
        case LFUN_BUFFER_CHKTEX:
@@ -521,7 +586,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                break;
 
        case LFUN_BUILD_PROGRAM:
-               enable = Exporter::isExportable(*buf, "program");
+               enable = buf->isExportable("program");
                break;
 
        case LFUN_VC_REGISTER:
@@ -538,7 +603,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                enable = buf->lyxvc().inUse();
                break;
        case LFUN_BUFFER_RELOAD:
-               enable = !buf->isUnnamed() && fs::exists(buf->fileName())
+               enable = !buf->isUnnamed() && fs::exists(buf->absFileName())
                        && (!buf->isClean() || buf->isExternallyModified(Buffer::timestamp_method));
                break;
 
@@ -576,7 +641,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                                || name == "prefs"
                                || name == "texinfo";
                else if (name == "print")
-                       enable = Exporter::isExportable(*buf, "dvi")
+                       enable = buf->isExportable("dvi")
                                && lyxrc.print_command != "none";
                else if (name == "character") {
                        if (!view())
@@ -587,7 +652,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                        }
                }
                else if (name == "latexlog")
-                       enable = isFileReadable(FileName(buf->getLogName().second));
+                       enable = FileName(buf->logName()).isFileReadable();
                else if (name == "spellchecker")
 #if defined (USE_ASPELL) || defined (USE_ISPELL) || defined (USE_PSPELL)
                        enable = !buf->isReadonly();
@@ -669,6 +734,23 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                FuncRequest func(lyxaction.lookupFunc(firstcmd));
                func.origin = cmd.origin;
                flag = getStatus(func);
+               break;
+       }
+
+       case LFUN_CALL: {
+               FuncRequest func;
+               std::string name(to_utf8(cmd.argument()));
+               if (LyX::ref().topLevelCmdDef().lock(name, func)) {
+                       func.origin = cmd.origin;
+                       flag = getStatus(func);
+                       LyX::ref().topLevelCmdDef().release(name);
+               } else {
+                       // catch recursion or unknown command definiton
+                       // all operations until the recursion or unknown command 
+                       // definiton occures are performed, so set the state to enabled
+                       enable = true;
+               }
+               break;
        }
 
        case LFUN_BUFFER_NEW:
@@ -773,7 +855,7 @@ bool LyXFunc::ensureBufferClean(BufferView * bv)
        if (buf.isClean())
                return true;
 
-       docstring const file = makeDisplayPath(buf.fileName(), 30);
+       docstring const file = makeDisplayPath(buf.absFileName(), 30);
        docstring text = bformat(_("The document %1$s has unsaved "
                                             "changes.\n\nDo you want to save "
                                             "the document?"), file);
@@ -899,7 +981,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                case LFUN_META_PREFIX:
                        meta_fake_bit = AltModifier;
-                       setMessage(keyseq.print(true));
+                       setMessage(keyseq.print(KeySequence::ForGui));
                        break;
 
                case LFUN_BUFFER_TOGGLE_READ_ONLY: {
@@ -932,7 +1014,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        BOOST_ASSERT(lyx_view_ && lyx_view_->buffer());
                        if (!lyx_view_->buffer()->isUnnamed()) {
                                docstring const str = bformat(_("Saving document %1$s..."),
-                                        makeDisplayPath(lyx_view_->buffer()->fileName()));
+                                        makeDisplayPath(lyx_view_->buffer()->absFileName()));
                                lyx_view_->message(str);
                                lyx_view_->buffer()->menuWrite();
                                lyx_view_->message(str + _(" done."));
@@ -959,7 +1041,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                        if (!b->isClean()) {
                                                if (!b->isUnnamed()) {
                                                        b->menuWrite();
-                                                       lyxerr[Debug::ACTION] << "Saved " << b->fileName() << endl;
+                                                       lyxerr[Debug::ACTION] << "Saved " << b->absFileName() << endl;
                                                } else
                                                        b->writeAs();
                                        }
@@ -974,7 +1056,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                case LFUN_BUFFER_RELOAD: {
                        BOOST_ASSERT(lyx_view_ && lyx_view_->buffer());
-                       docstring const file = makeDisplayPath(lyx_view_->buffer()->fileName(), 20);
+                       docstring const file = makeDisplayPath(lyx_view_->buffer()->absFileName(), 20);
                        docstring text = bformat(_("Any changes will be lost. Are you sure "
                                                             "you want to revert to the saved version of the document %1$s?"), file);
                        int const ret = Alert::prompt(_("Revert to saved document?"),
@@ -987,27 +1069,27 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                case LFUN_BUFFER_UPDATE:
                        BOOST_ASSERT(lyx_view_ && lyx_view_->buffer());
-                       Exporter::Export(lyx_view_->buffer(), argument, true);
+                       lyx_view_->buffer()->doExport(argument, true);
                        break;
 
                case LFUN_BUFFER_VIEW:
                        BOOST_ASSERT(lyx_view_ && lyx_view_->buffer());
-                       Exporter::preview(lyx_view_->buffer(), argument);
+                       lyx_view_->buffer()->preview(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);
+                       BOOST_ASSERT(lyx_view_ && lyx_view_->buffer() && lyx_view_->buffer()->masterBuffer());
+                       lyx_view_->buffer()->masterBuffer()->doExport(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);
+                       BOOST_ASSERT(lyx_view_ && lyx_view_->buffer() && lyx_view_->buffer()->masterBuffer());
+                       lyx_view_->buffer()->masterBuffer()->preview(argument);
                        break;
 
                case LFUN_BUILD_PROGRAM:
                        BOOST_ASSERT(lyx_view_ && lyx_view_->buffer());
-                       Exporter::Export(lyx_view_->buffer(), "program", true);
+                       lyx_view_->buffer()->doExport("program", true);
                        break;
 
                case LFUN_BUFFER_CHKTEX:
@@ -1019,9 +1101,8 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        BOOST_ASSERT(lyx_view_ && lyx_view_->buffer());
                        if (argument == "custom")
                                lyx_view_->getDialogs().show("sendto");
-                       else {
-                               Exporter::Export(lyx_view_->buffer(), argument, false);
-                       }
+                       else
+                               lyx_view_->buffer()->doExport(argument, false);
                        break;
 
                case LFUN_BUFFER_EXPORT_CUSTOM: {
@@ -1043,8 +1124,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                        // Output to filename
                        if (format->name() == "lyx") {
-                               string const latexname =
-                                       buffer->getLatexName(false);
+                               string const latexname = buffer->latexName(false);
                                filename = changeExtension(latexname,
                                                           format->extension());
                                filename = addName(buffer->temppath(), filename);
@@ -1053,7 +1133,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                        break;
 
                        } else {
-                               Exporter::Export(buffer, format_name, true, filename);
+                               buffer->doExport(format_name, true, filename);
                        }
 
                        // Substitute $$FName for filename
@@ -1090,8 +1170,8 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                        Buffer * buffer = lyx_view_->buffer();
 
-                       if (!Exporter::Export(buffer, "dvi", true)) {
-                               showPrintError(buffer->fileName());
+                       if (!buffer->doExport("dvi", true)) {
+                               showPrintError(buffer->absFileName());
                                break;
                        }
 
@@ -1108,8 +1188,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        Systemcall one;
                        int res = 0;
                        string const dviname =
-                               changeExtension(buffer->getLatexName(true),
-                                               "dvi");
+                               changeExtension(buffer->latexName(true), "dvi");
 
                        if (target == "printer") {
                                if (!lyxrc.print_spool_command.empty()) {
@@ -1153,7 +1232,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?"),
@@ -1171,7 +1250,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        }
 
                        if (res != 0)
-                               showPrintError(buffer->fileName());
+                               showPrintError(buffer->absFileName());
                        break;
                }
 
@@ -1317,14 +1396,14 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                // --- lyxserver commands ----------------------------
                case LFUN_SERVER_GET_NAME:
                        BOOST_ASSERT(lyx_view_ && lyx_view_->buffer());
-                       setMessage(from_utf8(lyx_view_->buffer()->fileName()));
+                       setMessage(from_utf8(lyx_view_->buffer()->absFileName()));
                        LYXERR(Debug::INFO) << "FNAME["
-                                                        << lyx_view_->buffer()->fileName()
+                                                        << lyx_view_->buffer()->absFileName()
                                                         << "] " << endl;
                        break;
 
                case LFUN_SERVER_NOTIFY:
-                       dispatch_buffer = keyseq.print(false);
+                       dispatch_buffer = keyseq.print(KeySequence::Portable);
                        theServer().notifyClient(to_utf8(dispatch_buffer));
                        break;
 
@@ -1377,9 +1456,9 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                if (!data.empty())
                                        lyx_view_->getDialogs().show("character", data);
                        } else if (name == "latexlog") {
-                               pair<Buffer::LogType, string> const logfile =
-                                       lyx_view_->buffer()->getLogName();
-                               switch (logfile.first) {
+                               Buffer::LogType type; 
+                               string const logfile = lyx_view_->buffer()->logName(&type);
+                               switch (type) {
                                case Buffer::latexlog:
                                        data = "latex ";
                                        break;
@@ -1387,7 +1466,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                        data = "literate ";
                                        break;
                                }
-                               data += Lexer::quoteString(logfile.second);
+                               data += Lexer::quoteString(logfile);
                                lyx_view_->getDialogs().show("log", data);
                        } else if (name == "vclog") {
                                string const data = "vc " +
@@ -1413,7 +1492,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        case REF_CODE:
                        case TOC_CODE:
                        case HYPERLINK_CODE: {
-                               InsetCommandParams p(name);
+                               InsetCommandParams p(code);
                                data = InsetCommandMailer::params2string(name, p);
                                break;
                        } 
@@ -1423,8 +1502,8 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                if (data.empty())
                                        // default type is requested
                                        data = "include";
-                               InsetCommandParams p("include", data);
-                               data = InsetIncludeMailer::params2string(p);
+                               InsetCommandParams p(INCLUDE_CODE, data);
+                               data = InsetCommandMailer::params2string("include", p);
                                break;
                        } 
                        case BOX_CODE: {
@@ -1439,7 +1518,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                break;
                        } 
                        case CITE_CODE: {
-                               InsetCommandParams p("cite");
+                               InsetCommandParams p(CITE_CODE);
                                data = InsetCommandMailer::params2string(name, p);
                                break;
                        } 
@@ -1543,7 +1622,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                        arg = token(argument, '|', 0);
                                        opt1 = token(argument, '|', 1);
                                }
-                               InsetCommandParams icp("cite");
+                               InsetCommandParams icp(CITE_CODE);
                                icp["key"] = from_utf8(arg);
                                if (!opt1.empty())
                                        icp["before"] = from_utf8(opt1);
@@ -1574,8 +1653,8 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                // Set the parent name of the child document.
                                // This makes insertion of citations and references in the child work,
                                // when the target is in the parent or another child document.
-                               child->setParentName(parent->fileName());
-                               updateLabels(*child->getMasterBuffer());
+                               child->setParentName(parent->absFileName());
+                               updateLabels(*child->masterBuffer());
                                lyx_view_->setBuffer(child);
                                if (parsed)
                                        lyx_view_->showErrorList("Parse");
@@ -1640,6 +1719,28 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        break;
                }
 
+               case LFUN_CALL: {
+                       FuncRequest func;
+                       if (LyX::ref().topLevelCmdDef().lock(argument, func)) {
+                               func.origin = cmd.origin;
+                               dispatch(func);
+                               LyX::ref().topLevelCmdDef().release(argument);
+                       } else {
+                               if (func.action == LFUN_UNKNOWN_ACTION) {
+                                       // unknown command definition
+                                       lyxerr << "Warning: unknown command definition `"
+                                                  << argument << "'"
+                                                  << endl;
+                               } else {
+                                       // recursion detected
+                                       lyxerr << "Warning: Recursion in the command definition `"
+                                                  << argument << "' detected"
+                                                  << endl;
+                               }
+                       }
+                       break;
+               }
+
                case LFUN_PREFERENCES_SAVE: {
                        lyxrc.write(makeAbsPath("preferences",
                                                package().user_support().absFilename()),
@@ -1667,8 +1768,8 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        }
 
                        bool const graphicsbg_changed =
-                               (lyx_name == lcolor.getLyXName(Color::graphicsbg) &&
-                                x11_name != lcolor.getX11Name(Color::graphicsbg));
+                               (lyx_name == lcolor.getLyXName(Color_graphicsbg) &&
+                                x11_name != lcolor.getX11Name(Color_graphicsbg));
 
                        if (!lcolor.setColor(lyx_name, x11_name)) {
                                setErrorMessage(
@@ -1782,7 +1883,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                       << endl;
                        }
 
-                       if (defaults.writeFile(FileName(defaults.fileName())))
+                       if (defaults.writeFile(FileName(defaults.absFileName())))
                                setMessage(bformat(_("Document defaults saved in %1$s"),
                                                   makeDisplayPath(fname)));
                        else
@@ -1798,7 +1899,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);
@@ -1818,7 +1921,6 @@ 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();
@@ -1837,7 +1939,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;
@@ -1848,7 +1950,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;
@@ -1876,7 +1978,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;
@@ -2067,7 +2169,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;
        }
 
@@ -2077,7 +2179,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) +
@@ -2088,13 +2190,12 @@ void LyXFunc::menuNew(string const & name, bool fromTemplate)
        // The template stuff
        string templname;
        if (fromTemplate) {
-               FileDialog fileDlg(_("Select template file"),
-                       LFUN_SELECT_FILE_SYNC,
-                       make_pair(_("Documents|#o#O"), from_utf8(lyxrc.document_path)),
-                       make_pair(_("Templates|#T#t"), from_utf8(lyxrc.template_path)));
+               FileDialog dlg(_("Select template file"));
+               dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path));
+               dlg.setButton1(_("Templates|#T#t"), from_utf8(lyxrc.template_path));
 
                FileDialog::Result result =
-                       fileDlg.open(from_utf8(lyxrc.template_path),
+                       dlg.open(from_utf8(lyxrc.template_path),
                                     FileFilterList(_("LyX Documents (*.lyx)")),
                                     docstring());
 
@@ -2118,20 +2219,20 @@ 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;
        }
 
        string filename;
 
        if (fname.empty()) {
-               FileDialog fileDlg(_("Select document to open"),
-                       LFUN_FILE_OPEN,
-                       make_pair(_("Documents|#o#O"), from_utf8(lyxrc.document_path)),
-                       make_pair(_("Examples|#E#e"), from_utf8(addPath(package().system_support().absFilename(), "examples"))));
+               FileDialog dlg(_("Select document to open"), LFUN_FILE_OPEN);
+               dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path));
+               dlg.setButton2(_("Examples|#E#e"),
+                               from_utf8(addPath(package().system_support().absFilename(), "examples")));
 
                FileDialog::Result result =
-                       fileDlg.open(from_utf8(initpath),
+                       dlg.open(from_utf8(initpath),
                                     FileFilterList(_("LyX Documents (*.lyx)")),
                                     docstring());
 
@@ -2155,7 +2256,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)
@@ -2195,18 +2296,17 @@ 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;
                }
 
                docstring const text = bformat(_("Select %1$s file to import"),
                        formats.prettyName(format));
 
-               FileDialog fileDlg(text,
-                       LFUN_BUFFER_IMPORT,
-                       make_pair(_("Documents|#o#O"), from_utf8(lyxrc.document_path)),
-                       make_pair(_("Examples|#E#e"),
-                                 from_utf8(addPath(package().system_support().absFilename(), "examples"))));
+               FileDialog dlg(text, LFUN_BUFFER_IMPORT);
+               dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path));
+               dlg.setButton2(_("Examples|#E#e"),
+                       from_utf8(addPath(package().system_support().absFilename(), "examples")));
 
                docstring filter = formats.prettyName(format);
                filter += " (*.";
@@ -2215,7 +2315,7 @@ void LyXFunc::doImport(string const & argument)
                filter += ')';
 
                FileDialog::Result result =
-                       fileDlg.open(from_utf8(initpath),
+                       dlg.open(from_utf8(initpath),
                                     FileFilterList(filter),
                                     docstring());
 
@@ -2247,7 +2347,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"
@@ -2262,7 +2362,7 @@ void LyXFunc::doImport(string const & argument)
        }
 
        ErrorList errorList;
-       Importer::Import(lyx_view_, fullname, format, errorList);
+       import(lyx_view_, fullname, format, errorList);
        // FIXME (Abdel 12/08/06): Is there a need to display the error list here?
 }
 
@@ -2279,7 +2379,7 @@ void LyXFunc::closeBuffer()
 
 void LyXFunc::reloadBuffer()
 {
-       FileName filename(lyx_view_->buffer()->fileName());
+       FileName filename(lyx_view_->buffer()->absFileName());
        docstring const disp_fn = makeDisplayPath(filename.absFilename());
        docstring str;
        closeBuffer();
@@ -2318,7 +2418,7 @@ 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(KeySequence::ForGui) + "M-";
 
        // Else, when a non-complete key sequence is pressed,
        // show the available options.
@@ -2403,9 +2503,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: