X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fbuffer_funcs.cpp;h=6e8e612f94480f6c191a88de63209102359fdab1;hb=0362c6aae73c293d1c20277c12d362acfe0b2ef6;hp=d66040c5630ad9e77bf803708743219ef827ac42;hpb=f934b86850678bafc863d44710bce52957d2fad2;p=lyx.git diff --git a/src/buffer_funcs.cpp b/src/buffer_funcs.cpp index d66040c563..6e8e612f94 100644 --- a/src/buffer_funcs.cpp +++ b/src/buffer_funcs.cpp @@ -16,20 +16,18 @@ #include "Buffer.h" #include "BufferList.h" #include "BufferParams.h" -#include "debug.h" #include "DocIterator.h" #include "Counters.h" #include "ErrorList.h" #include "Floating.h" #include "FloatList.h" -#include "gettext.h" #include "InsetList.h" #include "InsetIterator.h" #include "Language.h" #include "LaTeX.h" #include "Layout.h" +#include "LayoutPtr.h" #include "LyX.h" -#include "lyxlayout_ptr_fwd.h" #include "TextClass.h" #include "TextClassList.h" #include "Paragraph.h" @@ -46,38 +44,21 @@ #include "insets/InsetBibitem.h" #include "insets/InsetInclude.h" +#include "support/convert.h" +#include "support/debug.h" #include "support/filetools.h" -#include "support/fs_extras.h" -#include "support/lyxlib.h" - -#include - -using std::min; -using std::string; - - -namespace lyx { +#include "support/gettext.h" +#include "support/lstrings.h" +#include "support/textutils.h" using namespace std; +using namespace lyx::support; -using support::bformat; -using support::FileName; -using support::libFileSearch; -using support::makeAbsPath; -using support::makeDisplayPath; -using support::onlyFilename; -using support::onlyPath; -using support::unlink; +namespace lyx { namespace Alert = frontend::Alert; -bool checkIfLoaded(FileName const & fn) -{ - return theBufferList().getBuffer(fn.absFilename()); -} - - Buffer * checkAndLoadLyXFile(FileName const & filename) { // File already open? @@ -94,16 +75,23 @@ Buffer * checkAndLoadLyXFile(FileName const & filename) return checkBuffer; // FIXME: should be LFUN_REVERT - if (theBufferList().close(checkBuffer, false)) - // Load it again. - return checkAndLoadLyXFile(filename); - else - // The file could not be closed. - return 0; + theBufferList().release(checkBuffer); + // Load it again. + return checkAndLoadLyXFile(filename); } - if (filename.isReadable()) { + if (filename.exists()) { + if (!filename.isReadableFile()) { + docstring text = bformat(_("The file %1$s exists but is not " + "readable by the current user."), + from_utf8(filename.absFilename())); + Alert::error(_("File not readable!"), text); + return 0; + } Buffer * b = theBufferList().newBuffer(filename.absFilename()); + if (!b) + // Buffer creation is not possible. + return 0; if (!b->loadLyXFile(filename)) { theBufferList().release(b); return 0; @@ -128,7 +116,9 @@ Buffer * newFile(string const & filename, string const & templatename, { // get a free buffer Buffer * b = theBufferList().newBuffer(filename); - BOOST_ASSERT(b); + if (!b) + // Buffer creation is not possible. + return 0; FileName tname; // use defaults.lyx as a default template if it exists. @@ -161,6 +151,23 @@ Buffer * newFile(string const & filename, string const & templatename, } +Buffer * newUnnamedFile(string const & templatename, FileName const & path) +{ + static int newfile_number; + + string document_path = path.absFilename(); + string filename = addName(document_path, + "newfile" + convert(++newfile_number) + ".lyx"); + while (theBufferList().exists(filename) + || FileName(filename).isReadableFile()) { + ++newfile_number; + filename = addName(document_path, + "newfile" + convert(newfile_number) + ".lyx"); + } + return newFile(filename, templatename, false); +} + + int countWords(DocIterator const & from, DocIterator const & to) { int count = 0; @@ -183,6 +190,36 @@ int countWords(DocIterator const & from, DocIterator const & to) } +int countChars(DocIterator const & from, DocIterator const & to, bool with_blanks) +{ + int chars = 0; + int blanks = 0; + for (DocIterator dit = from ; dit != to ; dit.forwardPos()) { + + if (!dit.inTexted()) continue; + Paragraph const & par = dit.paragraph(); + pos_type const pos = dit.pos(); + + if (pos != dit.lastpos() && !par.isDeleted(pos)) { + if (Inset const * ins = par.getInset(pos)) { + if (ins->isLetter()) + ++chars; + else if (with_blanks && ins->isSpace()) + ++blanks; + } else { + char_type const c = par.getChar(pos); + if (isPrintableNonspace(c)) + ++chars; + else if (isSpace(c) && with_blanks) + ++blanks; + } + } + } + + return chars + blanks; +} + + namespace { depth_type getDepth(DocIterator const & it) @@ -223,19 +260,16 @@ depth_type getItemDepth(ParIterator const & it) Paragraph & prev_par = *prev_it; depth_type const prev_depth = getDepth(prev_it); if (labeltype == prev_par.layout()->labeltype) { - if (prev_depth < min_depth) { + if (prev_depth < min_depth) return prev_par.itemdepth + 1; - } - else if (prev_depth == min_depth) { + if (prev_depth == min_depth) return prev_par.itemdepth; - } } - min_depth = std::min(min_depth, prev_depth); + min_depth = min(min_depth, prev_depth); // small optimization: if we are at depth 0, we won't // find anything else - if (prev_depth == 0) { + if (prev_depth == 0) return 0; - } } } @@ -260,7 +294,7 @@ bool needEnumCounterReset(ParIterator const & it) // set the label of a paragraph. This includes the counters. void setLabel(Buffer const & buf, ParIterator & it) { - TextClass const & textclass = buf.params().getTextClass(); + TextClass const & textclass = buf.params().textClass(); Paragraph & par = it.paragraph(); LayoutPtr const & layout = par.layout(); Counters & counters = textclass.counters(); @@ -414,6 +448,12 @@ void updateLabels(Buffer const & buf, ParIterator & parit) { BOOST_ASSERT(parit.pit() == 0); + // set the position of the text in the buffer to be able + // to resolve macros in it. This has nothing to do with + // labels, but by putting it here we avoid implementing + // a whole bunch of traversal routines just for this call. + parit.text()->setMacrocontextPosition(parit); + depth_type maxdepth = 0; pit_type const lastpit = parit.lastpit(); for ( ; parit.pit() <= lastpit ; ++parit.pit()) { @@ -442,7 +482,7 @@ void updateLabels(Buffer const & buf, bool childonly) { Buffer const * const master = buf.masterBuffer(); // Use the master text class also for child documents - TextClass const & textclass = master->params().getTextClass(); + TextClass const & textclass = master->params().textClass(); if (!childonly) { // If this is a child document start with the master @@ -473,21 +513,6 @@ void updateLabels(Buffer const & buf, bool childonly) cbuf.tocBackend().update(); if (!childonly) cbuf.structureChanged(); - // FIXME - // the embedding signal is emitted with structureChanged signal - // this is inaccurate so these two will be separated later. - //cbuf.embeddedFiles().update(); - //cbuf.embeddingChanged(); -} - - -void checkBufferStructure(Buffer & buffer, ParIterator const & par_it) -{ - if (par_it->layout()->toclevel != Layout::NOT_IN_TOC) { - Buffer * master = buffer.masterBuffer(); - master->tocBackend().updateItem(par_it); - master->structureChanged(); - } }