diff --git a/src/LyX.cpp b/src/LyX.cpp index e12d859f40..2f981c518b 100644 --- a/src/LyX.cpp +++ b/src/LyX.cpp @@ -147,7 +147,7 @@ struct LyX::Impl boost::scoped_ptr session_; /// Files to load at start. - vector files_to_load_; + vector files_to_load_; /// The messages translators. map messages_; @@ -525,24 +525,22 @@ int LyX::init(int & argc, char * argv[]) if (!success) return EXIT_FAILURE; - for (int argi = argc - 1; argi >= 1; --argi) { - // get absolute path of file and add ".lyx" to - // the filename if necessary - pimpl_->files_to_load_.push_back(fileSearch(string(), - os::internal_path(to_utf8(from_local8bit(argv[argi]))), - "lyx", may_not_exist)); - } + // Remaining arguments are assumed to be files to load. + for (int argi = argc - 1; argi >= 1; --argi) + pimpl_->files_to_load_.push_back(to_utf8(from_local8bit(argv[argi]))); - if (first_start) - pimpl_->files_to_load_.push_back(i18nLibFileSearch("examples", "splash.lyx")); + if (first_start) { + pimpl_->files_to_load_.push_back( + i18nLibFileSearch("examples", "splash.lyx").absFilename()); + } return EXIT_SUCCESS; } -void LyX::addFileToLoad(FileName const & fname) +void LyX::addFileToLoad(string const & fname) { - vector::const_iterator cit = find( + vector::const_iterator cit = find( pimpl_->files_to_load_.begin(), pimpl_->files_to_load_.end(), fname); @@ -553,15 +551,20 @@ void LyX::addFileToLoad(FileName const & fname) void LyX::loadFiles() { - vector::const_iterator it = pimpl_->files_to_load_.begin(); - vector::const_iterator end = pimpl_->files_to_load_.end(); + vector::const_iterator it = pimpl_->files_to_load_.begin(); + vector::const_iterator end = pimpl_->files_to_load_.end(); for (; it != end; ++it) { - if (it->empty()) + // get absolute path of file and add ".lyx" to + // the filename if necessary + FileName fname = fileSearch(string(), os::internal_path(*it), "lyx", + may_not_exist); + + if (fname.empty()) continue; - Buffer * buf = pimpl_->buffer_list_.newBuffer(it->absFilename(), false); - if (buf->loadLyXFile(*it)) { + Buffer * buf = pimpl_->buffer_list_.newBuffer(fname.absFilename(), false); + if (buf->loadLyXFile(fname)) { ErrorList const & el = buf->errorList("Parse"); if (!el.empty()) for_each(el.begin(), el.end(), @@ -578,10 +581,9 @@ void LyX::execBatchCommands() // The advantage of doing this here is that the event loop // is already started. So any need for interaction will be // aknowledged. - restoreGuiSession(); // if reconfiguration is needed. - if (textclasslist.empty()) { + while (textclasslist.empty()) { switch (Alert::prompt( _("No textclass is found"), _("LyX cannot continue because no textclass is found. " @@ -601,11 +603,37 @@ void LyX::execBatchCommands() pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_RECONFIGURE, " --without-latex-config")); break; + default: + pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_LYX_QUIT)); + return; } - pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_LYX_QUIT)); - return; } + // create the first main window + pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_WINDOW_NEW, geometryArg)); + + if (!pimpl_->files_to_load_.empty()) { + // if some files were specified at command-line we assume that the + // user wants to edit *these* files and not to restore the session. + for (size_t i = 0; i != pimpl_->files_to_load_.size(); ++i) { + pimpl_->lyxfunc_.dispatch( + FuncRequest(LFUN_FILE_OPEN, pimpl_->files_to_load_[i])); + } + // clear this list to save a few bytes of RAM + pimpl_->files_to_load_.clear(); + } + else + pimpl_->application_->restoreGuiSession(); + + BufferList::iterator I = theBufferList().begin(); + BufferList::iterator end = theBufferList().end(); + for (; I != end; ++I) { + Buffer * buf = *I; + if (buf != buf->masterBuffer()) + continue; + updateLabels(*buf); + } + // Execute batch commands if available if (pimpl_->batch_command.empty()) return; @@ -616,47 +644,6 @@ void LyX::execBatchCommands() } -void LyX::restoreGuiSession() -{ - // create the main window - pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_WINDOW_NEW, geometryArg)); - - // if there is no valid class list, do not load any file. - if (textclasslist.empty()) - return; - - // if some files were specified at command-line we assume that the - // user wants to edit *these* files and not to restore the session. - if (!pimpl_->files_to_load_.empty()) { - for_each(pimpl_->files_to_load_.begin(), - pimpl_->files_to_load_.end(), - bind(&LyXFunc::loadAndViewFile, pimpl_->lyxfunc_, _1, true)); - // clear this list to save a few bytes of RAM - pimpl_->files_to_load_.clear(); - pimpl_->session_->lastOpened().clear(); - - } else if (lyxrc.load_session) { - vector const & lastopened = pimpl_->session_->lastOpened().getfiles(); - // do not add to the lastfile list since these files are restored from - // last session, and should be already there (regular files), or should - // not be added at all (help files). - for_each(lastopened.begin(), lastopened.end(), - bind(&LyXFunc::loadAndViewFile, pimpl_->lyxfunc_, _1, false)); - - // clear this list to save a few bytes of RAM - pimpl_->session_->lastOpened().clear(); - } - - BufferList::iterator I = pimpl_->buffer_list_.begin(); - BufferList::iterator end = pimpl_->buffer_list_.end(); - for (; I != end; ++I) { - Buffer * buf = *I; - if (buf != buf->masterBuffer()) - continue; - updateLabels(*buf); - } -} - /* Signals and Windows =================== diff --git a/src/LyX.h b/src/LyX.h index fa3c99d617..0d8616eff9 100644 --- a/src/LyX.h +++ b/src/LyX.h @@ -110,7 +110,7 @@ public: void execBatchCommands(); /// - void addFileToLoad(support::FileName const &); + void addFileToLoad(std::string const &); private: /// noncopyable @@ -135,9 +135,6 @@ private: */ void loadFiles(); - /// Create a View, load files and restore GUI Session. - void restoreGuiSession(); - /// initial LyX set up bool init(); /// set up the default dead key bindings if requested diff --git a/src/LyXFunc.cpp b/src/LyXFunc.cpp index 1038d5ae60..2a5abadb51 100644 --- a/src/LyXFunc.cpp +++ b/src/LyXFunc.cpp @@ -145,7 +145,7 @@ bool import(LyXView * lv, FileName const & filename, if (loader_format == "lyx") { - Buffer * buf = theLyXFunc().loadAndViewFile(lyxfile); + Buffer * buf = lv->loadDocument(lyxfile); if (!buf) { // we are done lv->message(_("file not imported!")); @@ -1125,7 +1125,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) } lyx_view_->message(bformat(_("Opening help file %1$s..."), makeDisplayPath(fname.absFilename()))); - Buffer * buf = loadAndViewFile(fname, false); + Buffer * buf = lyx_view_->loadDocument(fname, false); if (buf) { updateLabels(*buf); lyx_view_->setBuffer(buf); @@ -1194,12 +1194,6 @@ void LyXFunc::dispatch(FuncRequest const & cmd) break; } - case LFUN_FILE_OPEN: - BOOST_ASSERT(lyx_view_); - open(argument); - updateFlags = Update::None; - break; - // --- lyxserver commands ---------------------------- case LFUN_SERVER_GET_NAME: BOOST_ASSERT(lyx_view_ && lyx_view_->buffer()); @@ -1233,7 +1227,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) if (theBufferList().exists(s.absFilename())) buf = theBufferList().getBuffer(s.absFilename()); else { - buf = loadAndViewFile(s); + buf = lyx_view_->loadDocument(s); loaded = true; } } @@ -1387,7 +1381,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) } else { setMessage(bformat(_("Opening child document %1$s..."), makeDisplayPath(filename.absFilename()))); - child = loadAndViewFile(filename, true); + child = lyx_view_->loadDocument(filename, false); parsed = true; } if (child) { @@ -1864,105 +1858,6 @@ void LyXFunc::sendDispatchMessage(docstring const & msg, FuncRequest const & cmd } -Buffer * LyXFunc::loadAndViewFile(FileName const & filename, bool tolastfiles) -{ - lyx_view_->setBusy(true); - - Buffer * newBuffer = checkAndLoadLyXFile(filename); - - if (!newBuffer) { - lyx_view_->message(_("Document not loaded.")); - lyx_view_->setBusy(false); - return 0; - } - - lyx_view_->setBuffer(newBuffer); - - // scroll to the position when the file was last closed - if (lyxrc.use_lastfilepos) { - LastFilePosSection::FilePos filepos = - LyX::ref().session().lastFilePos().load(filename); - lyx_view_->view()->moveToPosition(filepos.pit, filepos.pos, 0, 0); - } - - if (tolastfiles) - LyX::ref().session().lastFiles().add(filename); - - lyx_view_->setBusy(false); - return newBuffer; -} - - -void LyXFunc::open(string const & fname) -{ - string initpath = lyxrc.document_path; - - 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; - } - - string filename; - - if (fname.empty()) { - 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 = - dlg.open(from_utf8(initpath), - FileFilterList(_("LyX Documents (*.lyx)")), - docstring()); - - if (result.first == FileDialog::Later) - return; - - filename = to_utf8(result.second); - - // check selected filename - if (filename.empty()) { - lyx_view_->message(_("Canceled.")); - return; - } - } else - filename = fname; - - // get absolute path of file and add ".lyx" to the filename if - // necessary. - FileName const fullname = - fileSearch(string(), filename, "lyx", support::may_not_exist); - if (!fullname.empty()) - filename = fullname.absFilename(); - - // if the file doesn't exist, let the user create one - if (!fullname.exists()) { - // the user specifically chose this name. Believe him. - Buffer * const b = newFile(filename, string(), true); - if (b) - lyx_view_->setBuffer(b); - return; - } - - docstring const disp_fn = makeDisplayPath(filename); - lyx_view_->message(bformat(_("Opening document %1$s..."), disp_fn)); - - docstring str2; - Buffer * buf = loadAndViewFile(fullname); - if (buf) { - updateLabels(*buf); - lyx_view_->setBuffer(buf); - buf->errors("Parse"); - str2 = bformat(_("Document %1$s opened."), disp_fn); - } else { - str2 = bformat(_("Could not open document %1$s"), disp_fn); - } - lyx_view_->message(str2); -} - - void LyXFunc::doImport(string const & argument) { string format; @@ -2067,7 +1962,7 @@ void LyXFunc::reloadBuffer() // 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); + Buffer * buf = lyx_view_->loadDocument(filename); docstring const disp_fn = makeDisplayPath(filename.absFilename()); docstring str; if (buf) { diff --git a/src/LyXFunc.h b/src/LyXFunc.h index 3a0dd617db..64aa61960b 100644 --- a/src/LyXFunc.h +++ b/src/LyXFunc.h @@ -87,10 +87,6 @@ public: /// not the current buffer void gotoBookmark(unsigned int idx, bool openFile, bool switchToBuffer); - /// load a buffer into the current workarea. - Buffer * loadAndViewFile(support::FileName const & name, ///< File to load. - bool tolastfiles = true); ///< append to the "Open recent" menu? - /// cursor x position before dispatch started int cursorBeforeDispatchX() const { return cursorPosBeforeDispatchX_; @@ -133,8 +129,6 @@ private: void sendDispatchMessage(docstring const & msg, FuncRequest const & ev); - /// - void open(std::string const &); /// void doImport(std::string const &); /// diff --git a/src/frontends/Application.h b/src/frontends/Application.h index 826b9a3e2a..a63dfd9a1c 100644 --- a/src/frontends/Application.h +++ b/src/frontends/Application.h @@ -163,6 +163,9 @@ public: /// virtual void resetGui() = 0; + /// Load files and restore GUI Session. + virtual void restoreGuiSession() = 0; + /// virtual void hideDialogs(std::string const & name, Inset * inset) const = 0; /// diff --git a/src/frontends/LyXView.h b/src/frontends/LyXView.h index db9f33fb20..58a06740a4 100644 --- a/src/frontends/LyXView.h +++ b/src/frontends/LyXView.h @@ -67,6 +67,12 @@ public: virtual void setBuffer(Buffer * b) = 0; ///< \c Buffer to set. /// virtual bool closeBuffer() = 0; + + /// load a document into the current workarea. + virtual Buffer * loadDocument( + support::FileName const & name, ///< File to load. + bool tolastfiles = true ///< append to the "Open recent" menu? + ) = 0; /// virtual void newDocument(std::string const & filename, bool fromTemplate) = 0; diff --git a/src/frontends/qt4/GuiApplication.cpp b/src/frontends/qt4/GuiApplication.cpp index 932e52b1aa..dbfef23992 100644 --- a/src/frontends/qt4/GuiApplication.cpp +++ b/src/frontends/qt4/GuiApplication.cpp @@ -378,6 +378,24 @@ void GuiApplication::execBatchCommands() } +void GuiApplication::restoreGuiSession() +{ + if (!lyxrc.load_session) + return; + + Session & session = LyX::ref().session(); + vector const & lastopened = session.lastOpened().getfiles(); + // do not add to the lastfile list since these files are restored from + // last session, and should be already there (regular files), or should + // not be added at all (help files). + for_each(lastopened.begin(), lastopened.end(), + bind(&GuiView::loadDocument, current_view_, _1, false)); + + // clear this list to save a few bytes of RAM + session.lastOpened().clear(); +} + + QString const GuiApplication::romanFontName() { QFont font; @@ -429,7 +447,7 @@ bool GuiApplication::event(QEvent * e) // So we acknowledge the event and delay the file opening // until LyX is ready. // FIXME UNICODE: FileName accept an utf8 encoded string. - LyX::ref().addFileToLoad(FileName(fromqstr(foe->file()))); + LyX::ref().addFileToLoad(fromqstr(foe->file())); else lyx::dispatch(FuncRequest(LFUN_FILE_OPEN, qstring_to_ucs4(foe->file()))); diff --git a/src/frontends/qt4/GuiApplication.h b/src/frontends/qt4/GuiApplication.h index 060cf69b07..29b522b647 100644 --- a/src/frontends/qt4/GuiApplication.h +++ b/src/frontends/qt4/GuiApplication.h @@ -61,6 +61,7 @@ public: virtual FuncStatus getStatus(FuncRequest const &); virtual bool dispatch(FuncRequest const &); virtual void resetGui(); + void restoreGuiSession(); virtual Clipboard & clipboard(); virtual Selection & selection(); virtual FontLoader & fontLoader() { return font_loader_; } diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index 0360e830c3..7d75276deb 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -1055,6 +1055,105 @@ static FileName selectTemplateFile() } +Buffer * GuiView::loadDocument(FileName const & filename, bool tolastfiles) +{ + setBusy(true); + + Buffer * newBuffer = checkAndLoadLyXFile(filename); + + if (!newBuffer) { + message(_("Document not loaded.")); + setBusy(false); + return 0; + } + + setBuffer(newBuffer); + + // scroll to the position when the file was last closed + if (lyxrc.use_lastfilepos) { + LastFilePosSection::FilePos filepos = + LyX::ref().session().lastFilePos().load(filename); + view()->moveToPosition(filepos.pit, filepos.pos, 0, 0); + } + + if (tolastfiles) + LyX::ref().session().lastFiles().add(filename); + + setBusy(false); + return newBuffer; +} + + +void GuiView::openDocument(string const & fname) +{ + string initpath = lyxrc.document_path; + + if (buffer()) { + string const trypath = buffer()->filePath(); + // If directory is writeable, use this as default. + if (FileName(trypath).isDirWritable()) + initpath = trypath; + } + + string filename; + + if (fname.empty()) { + 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 = + dlg.open(from_utf8(initpath), + FileFilterList(_("LyX Documents (*.lyx)")), + docstring()); + + if (result.first == FileDialog::Later) + return; + + filename = to_utf8(result.second); + + // check selected filename + if (filename.empty()) { + message(_("Canceled.")); + return; + } + } else + filename = fname; + + // get absolute path of file and add ".lyx" to the filename if + // necessary. + FileName const fullname = + fileSearch(string(), filename, "lyx", support::may_not_exist); + if (!fullname.empty()) + filename = fullname.absFilename(); + + // if the file doesn't exist, let the user create one + if (!fullname.exists()) { + // the user specifically chose this name. Believe him. + Buffer * const b = newFile(filename, string(), true); + if (b) + setBuffer(b); + return; + } + + docstring const disp_fn = makeDisplayPath(filename); + message(bformat(_("Opening document %1$s..."), disp_fn)); + + docstring str2; + Buffer * buf = loadDocument(fullname); + if (buf) { + updateLabels(*buf); + setBuffer(buf); + buf->errors("Parse"); + str2 = bformat(_("Document %1$s opened."), disp_fn); + } else { + str2 = bformat(_("Could not open document %1$s"), disp_fn); + } + message(str2); +} + + void GuiView::newDocument(string const & filename, bool from_template) { FileName initpath(lyxrc.document_path); @@ -1352,6 +1451,10 @@ bool GuiView::dispatch(FuncRequest const & cmd) bv->cursor().updateFlags(Update::None); switch(cmd.action) { + case LFUN_FILE_OPEN: + openDocument(to_utf8(cmd.argument())); + break; + case LFUN_BUFFER_SWITCH: setBuffer(theBufferList().getBuffer(to_utf8(cmd.argument()))); break; diff --git a/src/frontends/qt4/GuiView.h b/src/frontends/qt4/GuiView.h index d73acbe8eb..fbf3c94c06 100644 --- a/src/frontends/qt4/GuiView.h +++ b/src/frontends/qt4/GuiView.h @@ -89,6 +89,11 @@ public: void setBuffer(Buffer * b); ///< \c Buffer to set. /// bool closeBuffer(); + /// load a document into the current workarea. + Buffer * loadDocument(support::FileName const & name, ///< File to load. + bool tolastfiles = true); ///< append to the "Open recent" menu? + /// + void openDocument(std::string const & filename); /// void newDocument(std::string const & filename, bool fromTemplate); /// write all buffers, asking the user, returns false if cancelled