X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLyXFunc.cpp;h=19fd449c9d02918220d11c0d1da49175406915d7;hb=e54ae72e5fac6f750c3f7972c74bb42b57f3a049;hp=0cb14f577a2bd583d66ed14a1ad23a6bc8670bcc;hpb=793854f7acfcb8a706278a4df1cf8b0a820a892a;p=lyx.git diff --git a/src/LyXFunc.cpp b/src/LyXFunc.cpp index 0cb14f577a..19fd449c9d 100644 --- a/src/LyXFunc.cpp +++ b/src/LyXFunc.cpp @@ -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(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); }