X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fbufferlist.C;h=3b69c1d0713dbf6f09509f515d1f5ab999262fb7;hb=d11fd01ce743c4974a96f241a99853f46078c80c;hp=5dc320670da45f26abb4836f1af45ff6e559056b;hpb=50cf230e42eda85fa486d28735ddbce7191625ca;p=lyx.git diff --git a/src/bufferlist.C b/src/bufferlist.C index 5dc320670d..3b69c1d071 100644 --- a/src/bufferlist.C +++ b/src/bufferlist.C @@ -1,43 +1,50 @@ /* This file is part of - * ====================================================== - * + * ====================================================== + * * LyX, The Document Word Processor * * Copyright 1995 Matthias Ettrich - * Copyright 1995-2000 The LyX Team. + * Copyright 1995-2001 The LyX Team. * - * This file is Copyright 1996-2000 + * This file is Copyright 1996-2001 * Lars Gullik Bjønnes * - * ====================================================== + * ====================================================== */ +#include + #ifdef __GNUG__ #pragma implementation #endif -#include - -#include -#include - #include "bufferlist.h" #include "lyx_main.h" -#include "support/FileInfo.h" -#include "support/filetools.h" -#include "support/lyxmanip.h" -#include "support/lyxfunctional.h" -#include "lyx_gui_misc.h" #include "lastfiles.h" #include "debug.h" #include "lyxrc.h" #include "lyxtext.h" #include "lyx_cb.h" #include "bufferview_funcs.h" +#include "BufferView.h" #include "gettext.h" #include "LyXView.h" #include "vc-backend.h" #include "TextCache.h" +#include "lyxtextclasslist.h" + +#include "frontends/Alert.h" + +#include "support/FileInfo.h" +#include "support/filetools.h" +#include "support/lyxmanip.h" +#include "support/lyxfunctional.h" +#include "support/LAssert.h" + +#include +#include +#include + using std::vector; using std::find; @@ -94,56 +101,63 @@ bool BufferList::empty() const } -bool BufferList::QwriteAll() +bool BufferList::qwriteOne(Buffer * buf, string const & fname, + string & unsaved_list) { - bool askMoreConfirmation = false; - string unsaved; - for (BufferStorage::iterator it = bstore.begin(); - it != bstore.end(); ++it) { + bool reask = true; + while (reask) { + switch (Alert::askConfirmation(_("Changes in document:"), + fname, + _("Save document?"))) { + case 1: // Yes + // FIXME: WriteAs can be asynch ! + if (buf->isUnnamed()) + reask = !WriteAs(current_view, buf); + else { + reask = !MenuWrite(current_view, buf); + } + break; + case 2: // No + // if we crash after this we could + // have no autosave file but I guess + // this is really inprobable (Jug) + if (buf->isUnnamed()) { + removeAutosaveFile(buf->fileName()); + } + + unsaved_list += MakeDisplayPath(fname, 50) + "\n"; + return true; + case 3: // Cancel + return false; + } + } + return true; +} + + +bool BufferList::qwriteAll() +{ + string unsaved; + BufferStorage::iterator it = bstore.begin(); + BufferStorage::iterator end = bstore.end(); + for (; it != end; ++it) { if (!(*it)->isLyxClean()) { string fname; if ((*it)->isUnnamed()) fname = OnlyFilename((*it)->fileName()); else fname = MakeDisplayPath((*it)->fileName(), 50); - bool reask = true; - while (reask) { - switch (AskConfirmation(_("Changes in document:"), - fname, - _("Save document?"))) { - case 1: // Yes - if ((*it)->isUnnamed()) - reask = !WriteAs(current_view, (*it)); - else { - reask = !MenuWrite(current_view, (*it)); - } - break; - case 2: // No - // if we crash after this we could - // have no autosave file but I guess - // this is really inprobable (Jug) - if ((*it)->isUnnamed()) { - removeAutosaveFile((*it)->fileName()); - } - askMoreConfirmation = true; - unsaved += MakeDisplayPath(fname, 50); - unsaved += "\n"; - reask = false; - break; - case 3: // Cancel - return false; - } - } + if (!qwriteOne(*it, fname, unsaved)) // cancel the request! + return false; } } - if (askMoreConfirmation && - lyxrc.exit_confirmation && - !AskQuestion(_("Some documents were not saved:"), - unsaved, _("Exit anyway?"))) { - return false; - } - - return true; + + if (!unsaved.empty() && lyxrc.exit_confirmation) { + return Alert::askQuestion(_("Some documents were not saved:"), + unsaved, _("Exit anyway?")); + } + + return true; } @@ -153,7 +167,7 @@ void BufferList::closeAll() // Since we are closing we can just as well delete all // in the textcache this will also speed the closing/quiting up a bit. textcache.clear(); - + while (!bstore.empty()) { close(bstore.front()); } @@ -161,24 +175,20 @@ void BufferList::closeAll() } -void BufferList::resize() -{ - for_each(bstore.begin(), bstore.end(), mem_fun(&Buffer::resize)); -} - - bool BufferList::close(Buffer * buf) { lyx::Assert(buf); - + // CHECK // Trace back why we need to use buf->getUser here. // Perhaps slight rewrite is in order? (Lgb) - - if (buf->getUser()) buf->getUser()->insetUnlock(); + + if (buf->getUser()) + buf->getUser()->insetUnlock(); + if (buf->paragraph && !buf->isLyxClean() && !quitting) { if (buf->getUser()) - ProhibitInput(buf->getUser()); + buf->getUser()->owner()->prohibitInput(); string fname; if (buf->isUnnamed()) fname = OnlyFilename(buf->fileName()); @@ -186,9 +196,9 @@ bool BufferList::close(Buffer * buf) fname = MakeDisplayPath(buf->fileName(), 50); bool reask = true; while (reask) { - switch (AskConfirmation(_("Changes in document:"), + switch (Alert::askConfirmation(_("Changes in document:"), fname, - _("Save document?"))){ + _("Save document?"))) { case 1: // Yes if (buf->isUnnamed()) reask = !WriteAs(current_view, buf); @@ -197,7 +207,7 @@ bool BufferList::close(Buffer * buf) reask = false; } else { if (buf->getUser()) - AllowInput(buf->getUser()); + buf->getUser()->owner()->allowInput(); return false; } break; @@ -209,12 +219,12 @@ bool BufferList::close(Buffer * buf) break; case 3: // Cancel if (buf->getUser()) - AllowInput(buf->getUser()); + buf->getUser()->owner()->allowInput(); return false; } } if (buf->getUser()) - AllowInput(buf->getUser()); + buf->getUser()->owner()->allowInput(); } bstore.release(buf); @@ -233,14 +243,16 @@ vector const BufferList::getFileNames() const Buffer * BufferList::first() { - if (bstore.empty()) return 0; + if (bstore.empty()) + return 0; return bstore.front(); } Buffer * BufferList::getBuffer(unsigned int choice) { - if (choice >= bstore.size()) return 0; + if (choice >= bstore.size()) + return 0; return bstore[choice]; } @@ -248,10 +260,10 @@ Buffer * BufferList::getBuffer(unsigned int choice) int BufferList::unlockInset(UpdatableInset * inset) { lyx::Assert(inset); - - //if (!inset) return 1; - for (BufferStorage::iterator it = bstore.begin(); - it != bstore.end(); ++it) { + + BufferStorage::iterator it = bstore.begin(); + BufferStorage::iterator end = bstore.end(); + for (; it != end; ++it) { if ((*it)->getUser() && (*it)->getUser()->theLockingInset() == inset) { (*it)->getUser()->insetUnlock(); @@ -264,8 +276,9 @@ int BufferList::unlockInset(UpdatableInset * inset) void BufferList::updateIncludedTeXfiles(string const & mastertmpdir) { - for (BufferStorage::iterator it = bstore.begin(); - it != bstore.end(); ++it) { + BufferStorage::iterator it = bstore.begin(); + BufferStorage::iterator end = bstore.end(); + for (; it != end; ++it) { if (!(*it)->isDepClean(mastertmpdir)) { string writefile = mastertmpdir; writefile += '/'; @@ -285,20 +298,21 @@ void BufferList::emergencyWriteAll() } -void BufferList::emergencyWrite(Buffer * buf) +void BufferList::emergencyWrite(Buffer * buf) { // assert(buf) // this is not good since C assert takes an int - // and a pointer is a long (JMarc) + // and a pointer is a long (JMarc) assert(buf != 0); // use c assert to avoid a loop - + // No need to save if the buffer has not changed. - if (buf->isLyxClean()) return; - + if (buf->isLyxClean()) + return; + lyxerr << fmt(_("lyx: Attempting to save document %s as..."), buf->isUnnamed() ? OnlyFilename(buf->fileName()).c_str() : buf->fileName().c_str()) << endl; - + // We try to save three places: // 1) Same place as document. Unless it is an unnamed doc. @@ -314,7 +328,7 @@ void BufferList::emergencyWrite(Buffer * buf) lyxerr << _(" Save failed! Trying...") << endl; } } - + // 2) In HOME directory. string s = AddName(GetEnvPath("HOME"), buf->fileName()); s += ".emergency"; @@ -324,9 +338,9 @@ void BufferList::emergencyWrite(Buffer * buf) lyxerr << _(" Save seems successful. Phew.") << endl; return; } - + lyxerr << _(" Save failed! Trying...") << endl; - + // 3) In "/tmp" directory. // MakeAbsPath to prepend the current // drive letter on OS/2 @@ -345,14 +359,20 @@ void BufferList::emergencyWrite(Buffer * buf) Buffer * BufferList::readFile(string const & s, bool ronly) { - Buffer * b = bstore.newBuffer(s, ronly); - - string ts = s; + string ts(s); string e = OnlyPath(s); string a = e; // File information about normal file FileInfo fileInfo2(s); + if (!fileInfo2.exist()) { + Alert::alert(_("Error!"), _("Cannot open file"), + MakeDisplayPath(s)); + return 0; + } + + Buffer * b = bstore.newBuffer(s, ronly); + // Check if emergency save file exists and is newer. e += OnlyFilename(s) + ".emergency"; FileInfo fileInfoE(e); @@ -362,7 +382,7 @@ Buffer * BufferList::readFile(string const & s, bool ronly) if (fileInfoE.exist() && fileInfo2.exist()) { if (fileInfoE.getModificationTime() > fileInfo2.getModificationTime()) { - if (AskQuestion(_("An emergency save of this document exists!"), + if (Alert::askQuestion(_("An emergency save of this document exists!"), MakeDisplayPath(s, 50), _("Try to load that instead?"))) { ts = e; @@ -386,7 +406,7 @@ Buffer * BufferList::readFile(string const & s, bool ronly) if (fileInfoA.exist() && fileInfo2.exist()) { if (fileInfoA.getModificationTime() > fileInfo2.getModificationTime()) { - if (AskQuestion(_("Autosave file is newer."), + if (Alert::askQuestion(_("Autosave file is newer."), MakeDisplayPath(s, 50), _("Load that one instead?"))) { ts = a; @@ -423,7 +443,7 @@ bool BufferList::exists(string const & s) const bool BufferList::isLoaded(Buffer const * b) const { lyx::Assert(b); - + BufferStorage::const_iterator cit = find(bstore.begin(), bstore.end(), b); return cit != bstore.end(); @@ -448,23 +468,25 @@ Buffer * BufferList::newFile(string const & name, string tname, bool isNamed) if (tname.empty()) { tname = LibFileSearch("templates", "defaults.lyx"); } - if (!tname.empty() && IsLyXFilename(tname)) { + if (!tname.empty()) { bool templateok = false; LyXLex lex(0, 0); lex.setFile(tname); - if (lex.IsOK()) { + if (lex.isOK()) { if (b->readFile(lex)) { templateok = true; } } if (!templateok) { - WriteAlert(_("Error!"), _("Unable to open template"), + Alert::alert(_("Error!"), _("Unable to open template"), MakeDisplayPath(tname)); // no template, start with empty buffer - b->paragraph = new LyXParagraph; + b->paragraph = new Paragraph; + b->paragraph->layout(textclasslist[b->params.textclass].defaultLayoutName()); } } else { // start with empty buffer - b->paragraph = new LyXParagraph; + b->paragraph = new Paragraph; + b->paragraph->layout(textclasslist[b->params.textclass].defaultLayoutName()); } if (!lyxrc.new_ask_filename && !isNamed) { @@ -473,19 +495,23 @@ Buffer * BufferList::newFile(string const & name, string tname, bool isNamed) } b->setReadonly(false); - + return b; } Buffer * BufferList::loadLyXFile(string const & filename, bool tolastfiles) { - // make sure our path is absolute - string const s = MakeAbsPath(filename); + // get absolute path of file and add ".lyx" to the filename if + // necessary + string s = FileSearch(string(), filename, "lyx"); + if (s.empty()) { + s = filename; + } // file already open? if (exists(s)) { - if (AskQuestion(_("Document is already open:"), + if (Alert::askQuestion(_("Document is already open:"), MakeDisplayPath(s, 50), _("Do you want to reload that document?"))) { // Reload is accomplished by closing and then loading @@ -494,7 +520,7 @@ Buffer * BufferList::loadLyXFile(string const & filename, bool tolastfiles) } // Fall through to new load. (Asger) } else { - // Here, we pretend that we just loaded the + // Here, we pretend that we just loaded the // open document return getBuffer(s); } @@ -516,15 +542,15 @@ Buffer * BufferList::loadLyXFile(string const & filename, bool tolastfiles) if (LyXVC::file_not_found_hook(s)) { // Ask if the file should be checked out for // viewing/editing, if so: load it. - if (AskQuestion(_("Do you want to retrieve file under version control?"))) { + if (Alert::askQuestion(_("Do you want to retrieve file under version control?"))) { // How can we know _how_ to do the checkout? // With the current VC support it has to be, // a RCS file since CVS do not have special ,v files. - RCS::retrive(s); + RCS::retrieve(s); return loadLyXFile(filename, tolastfiles); } } - if (AskQuestion(_("Cannot open specified file:"), + if (Alert::askQuestion(_("Cannot open specified file:"), MakeDisplayPath(s, 50), _("Create new document with this name?"))) {