]> git.lyx.org Git - lyx.git/blobdiff - src/LyXFunc.cpp
Embedding: saving inzip name to .lyx file so that embedded files can always be found...
[lyx.git] / src / LyXFunc.cpp
index 7e9fe5a3da425b63634ebefa84e7716dd9695cc8..7a499f1dd773d65bab9ccd80c4674087aa659794 100644 (file)
 
 #include <sstream>
 
-using std::endl;
-using std::make_pair;
-using std::pair;
-using std::string;
-using std::istringstream;
-using std::ostringstream;
-using std::find;
-using std::vector;
+using namespace std;
+using namespace lyx::support;
 
 namespace lyx {
 
 using frontend::LyXView;
 
-using support::absolutePath;
-using support::addName;
-using support::addPath;
-using support::bformat;
-using support::changeExtension;
-using support::contains;
-using support::FileFilterList;
-using support::FileName;
-using support::fileSearch;
-using support::i18nLibFileSearch;
-using support::makeDisplayPath;
-using support::makeAbsPath;
-using support::package;
-using support::quoteName;
-using support::rtrim;
-using support::split;
-using support::subst;
-using support::Systemcall;
-using support::token;
-using support::trim;
-using support::prefixIs;
-
-
 namespace Alert = frontend::Alert;
 
 extern bool quitting;
@@ -194,7 +165,7 @@ bool import(LyXView * lv, FileName const & filename,
                string filename2 = (loader_format == format) ? filename.absFilename()
                        : changeExtension(filename.absFilename(),
                                          formats.extension(loader_format));
-               lv->view()->insertPlaintextFile(filename2, as_paragraphs);
+               lv->view()->insertPlaintextFile(FileName(filename2), as_paragraphs);
                theLyXFunc().setLyXView(lv);
                lyx::dispatch(FuncRequest(LFUN_MARK_OFF));
        }
@@ -214,7 +185,7 @@ void reconfigure(LyXView & lv, string const & option)
        lv.message(_("Running configure..."));
 
        // Run configure in user lyx directory
-       support::PathChanger p(package().user_support());
+       PathChanger p(package().user_support());
        string configure_command = package().configure_command();
        configure_command += option;
        Systemcall one;
@@ -222,7 +193,7 @@ void reconfigure(LyXView & lv, string const & option)
        p.pop();
        // emit message signal.
        lv.message(_("Reloading configuration..."));
-       lyxrc.read(support::libFileSearch(string(), "lyxrc.defaults"));
+       lyxrc.read(libFileSearch(string(), "lyxrc.defaults"));
        // Re-read packages.lst
        LaTeXFeatures::getAvailable();
 
@@ -531,17 +502,30 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
        bool enable = true;
        switch (cmd.action) {
 
+       // FIXME: these cases should be hidden in GuiApplication::getStatus().
        case LFUN_WINDOW_CLOSE:
                if (theApp())
                        return theApp()->getStatus(cmd);
                enable = false;
                break;
 
+       // FIXME: these cases should be hidden in GuiView::getStatus().
        case LFUN_DIALOG_TOGGLE:
        case LFUN_DIALOG_SHOW:
        case LFUN_DIALOG_UPDATE:
+               if (cmd.argument() == "prefs"
+                   || cmd.argument() == "aboutlyx")
+                       enable = true;
+               else if (lyx_view_)
+                       return lyx_view_->getStatus(cmd);
+               else
+                       enable = false;
+               break;
+
        case LFUN_TOOLBAR_TOGGLE:
        case LFUN_INSET_APPLY:
+       case LFUN_BUFFER_WRITE:
+       case LFUN_BUFFER_WRITE_AS:
                if (lyx_view_)
                        return lyx_view_->getStatus(cmd);
                enable = false;
@@ -594,33 +578,33 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                enable = getStatus(fr).enabled();
                break;
        }
-
-       case LFUN_BUFFER_WRITE: {
-               enable = lyx_view_->buffer()->isUnnamed()
-                       || !lyx_view_->buffer()->isClean();
+       
+       // This could be used for the no-GUI version. The GUI version is handled in
+       // LyXView::getStatus(). See above.
+       /*
+       case LFUN_BUFFER_WRITE:
+       case LFUN_BUFFER_WRITE_AS: {
+               Buffer * b = theBufferList().getBuffer(cmd.getArg(0));
+               enable = b && (b->isUnnamed() || !b->isClean());
                break;
        }
-
+       */
 
        case LFUN_BUFFER_WRITE_ALL: {
-       // We enable the command only if there are some modified buffers
+               // We enable the command only if there are some modified buffers
                Buffer * first = theBufferList().first();
-               bool modified = false;
-               if (first) {
-                       Buffer * b = first;
-               
+               enable = false;
+               if (!first)
+                       break;
+               Buffer * b = first;
                // We cannot use a for loop as the buffer list is a cycle.
-                       do {
-                               if (!b->isClean()) {
-                                       modified = true;
-                                       break;
-                               }
-                               b = theBufferList().next(b);
-                       } while (b != first); 
-               }
-       
-               enable = modified;
-
+               do {
+                       if (!b->isClean()) {
+                               enable = true;
+                               break;
+                       }
+                       b = theBufferList().next(b);
+               } while (b != first); 
                break;
        }
 
@@ -647,7 +631,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
 
        case LFUN_CALL: {
                FuncRequest func;
-               std::string name = to_utf8(cmd.argument());
+               string name = to_utf8(cmd.argument());
                if (LyX::ref().topLevelCmdDef().lock(name, func)) {
                        func.origin = cmd.origin;
                        flag = getStatus(func);
@@ -670,7 +654,6 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
        case LFUN_CANCEL:
        case LFUN_META_PREFIX:
        case LFUN_BUFFER_CLOSE:
-       case LFUN_BUFFER_WRITE_AS:
        case LFUN_BUFFER_UPDATE:
        case LFUN_BUFFER_VIEW:
        case LFUN_MASTER_BUFFER_UPDATE:
@@ -791,13 +774,13 @@ void showPrintError(string const & name)
 
 void loadTextClass(string const & name)
 {
-       std::pair<bool, textclass_type> const tc_pair =
+       pair<bool, textclass_type> const tc_pair =
                textclasslist.numberOfClass(name);
 
        if (!tc_pair.first) {
                lyxerr << "Document class \"" << name
                       << "\" does not exist."
-                      << std::endl;
+                      << endl;
                return;
        }
 
@@ -898,12 +881,12 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                // --- Menus -----------------------------------------------
                case LFUN_BUFFER_NEW:
-                       menuNew(argument, false);
+                       lyx_view_->newDocument(argument, false);
                        updateFlags = Update::None;
                        break;
 
                case LFUN_BUFFER_NEW_TEMPLATE:
-                       menuNew(argument, true);
+                       lyx_view_->newDocument(argument, true);
                        updateFlags = Update::None;
                        break;
 
@@ -912,50 +895,6 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        updateFlags = Update::None;
                        break;
 
-               case LFUN_BUFFER_WRITE:
-                       BOOST_ASSERT(lyx_view_ && lyx_view_->buffer());
-                       if (!lyx_view_->buffer()->isUnnamed()) {
-                               docstring const str = bformat(_("Saving document %1$s..."),
-                                        makeDisplayPath(lyx_view_->buffer()->absFileName()));
-                               lyx_view_->message(str);
-                               lyx_view_->buffer()->menuWrite();
-                               lyx_view_->message(str + _(" done."));
-                       } else {
-                               lyx_view_->buffer()->writeAs();
-                       }
-                       updateFlags = Update::None;
-                       break;
-
-               case LFUN_BUFFER_WRITE_AS:
-                       BOOST_ASSERT(lyx_view_ && lyx_view_->buffer());
-                       lyx_view_->buffer()->writeAs(argument);
-                       updateFlags = Update::None;
-                       break;
-
-               case LFUN_BUFFER_WRITE_ALL: {
-                       Buffer * first = theBufferList().first();
-                       if (first) {
-                               Buffer * b = first;
-                               lyx_view_->message(_("Saving all documents..."));
-               
-                               // We cannot use a for loop as the buffer list cycles.
-                               do {
-                                       if (!b->isClean()) {
-                                               if (!b->isUnnamed()) {
-                                                       b->menuWrite();
-                                                       LYXERR(Debug::ACTION, "Saved " << b->absFileName());
-                                               } else
-                                                       b->writeAs();
-                                       }
-                                       b = theBufferList().next(b);
-                               } while (b != first); 
-                               lyx_view_->message(_("All documents saved."));
-                       } 
-       
-                       updateFlags = Update::None;
-                       break;
-               }
-
                case LFUN_BUFFER_RELOAD: {
                        BOOST_ASSERT(lyx_view_ && lyx_view_->buffer());
                        docstring const file = makeDisplayPath(lyx_view_->buffer()->absFileName(), 20);
@@ -1015,7 +954,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        if (!format) {
                                lyxerr << "Format \"" << format_name
                                       << "\" not recognized!"
-                                      << std::endl;
+                                      << endl;
                                break;
                        }
 
@@ -1081,7 +1020,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        string const path = buffer->temppath();
                        // Prevent the compiler from optimizing away p
                        FileName pp(path);
-                       support::PathChanger p(pp);
+                       PathChanger p(pp);
 
                        // there are three cases here:
                        // 1. we print to a file
@@ -1401,7 +1340,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        }
                        default:
                                lyxerr << "Inset type '" << name << 
-                                       "' not recognized in LFUN_DIALOG_SHOW_NEW_INSET" << std:: endl;
+                                       "' not recognized in LFUN_DIALOG_SHOW_NEW_INSET" <<  endl;
                                insetCodeOK = false;
                                break;
                        } // end switch(code)
@@ -1707,6 +1646,10 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        }
                        
                        updateFlags = Update::Force | Update::FitCursor;
+                       // We are here most certainaly because of a change in the document
+                       // It is then better to make sure that all dialogs are in sync
+                       // with current document settings. LyXView::restartCursor() achieve this.
+                       lyx_view_->restartCursor();
                        break;
                }
                
@@ -1716,6 +1659,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        TextClassPtr oldClass = buffer->params().getTextClassPtr();
                        view()->cursor().recordUndoFullDocument();
                        buffer->params().clearLayoutModules();
+                       buffer->params().makeTextClass();
                        updateLayout(oldClass, buffer);
                        updateFlags = Update::Force | Update::FitCursor;
                        break;
@@ -1727,6 +1671,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        TextClassPtr oldClass = buffer->params().getTextClassPtr();
                        view()->cursor().recordUndoFullDocument();
                        buffer->params().addLayoutModule(argument);
+                       buffer->params().makeTextClass();
                        updateLayout(oldClass, buffer);
                        updateFlags = Update::Force | Update::FitCursor;
                        break;
@@ -1738,7 +1683,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                        loadTextClass(argument);
 
-                       std::pair<bool, textclass_type> const tc_pair =
+                       pair<bool, textclass_type> const tc_pair =
                                textclasslist.numberOfClass(argument);
 
                        if (!tc_pair.first)
@@ -1755,6 +1700,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        TextClassPtr oldClass = buffer->params().getTextClassPtr();
                        view()->cursor().recordUndoFullDocument();
                        buffer->params().setBaseClass(new_class);
+                       buffer->params().makeTextClass();
                        updateLayout(oldClass, buffer);
                        updateFlags = Update::Force | Update::FitCursor;
                        break;
@@ -1767,6 +1713,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        textclass_type const tc = buffer->params().getBaseClass();
                        textclasslist.reset(tc);
                        buffer->params().setBaseClass(tc);
+                       buffer->params().makeTextClass();
                        updateLayout(oldClass, buffer);
                        updateFlags = Update::Force | Update::FitCursor;
                        break;
@@ -1804,13 +1751,14 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                case LFUN_BOOKMARK_GOTO:
                        // go to bookmark, open unopened file and switch to buffer if necessary
                        gotoBookmark(convert<unsigned int>(to_utf8(cmd.argument())), true, true);
+                       updateFlags = Update::FitCursor;
                        break;
 
                case LFUN_BOOKMARK_CLEAR:
                        LyX::ref().session().bookmarks().clear();
                        break;
 
-               default: {
+               default:
                        BOOST_ASSERT(theApp());
                        // Let the frontend dispatch its own actions.
                        if (theApp()->dispatch(cmd))
@@ -1825,18 +1773,24 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                break;
                        }
 
-                       // FIXME: Probably a good idea to inverse the Cursor and BufferView
-                       // dispatching.
+                       BOOST_ASSERT(lyx_view_->view());
+                       // Let the current BufferView dispatch its own actions.
+                       if (view()->dispatch(cmd)) {
+                               // The BufferView took care of its own updates if needed.
+                               updateFlags = Update::None;
+                               break;
+                       }
 
                        // Let the current Cursor dispatch its own actions.
-                       BOOST_ASSERT(lyx_view_->view());
+                       view()->cursor().getPos(cursorPosBeforeDispatchX_,
+                                               cursorPosBeforeDispatchY_);
                        view()->cursor().dispatch(cmd);
                        updateFlags = view()->cursor().result().update();
-                       if (!view()->cursor().result().dispatched())
-                               // Let the current BufferView dispatch its own actions.
-                               updateFlags = view()->dispatch(cmd);
-                       break;
-               }
+                       if (!view()->cursor().result().dispatched()) {
+                               // No update needed in this case (e.g. when reaching
+                               // top of document.
+                               updateFlags = Update::None;
+                       }
                }
 
                if (lyx_view_ && lyx_view_->buffer()) {
@@ -1850,7 +1804,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        if (flag.enabled()
                            && !lyxaction.funcHasFlag(action, LyXAction::NoBuffer)
                            && !lyxaction.funcHasFlag(action, LyXAction::ReadOnly))
-                               lyx_view_->buffer()->markDirty();
+                               lyx_view_->buffer()->markDirty();                       
 
                        //Do we have a selection?
                        theSelection().haveSelection(view()->cursor().selection());
@@ -1909,58 +1863,6 @@ void LyXFunc::sendDispatchMessage(docstring const & msg, FuncRequest const & cmd
 }
 
 
-void LyXFunc::menuNew(string const & name, bool fromTemplate)
-{
-       // FIXME: initpath is not used. What to do?
-       string initpath = lyxrc.document_path;
-       string filename(name);
-
-       if (lyx_view_->buffer()) {
-               string const trypath = lyx_view_->buffer()->filePath();
-               // If directory is writeable, use this as default.
-               if (FileName(trypath).isDirWritable())
-                       initpath = trypath;
-       }
-
-       static int newfile_number;
-
-       if (filename.empty()) {
-               filename = addName(lyxrc.document_path,
-                           "newfile" + convert<string>(++newfile_number) + ".lyx");
-               while (theBufferList().exists(filename) ||
-                      FileName(filename).isReadableFile()) {
-                       ++newfile_number;
-                       filename = addName(lyxrc.document_path,
-                                          "newfile" +  convert<string>(newfile_number) +
-                                   ".lyx");
-               }
-       }
-
-       // The template stuff
-       string templname;
-       if (fromTemplate) {
-               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 =
-                       dlg.open(from_utf8(lyxrc.template_path),
-                                    FileFilterList(_("LyX Documents (*.lyx)")),
-                                    docstring());
-
-               if (result.first == FileDialog::Later)
-                       return;
-               if (result.second.empty())
-                       return;
-               templname = to_utf8(result.second);
-       }
-
-       Buffer * const b = newFile(filename, templname, !name.empty());
-       if (b)
-               lyx_view_->setBuffer(b);
-}
-
-
 Buffer * LyXFunc::loadAndViewFile(FileName const & filename, bool tolastfiles)
 {
        lyx_view_->setBusy(true);
@@ -2116,8 +2018,10 @@ void LyXFunc::doImport(string const & argument)
        FileName const lyxfile(changeExtension(fullname.absFilename(), ".lyx"));
 
        // Check if the document already is open
-       if (use_gui && theBufferList().exists(lyxfile.absFilename())) {
-               if (!theBufferList().close(theBufferList().getBuffer(lyxfile.absFilename()), true)) {
+       Buffer * buf = theBufferList().getBuffer(lyxfile.absFilename());
+       if (use_gui && buf) {
+               lyx_view_->setBuffer(buf);
+               if (!lyx_view_->closeBuffer()) {
                        lyx_view_->message(_("Canceled."));
                        return;
                }
@@ -2151,17 +2055,19 @@ void LyXFunc::closeBuffer()
        for (size_t i = 0; i < LyX::ref().session().bookmarks().size(); ++i)
                gotoBookmark(i+1, false, false);
        
-       theBufferList().close(lyx_view_->buffer(), true);
+       lyx_view_->closeBuffer();
 }
 
 
 void LyXFunc::reloadBuffer()
 {
-       FileName filename(lyx_view_->buffer()->absFileName());
+       FileName filename = lyx_view_->buffer()->fileName();
+       // The user has already confirmed that the changes, if any, should
+       // be discarded. So we just release the Buffer and don't call closeBuffer();
+       theBufferList().release(lyx_view_->buffer());
+       Buffer * buf = loadAndViewFile(filename);
        docstring const disp_fn = makeDisplayPath(filename.absFilename());
        docstring str;
-       closeBuffer();
-       Buffer * buf = loadAndViewFile(filename);
        if (buf) {
                updateLabels(*buf);
                lyx_view_->setBuffer(buf);
@@ -2284,7 +2190,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new)
                if (lyxrc_orig.document_path != lyxrc_new.document_path) {
                        FileName path(lyxrc_new.document_path);
                        if (path.exists() && path.isDirectory())
-                               support::package().document_dir() = FileName(lyxrc.document_path);
+                               package().document_dir() = FileName(lyxrc.document_path);
                }
        case LyXRC::RC_ESC_CHARS:
        case LyXRC::RC_EXAMPLEPATH:
@@ -2309,7 +2215,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new)
        case LyXRC::RC_NUMLASTFILES:
        case LyXRC::RC_PATH_PREFIX:
                if (lyxrc_orig.path_prefix != lyxrc_new.path_prefix) {
-                       support::prependEnvPath("PATH", lyxrc.path_prefix);
+                       prependEnvPath("PATH", lyxrc.path_prefix);
                }
        case LyXRC::RC_PERS_DICT:
        case LyXRC::RC_PREVIEW:
@@ -2354,7 +2260,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new)
        case LyXRC::RC_TEX_ALLOWS_SPACES:
        case LyXRC::RC_TEX_EXPECTS_WINDOWS_PATHS:
                if (lyxrc_orig.windows_style_tex_paths != lyxrc_new.windows_style_tex_paths) {
-                       support::os::windows_style_tex_paths(lyxrc_new.windows_style_tex_paths);
+                       os::windows_style_tex_paths(lyxrc_new.windows_style_tex_paths);
                }
        case LyXRC::RC_UIFILE:
        case LyXRC::RC_USER_EMAIL:
@@ -2365,6 +2271,7 @@ 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_TOOLTIP:
        case LyXRC::RC_USE_PIXMAP_CACHE:
        case LyXRC::RC_USE_SPELL_LIB:
        case LyXRC::RC_VIEWDVI_PAPEROPTION: