]> git.lyx.org Git - lyx.git/blobdiff - src/LyXFunc.cpp
* src/LyXRC.{cpp,h}:
[lyx.git] / src / LyXFunc.cpp
index a41f0b8c988139f332ce7d6e93e2d5962a1d4611..0300b52b7597f5c216f8ceb985aca50f244fb15c 100644 (file)
@@ -28,7 +28,8 @@
 #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"
@@ -39,7 +40,6 @@
 #include "FuncRequest.h"
 #include "FuncStatus.h"
 #include "gettext.h"
-#include "Importer.h"
 #include "InsetIterator.h"
 #include "Intl.h"
 #include "KeyMap.h"
@@ -106,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;
 
@@ -135,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)
@@ -382,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
@@ -390,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.
@@ -582,7 +652,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                        }
                }
                else if (name == "latexlog")
-                       enable = FileName(buf->logName().second).isFileReadable();
+                       enable = FileName(buf->logName()).isFileReadable();
                else if (name == "spellchecker")
 #if defined (USE_ASPELL) || defined (USE_ISPELL) || defined (USE_PSPELL)
                        enable = !buf->isReadonly();
@@ -664,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:
@@ -894,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: {
@@ -1316,7 +1403,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        break;
 
                case LFUN_SERVER_NOTIFY:
-                       dispatch_buffer = keyseq.print(false);
+                       dispatch_buffer = keyseq.print(KeySequence::Portable);
                        theServer().notifyClient(to_utf8(dispatch_buffer));
                        break;
 
@@ -1369,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()->logName();
-                               switch (logfile.first) {
+                               Buffer::LogType type; 
+                               string const logfile = lyx_view_->buffer()->logName(&type);
+                               switch (type) {
                                case Buffer::latexlog:
                                        data = "latex ";
                                        break;
@@ -1379,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 " +
@@ -1416,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: {
@@ -1632,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()),
@@ -1659,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(
@@ -2081,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,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());
 
@@ -2195,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 += " (*.";
@@ -2208,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());
 
@@ -2255,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?
 }
 
@@ -2311,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.