X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fbufferlist.C;h=448a01af271a29df14080adb4aea393389d46044;hb=2f08c8882155b1158548f1c34b100f58a7b63f01;hp=428b50c5e20679f7b02d8c2590077d994eeb9381;hpb=9ce32d63e5ff1dbf4c04e3d8263b2649ef3ac595;p=lyx.git diff --git a/src/bufferlist.C b/src/bufferlist.C index 428b50c5e2..448a01af27 100644 --- a/src/bufferlist.C +++ b/src/bufferlist.C @@ -3,8 +3,8 @@ * * LyX, The Document Word Processor * - * Copyright 1995 Matthias Ettrich - * Copyright 1995-2000 The LyX Team. + * Copyright 1995 Matthias Ettrich + * Copyright 1995-2000 The LyX Team. * * This file is Copyright 1996-2000 * Lars Gullik Bjønnes @@ -18,12 +18,8 @@ #include -#include #include -#include -#include - #include "bufferlist.h" #include "lyx_main.h" #include "minibuffer.h" @@ -33,21 +29,19 @@ #include "lastfiles.h" #include "debug.h" #include "lyxrc.h" -#include "lyxscreen.h" #include "lyxtext.h" #include "lyx_cb.h" +#include "bufferview_funcs.h" #include "gettext.h" #include "LyXView.h" #include "vc-backend.h" #include "TextCache.h" -extern BufferView * current_view; -extern int RunLinuxDoc(int, string const &); +extern BufferView * current_view; // called too many times in this file... -using std::ifstream; -using std::ofstream; -using std::ios; +using std::vector; using std::find; +using std::endl; // // Class BufferStorage @@ -68,11 +62,9 @@ void BufferStorage::release(Buffer * buf) } -Buffer * BufferStorage::newBuffer(string const & s, - LyXRC * lyxrc, - bool ronly) +Buffer * BufferStorage::newBuffer(string const & s, bool ronly) { - Buffer * tmpbuf = new Buffer(s, lyxrc, ronly); + Buffer * tmpbuf = new Buffer(s, ronly); tmpbuf->params.useClassDefaults(); lyxerr.debug() << "Assigning to buffer " << container.size() << endl; @@ -124,7 +116,7 @@ bool BufferList::QwriteAll() } } if (askMoreConfirmation && - lyxrc->exit_confirmation && + lyxrc.exit_confirmation && !AskQuestion(_("Some documents were not saved:"), unsaved, _("Exit anyway?"))) { return false; @@ -134,105 +126,6 @@ bool BufferList::QwriteAll() } -// Should probably be moved to somewhere else: BufferView? LyXView? -bool BufferList::write(Buffer * buf, bool makeBackup) -{ - if (buf->getUser()) - buf->getUser() - ->owner() - ->getMiniBuffer() - ->Set(_("Saving document"), - MakeDisplayPath(buf->fileName()), "..."); - - // We don't need autosaves in the immediate future. (Asger) - buf->resetAutosaveTimers(); - - // make a backup - if (makeBackup) { - string s = buf->fileName() + '~'; - // Rename is the wrong way of making a backup, - // this is the correct way. - /* truss cp fil fil2: - lstat("LyXVC3.lyx", 0xEFFFF898) Err#2 ENOENT - stat("LyXVC.lyx", 0xEFFFF688) = 0 - open("LyXVC.lyx", O_RDONLY) = 3 - open("LyXVC3.lyx", O_WRONLY|O_CREAT|O_TRUNC, 0600) = 4 - fstat(4, 0xEFFFF508) = 0 - fstat(3, 0xEFFFF508) = 0 - read(3, " # T h i s f i l e w".., 8192) = 5579 - write(4, " # T h i s f i l e w".., 5579) = 5579 - read(3, 0xEFFFD4A0, 8192) = 0 - close(4) = 0 - close(3) = 0 - chmod("LyXVC3.lyx", 0100644) = 0 - lseek(0, 0, SEEK_CUR) = 46440 - _exit(0) - */ - - // Should proabaly have some more error checking here. - // Should be cleaned up in 0.13, at least a bit. - // Doing it this way, also makes the inodes stay the same. - // This is still not a very good solution, in particular we - // might loose the owner of the backup. - FileInfo finfo(buf->fileName()); - if (finfo.exist()) { - mode_t fmode = finfo.getMode(); - struct utimbuf * times = new struct utimbuf; - - times->actime = finfo.getAccessTime(); - times->modtime = finfo.getModificationTime(); - ifstream ifs(buf->fileName().c_str()); - ofstream ofs(s.c_str(), ios::out|ios::trunc); - if (ifs && ofs) { - ofs << ifs.rdbuf(); - ifs.close(); - ofs.close(); - ::chmod(s.c_str(), fmode); - - if (::utime(s.c_str(), times)) { - lyxerr << "utime error." << endl; - } - } else { - lyxerr << "LyX was not able to make " - "backupcopy. Beware." << endl; - } - delete times; - } - } - - if (buf->writeFile(buf->fileName(), false)) { - buf->markLyxClean(); - - current_view->owner()->getMiniBuffer()-> - Set(_("Document saved as"), - MakeDisplayPath(buf->fileName())); - - // now delete the autosavefile - string a = OnlyPath(buf->fileName()); - a += '#'; - a += OnlyFilename(buf->fileName()); - a += '#'; - FileInfo fileinfo(a); - if (fileinfo.exist()) { - if (::remove(a.c_str()) != 0) { - WriteFSAlert(_("Could not delete " - "auto-save file!"), a); - } - } - } else { - // Saving failed, so backup is not backup - if (makeBackup) { - string s = buf->fileName() + '~'; - ::rename(s.c_str(), buf->fileName().c_str()); - } - current_view->owner()->getMiniBuffer()->Set(_("Save failed!")); - return false; - } - - return true; -} - - void BufferList::closeAll() { state_ = BufferList::CLOSING; @@ -258,26 +151,29 @@ void BufferList::resize() bool BufferList::close(Buffer * buf) { - if (buf->getUser()) buf->getUser()->insetUnlock(); + // 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->paragraph && !buf->isLyxClean() && !quitting) { - ProhibitInput(); + if (buf->getUser()) ProhibitInput(buf->getUser()); switch(AskConfirmation(_("Changes in document:"), MakeDisplayPath(buf->fileName(), 50), _("Save document?"))){ case 1: // Yes - if (write(buf, lyxrc->make_backup)) { + if (buf->save()) { lastfiles->newFile(buf->fileName()); } else { - AllowInput(); + if (buf->getUser()) AllowInput(buf->getUser()); return false; } break; case 3: // Cancel - AllowInput(); + if (buf->getUser()) AllowInput(buf->getUser()); return false; } - AllowInput(); + if (buf->getUser()) AllowInput(buf->getUser()); } bstore.release(buf); @@ -310,20 +206,6 @@ Buffer * BufferList::getBuffer(int choice) } -void BufferList::updateInset(Inset * inset, bool mark_dirty) -{ - for (BufferStorage::iterator it = bstore.begin(); - it != bstore.end(); ++it) { - if ((*it)->getUser() - && (*it)->getUser()->text->UpdateInset(inset)) { - if (mark_dirty) - (*it)->markDirty(); - break; - } - } -} - - int BufferList::unlockInset(UpdatableInset * inset) { if (!inset) return 1; @@ -346,8 +228,7 @@ void BufferList::updateIncludedTeXfiles(string const & mastertmpdir) if (!(*it)->isDepClean(mastertmpdir)) { string writefile = mastertmpdir; writefile += '/'; - writefile += ChangeExtension((*it)->fileName(), - ".tex", true); + writefile += (*it)->getLatexName(); (*it)->makeLaTeXFile(writefile, mastertmpdir, false, true); (*it)->markDepClean(mastertmpdir); @@ -411,7 +292,7 @@ void BufferList::emergencyWriteAll() Buffer * BufferList::readFile(string const & s, bool ronly) { - Buffer * b = bstore.newBuffer(s, lyxrc, ronly); + Buffer * b = bstore.newBuffer(s, ronly); string ts = s; string e = OnlyPath(s); @@ -511,7 +392,7 @@ Buffer * BufferList::getBuffer(string const & s) Buffer * BufferList::newFile(string const & name, string tname) { // get a free buffer - Buffer * b = bstore.newBuffer(name, lyxrc); + Buffer * b = bstore.newBuffer(name); // use defaults.lyx as a default template if it exists. if (tname.empty()) { @@ -549,26 +430,6 @@ Buffer * BufferList::loadLyXFile(string const & filename, bool tolastfiles) // make sure our path is absolute string s = MakeAbsPath(filename); - // Is this done too early? - // Is it LinuxDoc? - if (IsSGMLFilename(s)) { - FileInfo fi(s); - if (fi.exist() && fi.readable()) { - if (!RunLinuxDoc(-1, s)) { - s = ChangeExtension (s, ".lyx", false); - } else { // sgml2lyx failed - WriteAlert(_("Error!"), - _("Could not convert file"), s); - return 0; - } - } else { - // just change the extension and it will be - // handled like a regular lyx file that does - // not exist. - s = ChangeExtension(s, ".lyx", false); - } - } - // file already open? if (exists(s)) { if (AskQuestion(_("Document is already open:"), @@ -589,9 +450,11 @@ Buffer * BufferList::loadLyXFile(string const & filename, bool tolastfiles) bool ro = false; switch (IsFileWriteable(s)) { case 0: +#if 0 current_view->owner()->getMiniBuffer()-> Set(_("File `") + MakeDisplayPath(s, 50) + _("' is read-only.")); +#endif ro = true; // Fall through case 1: @@ -605,7 +468,7 @@ 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 retrive file under version control?"))) { + if (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.