]> git.lyx.org Git - lyx.git/blobdiff - src/LyXFunc.cpp
* src/LyXRC.{cpp,h}:
[lyx.git] / src / LyXFunc.cpp
index ffcb368da6935c53629489e461cec3ec6f53ce8c..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"
@@ -107,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;
 
@@ -136,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)
@@ -292,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));
@@ -383,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
@@ -391,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.
@@ -503,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:
@@ -517,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:
@@ -534,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;
 
@@ -572,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())
@@ -583,7 +652,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                        }
                }
                else if (name == "latexlog")
-                       enable = FileName(buf->getLogName().second).isFileReadable();
+                       enable = FileName(buf->logName()).isFileReadable();
                else if (name == "spellchecker")
 #if defined (USE_ASPELL) || defined (USE_ISPELL) || defined (USE_PSPELL)
                        enable = !buf->isReadonly();
@@ -665,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:
@@ -769,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);
@@ -895,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: {
@@ -928,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."));
@@ -955,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();
                                        }
@@ -970,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?"),
@@ -983,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:
@@ -1015,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: {
@@ -1039,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);
@@ -1049,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
@@ -1086,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;
                        }
 
@@ -1104,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()) {
@@ -1167,7 +1250,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        }
 
                        if (res != 0)
-                               showPrintError(buffer->fileName());
+                               showPrintError(buffer->absFileName());
                        break;
                }
 
@@ -1313,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;
 
@@ -1373,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;
@@ -1383,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 " +
@@ -1420,7 +1503,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                        // default type is requested
                                        data = "include";
                                InsetCommandParams p(INCLUDE_CODE, data);
-                               data = InsetIncludeMailer::params2string(p);
+                               data = InsetCommandMailer::params2string("include", p);
                                break;
                        } 
                        case BOX_CODE: {
@@ -1570,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");
@@ -1636,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()),
@@ -1663,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(
@@ -1778,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
@@ -2085,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());
 
@@ -2122,13 +2226,13 @@ void LyXFunc::open(string const & fname)
        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());
 
@@ -2199,11 +2303,10 @@ void LyXFunc::doImport(string const & argument)
                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 += " (*.";
@@ -2212,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());
 
@@ -2259,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?
 }
 
@@ -2276,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();
@@ -2315,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.