]> git.lyx.org Git - lyx.git/blobdiff - src/LyXFunc.cpp
Fixed some lines that were too long. It compiled afterwards.
[lyx.git] / src / LyXFunc.cpp
index 0cb14f577a2bd583d66ed14a1ad23a6bc8670bcc..19fd449c9d02918220d11c0d1da49175406915d7 100644 (file)
@@ -86,6 +86,7 @@
 #include "frontends/LyXView.h"
 #include "frontends/Menubar.h"
 #include "frontends/Toolbars.h"
+#include "frontends/Selection.h"
 
 #include "support/environment.h"
 #include "support/FileFilterList.h"
@@ -218,6 +219,10 @@ void LyXFunc::initKeySequences(KeyMap * kb)
 
 void LyXFunc::setLyXView(LyXView * lv)
 {
+       if (!quitting && lyx_view_ && lyx_view_ != lv)
+               // save current selection to the selection buffer to allow
+               // middle-button paste in another window
+               cap::saveSelection(lyx_view_->view()->cursor());
        lyx_view_ = lv;
 }
 
@@ -491,7 +496,8 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                enable = buf->lyxvc().inUse();
                break;
        case LFUN_BUFFER_RELOAD:
-               enable = !buf->isUnnamed() && !buf->isClean();
+               enable = !buf->isUnnamed() && fs::exists(buf->fileName())
+                       && (!buf->isClean() || buf->isExternallyModified(Buffer::timestamp_method));
                break;
 
        case LFUN_INSET_SETTINGS: {
@@ -607,6 +613,29 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                break;
        }
 
+
+       case LFUN_BUFFER_WRITE_ALL: {
+       // We enable the command only if there are some modified buffers
+               Buffer * first = theBufferList().first();
+               bool modified = false;
+               if (first) {
+                       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;
+
+               break;
+       }
+
        case LFUN_BOOKMARK_GOTO: {
                const unsigned int num = convert<unsigned int>(to_utf8(cmd.argument()));
                enable = LyX::ref().session().bookmarks().isValid(num);
@@ -617,19 +646,11 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
                enable = LyX::ref().session().bookmarks().size() > 0;
                break;
 
-       case LFUN_TOOLBAR_TOGGLE_STATE: {
-               ToolbarInfo::Flags flags = lyx_view_->getToolbarState(to_utf8(cmd.argument()));
-               if (!(flags & ToolbarInfo::AUTO))
-                       flag.setOnOff(flags & ToolbarInfo::ON);
-               break;
-       }
-
        case LFUN_TOOLBAR_TOGGLE: {
                bool const current = lyx_view_->getToolbars().visible(cmd.getArg(0));
                flag.setOnOff(current);
                break;
        }
-       
        case LFUN_WINDOW_CLOSE: {
                enable = (theApp()->gui().viewIds().size() > 1);
                break;
@@ -910,6 +931,30 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        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()) {
+                                                       menuWrite(b);
+                                                       lyxerr[Debug::ACTION] << "Saved " << b->fileName() << endl;
+                                               } else
+                                                       writeAs(b);
+                                       }
+                                       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(view()->buffer()->fileName(), 20);
@@ -997,21 +1042,22 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                case LFUN_BUFFER_PRINT: {
                        BOOST_ASSERT(lyx_view_ && lyx_view_->buffer());
-                       string target;
-                       string target_name;
-                       string command = split(split(argument, target, ' '),
-                                              target_name, ' ');
+                       // FIXME: cmd.getArg() might fail if one of the arguments
+                       // contains double quotes
+                       string target = cmd.getArg(0);
+                       string target_name = cmd.getArg(1);
+                       string command = cmd.getArg(2);
 
                        if (target.empty()
                            || target_name.empty()
                            || command.empty()) {
                                lyxerr << "Unable to parse \""
-                                      << argument << '"' << std::endl;
+                                      << argument << '"' << endl;
                                break;
                        }
                        if (target != "printer" && target != "file") {
                                lyxerr << "Unrecognized target \""
-                                      << target << '"' << std::endl;
+                                      << target << '"' << endl;
                                break;
                        }
 
@@ -1043,13 +1089,13 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                        // case 3: print using a spool
                                        string const psname =
                                                changeExtension(dviname,".ps");
-                                       command += lyxrc.print_to_file
+                                       command += ' ' + lyxrc.print_to_file
                                                + quoteName(psname)
                                                + ' '
                                                + quoteName(dviname);
 
                                        string command2 =
-                                               lyxrc.print_spool_command +' ';
+                                               lyxrc.print_spool_command + ' ';
                                        if (target_name != "default") {
                                                command2 += lyxrc.print_spool_printerprefix
                                                        + target_name
@@ -1068,6 +1114,8 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                                        command2);
                                } else {
                                        // case 2: print directly to a printer
+                                       if (target_name != "default")
+                                               command += ' ' + lyxrc.print_to_printer + target_name + ' ';
                                        res = one.startscript(
                                                Systemcall::DontWait,
                                                command + quoteName(dviname));
@@ -1075,20 +1123,22 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                        } else {
                                // case 1: print to a file
-                               FileName const filename(makeAbsPath(target_name, path));
+                               FileName const filename(makeAbsPath(target_name,
+                                                       lyx_view_->buffer()->filePath()));
+                               FileName const dvifile(makeAbsPath(dviname, path));
                                if (fs::exists(filename.toFilesystemEncoding())) {
                                        docstring text = bformat(
                                                _("The file %1$s already exists.\n\n"
-                                                 "Do you want to over-write that file?"),
+                                                 "Do you want to overwrite that file?"),
                                                makeDisplayPath(filename.absFilename()));
-                                       if (Alert::prompt(_("Over-write file?"),
-                                           text, 0, 1, _("&Over-write"), _("&Cancel")) != 0)
+                                       if (Alert::prompt(_("Overwrite file?"),
+                                           text, 0, 1, _("&Overwrite"), _("&Cancel")) != 0)
                                                break;
                                }
-                               command += lyxrc.print_to_file
+                               command += ' ' + lyxrc.print_to_file
                                        + quoteName(filename.toFilesystemEncoding())
                                        + ' '
-                                       + quoteName(dviname);
+                                       + quoteName(dvifile.toFilesystemEncoding());
                                res = one.startscript(Systemcall::DontWait,
                                                      command);
                        }
@@ -1188,16 +1238,19 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                case LFUN_BUFFER_SWITCH:
                        BOOST_ASSERT(lyx_view_);
                        lyx_view_->setBuffer(theBufferList().getBuffer(argument));
+                       updateFlags = Update::Force;
                        break;
 
                case LFUN_BUFFER_NEXT:
                        BOOST_ASSERT(lyx_view_);
                        lyx_view_->setBuffer(theBufferList().next(view()->buffer()));
+                       updateFlags = Update::Force;
                        break;
 
                case LFUN_BUFFER_PREVIOUS:
                        BOOST_ASSERT(lyx_view_);
                        lyx_view_->setBuffer(theBufferList().previous(view()->buffer()));
+                       updateFlags = Update::Force;
                        break;
 
                case LFUN_FILE_NEW:
@@ -1372,7 +1425,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                }
 
                case LFUN_DIALOG_HIDE:
-                       Dialogs::hide(argument, 0);
+                       LyX::cref().hideDialogs(argument, 0);
                        break;
 
                case LFUN_DIALOG_TOGGLE: {
@@ -1416,23 +1469,39 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                }
 
                case LFUN_BUFFER_CHILD_OPEN: {
+                       // takes an optional argument, "|bool", at the end
+                       // indicating whether this file is being opened automatically
+                       // by LyX itself, in which case we will not want to switch
+                       // buffers after opening. The default is false, so in practice
+                       // it is used only when true.
                        BOOST_ASSERT(lyx_view_);
-                       FileName const filename =
+                       int const arglength = argument.length();
+                       FileName filename;
+                       bool autoOpen = false;
+                       if (argument.substr(arglength - 5, 5) == "|true") {
+                               autoOpen = true;
+                               filename = makeAbsPath(argument.substr(0, arglength - 5), 
+                                       lyx_view_->buffer()->filePath());
+                       } else if (argument.substr(arglength - 6, 6) == "|false") {
+                               filename = makeAbsPath(argument.substr(0, arglength - 6), 
+                                       lyx_view_->buffer()->filePath());
+                       } else filename = 
                                makeAbsPath(argument, lyx_view_->buffer()->filePath());
                        view()->saveBookmark(false);
-                       string const parentfilename = lyx_view_->buffer()->fileName();
-                       if (theBufferList().exists(filename.absFilename()))
-                               lyx_view_->setBuffer(theBufferList().getBuffer(filename.absFilename()));
-                       else
-                               if (lyx_view_->loadLyXFile(filename)) {
-                                       // 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.
-                                       lyx_view_->buffer()->setParentName(parentfilename);
-                                       setMessage(bformat(_("Opening child document %1$s..."),
-                                                makeDisplayPath(filename.absFilename())));
-                               } else
-                                       setMessage(_("Document not loaded."));
+                       if (theBufferList().exists(filename.absFilename())) {
+                               Buffer * buf = theBufferList().getBuffer(filename.absFilename());
+                               if (!autoOpen)
+                                       lyx_view_->setBuffer(buf, true);
+                               else
+                                       buf->setParentName(lyx_view_->buffer()->fileName());
+                       } else
+                               lyx_view_->loadLyXFile(filename, true, true, autoOpen);
+
+                       // If a screen update is required (in case where auto_open is false), 
+                       // loadLyXFile() would have taken care of it already. Otherwise we shall 
+                       // reset the update flag because it can cause a circular problem.
+                       // See bug 3970.
+                       updateFlags = Update::None;
                        break;
                }
 
@@ -1529,9 +1598,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        theApp()->updateColor(lcolor.getFromLyXName(lyx_name));
 
                        if (graphicsbg_changed) {
-#ifdef WITH_WARNINGS
-#warning FIXME!! The graphics cache no longer has a changeDisplay method.
-#endif
+                               // FIXME: The graphics cache no longer has a changeDisplay method.
 #if 0
                                graphics::GCache::get().changeDisplay(true);
 #endif
@@ -1761,15 +1828,27 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        LyX::ref().session().bookmarks().clear();
                        break;
 
-               case LFUN_TOOLBAR_TOGGLE_STATE:
-                       lyx_view_->toggleToolbarState(argument);
-                       break;
-
                case LFUN_TOOLBAR_TOGGLE: {
                        BOOST_ASSERT(lyx_view_);
-                       string const name = to_utf8(cmd.argument());
-                       bool const current = lyx_view_->getToolbars().visible(name);
-                       lyx_view_->getToolbars().display(name, !current);
+                       string const name = cmd.getArg(0);
+                       bool const allowauto = cmd.getArg(1) == "allowauto";
+                       lyx_view_->toggleToolbarState(name, allowauto);
+                       ToolbarInfo * tbi = lyx_view_->getToolbarInfo(name);
+                       if (!tbi) {
+                               setMessage(bformat(_("Unknown toolbar \"%1$s\""),
+                                                  from_utf8(name)));
+                               break;
+                       }
+                       docstring state;
+                       if (tbi->flags & ToolbarInfo::ON)
+                               state = _("on");
+                       else if (tbi->flags & ToolbarInfo::OFF)
+                               state = _("off");
+                       else if (tbi->flags & ToolbarInfo::AUTO)
+                               state = _("auto");
+
+                       setMessage(bformat(_("Toolbar \"%1$s\" state set to %2$s"), 
+                                          _(tbi->gui_name), state));
                        break;
                }
 
@@ -1803,12 +1882,15 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                            && !lyxaction.funcHasFlag(action, LyXAction::ReadOnly))
                                view()->buffer()->markDirty();
 
+                       //Do we have a selection?
+                       theSelection().haveSelection(view()->cursor().selection());
+
                        if (view()->cursor().inTexted()) {
                                lyx_view_->updateLayoutChoice();
                        }
                }
        }
-       if (!quitting) {
+       if (!quitting && lyx_view_) {
                lyx_view_->updateMenubar();
                lyx_view_->updateToolbars();
                // Some messages may already be translated, so we cannot use _()
@@ -2055,9 +2137,9 @@ void LyXFunc::doImport(string const & argument)
                docstring const file = makeDisplayPath(lyxfile.absFilename(), 30);
 
                docstring text = bformat(_("The document %1$s already exists.\n\n"
-                                                    "Do you want to over-write that document?"), file);
-               int const ret = Alert::prompt(_("Over-write document?"),
-                       text, 0, 1, _("&Over-write"), _("&Cancel"));
+                                                    "Do you want to overwrite that document?"), file);
+               int const ret = Alert::prompt(_("Overwrite document?"),
+                       text, 0, 1, _("&Overwrite"), _("&Cancel"));
 
                if (ret == 1) {
                        lyx_view_->message(_("Canceled."));
@@ -2076,16 +2158,8 @@ void LyXFunc::closeBuffer()
        // goto bookmark to update bookmark pit.
        for (size_t i = 0; i < LyX::ref().session().bookmarks().size(); ++i)
                gotoBookmark(i+1, false, false);
-       if (theBufferList().close(lyx_view_->buffer(), true) && !quitting) {
-               if (theBufferList().empty()) {
-                       // need this otherwise SEGV may occur while
-                       // trying to set variables that don't exist
-                       // since there's no current buffer
-                       lyx_view_->getDialogs().hideBufferDependent();
-               } else {
-                       lyx_view_->setBuffer(theBufferList().first());
-               }
-       }
+       
+       theBufferList().close(lyx_view_->buffer(), true);
 }