]> 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 69ddb58c0fc2ab8bed1d504b213961650bbc594e..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;
@@ -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();
 
@@ -542,6 +513,15 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
        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:
@@ -600,7 +580,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
        }
        
        // This could be used for the no-GUI version. The GUI version is handled in
-       // LyXView::getStatus().
+       // LyXView::getStatus(). See above.
        /*
        case LFUN_BUFFER_WRITE:
        case LFUN_BUFFER_WRITE_AS: {
@@ -651,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);
@@ -794,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;
        }
 
@@ -901,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;
 
@@ -974,7 +954,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        if (!format) {
                                lyxerr << "Format \"" << format_name
                                       << "\" not recognized!"
-                                      << std::endl;
+                                      << endl;
                                break;
                        }
 
@@ -1040,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
@@ -1360,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)
@@ -1666,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;
                }
                
@@ -1675,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;
@@ -1686,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;
@@ -1697,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)
@@ -1714,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;
@@ -1726,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;
@@ -1763,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))
@@ -1784,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()) {
@@ -1809,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());
@@ -1868,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);
@@ -2118,11 +2061,13 @@ void LyXFunc::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);
@@ -2245,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:
@@ -2270,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:
@@ -2315,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:
@@ -2326,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: