]> git.lyx.org Git - lyx.git/blobdiff - src/LyXFunc.cpp
cosmetics
[lyx.git] / src / LyXFunc.cpp
index 0e78caf8f2a5ebdfc1c2ee2a9f5c7bcaa7d8e2e4..ce6df25bcc8f1715441fe7cdaabaa556ba0a9ba7 100644 (file)
@@ -28,7 +28,9 @@
 #include "BufferList.h"
 #include "BufferParams.h"
 #include "BufferView.h"
+#include "CmdDef.h"
 #include "Color.h"
+#include "Converter.h"
 #include "Cursor.h"
 #include "CutAndPaste.h"
 #include "debug.h"
@@ -39,7 +41,6 @@
 #include "FuncRequest.h"
 #include "FuncStatus.h"
 #include "gettext.h"
-#include "Importer.h"
 #include "InsetIterator.h"
 #include "Intl.h"
 #include "KeyMap.h"
@@ -87,7 +88,6 @@
 #include "support/environment.h"
 #include "support/FileFilterList.h"
 #include "support/filetools.h"
-#include "support/fs_extras.h"
 #include "support/lstrings.h"
 #include "support/Path.h"
 #include "support/Package.h"
@@ -96,7 +96,6 @@
 #include "support/os.h"
 
 #include <boost/current_function.hpp>
-#include <boost/filesystem/operations.hpp>
 
 #include <sstream>
 
@@ -106,8 +105,8 @@ using std::pair;
 using std::string;
 using std::istringstream;
 using std::ostringstream;
-
-namespace fs = boost::filesystem;
+using std::find;
+using std::vector;
 
 namespace lyx {
 
@@ -135,12 +134,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)
@@ -149,7 +216,7 @@ void reconfigure(LyXView & lv, string const & option)
        lv.message(_("Running configure..."));
 
        // Run configure in user lyx directory
-       support::Path p(package().user_support());
+       support::PathChanger p(package().user_support());
        string configure_command = package().configure_command();
        configure_command += option;
        Systemcall one;
@@ -533,7 +600,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                enable = buf->lyxvc().inUse();
                break;
        case LFUN_BUFFER_RELOAD:
-               enable = !buf->isUnnamed() && fs::exists(buf->absFileName())
+               enable = !buf->isUnnamed() && buf->fileName().exists()
                        && (!buf->isClean() || buf->isExternallyModified(Buffer::timestamp_method));
                break;
 
@@ -582,7 +649,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 +731,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:
@@ -768,7 +852,7 @@ bool LyXFunc::ensureBufferClean(BufferView * bv)
        if (buf.isClean())
                return true;
 
-       docstring const file = makeDisplayPath(buf.absFileName(), 30);
+       docstring const file = buf.fileName().displayName(30);
        docstring text = bformat(_("The document %1$s has unsaved "
                                             "changes.\n\nDo you want to save "
                                             "the document?"), file);
@@ -1092,7 +1176,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        string const path = buffer->temppath();
                        // Prevent the compiler from optimizing away p
                        FileName pp(path);
-                       support::Path p(pp);
+                       support::PathChanger p(pp);
 
                        // there are three cases here:
                        // 1. we print to a file
@@ -1369,9 +1453,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 +1463,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 +1500,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 +1716,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 +1765,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(
@@ -1734,7 +1840,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                    && (inset_code == NO_CODE
                                    || inset_code == it->lyxCode())) {
                                        Cursor tmpcur = cur;
-                                       tmpcur.pushLeft(*it);
+                                       tmpcur.pushBackward(*it);
                                        it->dispatch(tmpcur, fr);
                                }
                        }
@@ -1907,6 +2013,9 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                        actOnUpdatedPrefs(lyxrc_orig, lyxrc);
 
+                       if (lyx_view_ && lyx_view_->buffer())
+                               lyx_view_->updateLayoutChoice(true);
+
                        /// We force the redraw in any case because there might be
                        /// some screen font changes.
                        /// FIXME: only the current view will be updated. the Gui
@@ -1992,7 +2101,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        theSelection().haveSelection(view()->cursor().selection());
 
                        if (view()->cursor().inTexted()) {
-                               lyx_view_->updateLayoutChoice();
+                               lyx_view_->updateLayoutChoice(false);
                        }
                }
        }
@@ -2032,7 +2141,7 @@ void LyXFunc::sendDispatchMessage(docstring const & msg, FuncRequest const & cmd
                }
        }
 
-       docstring const shortcuts = theTopLevelKeymap().printbindings(cmd);
+       docstring const shortcuts = theTopLevelKeymap().printBindings(cmd);
 
        if (!shortcuts.empty())
                comname += ": " + shortcuts;
@@ -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?
 }
 
@@ -2392,6 +2499,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new)
        case LyXRC::RC_DATE_INSERT_FORMAT:
        case LyXRC::RC_DEFAULT_LANGUAGE:
        case LyXRC::RC_DEFAULT_PAPERSIZE:
+       case LyXRC::RC_DEFFILE:
        case LyXRC::RC_DIALOGS_ICONIFY_WITH_MAIN:
        case LyXRC::RC_DISPLAY_GRAPHICS:
        case LyXRC::RC_DOCUMENTPATH:
@@ -2480,8 +2588,10 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new)
        case LyXRC::RC_USE_ESC_CHARS:
        case LyXRC::RC_USE_INP_ENC:
        case LyXRC::RC_USE_PERS_DICT:
+       case LyXRC::RC_USE_PIXMAP_CACHE:
        case LyXRC::RC_USE_SPELL_LIB:
        case LyXRC::RC_VIEWDVI_PAPEROPTION:
+       case LyXRC::RC_SORT_LAYOUTS:
        case LyXRC::RC_VIEWER:
        case LyXRC::RC_LAST:
                break;