X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fbuffer_funcs.cpp;h=1f1cd7917c1c6c8490b875be1af000d27d1e990f;hb=12dbcf2ee1792391a81d265ee8875ccf621033ca;hp=6527018748ae4f21737c42a8cfdcfd30bb5085b6;hpb=72e0b87a90ef78658ad7ea25d0cc1f17c0ef6362;p=lyx.git diff --git a/src/buffer_funcs.cpp b/src/buffer_funcs.cpp index 6527018748..1f1cd7917c 100644 --- a/src/buffer_funcs.cpp +++ b/src/buffer_funcs.cpp @@ -49,6 +49,9 @@ #include #include +using std::min; +using std::string; + namespace lyx { @@ -63,9 +66,6 @@ using support::onlyFilename; using support::onlyPath; using support::unlink; -using std::min; -using std::string; - namespace Alert = frontend::Alert; namespace fs = boost::filesystem; @@ -180,6 +180,56 @@ bool loadLyXFile(Buffer * b, FileName const & s) return false; } + +bool checkIfLoaded(FileName const & fn) +{ + return theBufferList().getBuffer(fn.absFilename()); +} + + +Buffer * checkAndLoadLyXFile(FileName const & filename) +{ + // File already open? + Buffer * checkBuffer = theBufferList().getBuffer(filename.absFilename()); + if (checkBuffer) { + if (checkBuffer->isClean()) + return checkBuffer; + docstring const file = makeDisplayPath(filename.absFilename(), 20); + docstring text = bformat(_( + "The document %1$s is already loaded and has unsaved changes.\n" + "Do you want to abandon your changes and reload the version on disk?"), file); + if (Alert::prompt(_("Reload saved document?"), + text, 0, 1, _("&Reload"), _("&Keep Changes"))) + 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; + } + + if (isFileReadable(filename)) { + Buffer * b = theBufferList().newBuffer(filename.absFilename()); + if (!lyx::loadLyXFile(b, filename)) { + theBufferList().release(b); + return 0; + } + return b; + } + + docstring text = bformat(_("The document %1$s does not yet " + "exist.\n\nDo you want to create a new document?"), + from_utf8(filename.absFilename())); + if (!Alert::prompt(_("Create new document?"), + text, 0, 1, _("&Create"), _("Cancel"))) + return newFile(filename.absFilename(), string(), true); + + return 0; +} + // FIXME newFile() should probably be a member method of Application... Buffer * newFile(string const & filename, string const & templatename, bool const isNamed) @@ -377,7 +427,7 @@ void setCaptionLabels(Inset & inset, string const & type, setCaptionLabels(icap, type, label, counters); if (icap.lyxCode() == Inset::CAPTION_CODE) { // We found a caption! - counters.step(counter); + counters.step(counter); int number = counters.value(counter); InsetCaption & ic = static_cast(icap); ic.setType(type); @@ -400,7 +450,7 @@ void setCaptions(Paragraph & par, TextClass const & textclass) InsetList::iterator end = par.insetlist.end(); for (; it != end; ++it) { Inset & inset = *it->inset; - if (inset.lyxCode() == Inset::FLOAT_CODE + if (inset.lyxCode() == Inset::FLOAT_CODE || inset.lyxCode() == Inset::WRAP_CODE) { docstring const name = inset.name(); if (name.empty()) @@ -419,6 +469,10 @@ void setCaptions(Paragraph & par, TextClass const & textclass) } else if (inset.lyxCode() == Inset::LISTINGS_CODE) setCaptionLabels(inset, "listing", from_ascii("Listing"), counters); + else if (inset.lyxCode() == Inset::INCLUDE_CODE) + // if this include inset contains lstinputlisting, and has a caption + // it will increase the 'listing' counter by one + static_cast(inset).updateCounter(counters); } } @@ -429,16 +483,13 @@ void setLabel(Buffer const & buf, ParIterator & it, TextClass const & textclass) Layout_ptr const & layout = par.layout(); Counters & counters = textclass.counters(); - if (it.pit() == 0) { - par.params().appendix(par.params().startOfAppendix()); - } else { - par.params().appendix(it.plist()[it.pit() - 1].params().appendix()); - if (!par.params().appendix() && - par.params().startOfAppendix()) { - par.params().appendix(true); - textclass.counters().reset(); - } + if (par.params().startOfAppendix()) { + // FIXME: only the counter corresponding to toplevel + // sectionning should be reset + counters.reset(); + counters.appendix(true); } + par.params().appendix(counters.appendix()); // Compute the item depth of the paragraph par.itemdepth = getItemDepth(it); @@ -594,70 +645,14 @@ void setLabel(Buffer const & buf, ParIterator & it, TextClass const & textclass) } // anon namespace -bool updateCurrentLabel(Buffer const & buf, - ParIterator & it) -{ - if (it == par_iterator_end(buf.inset())) - return false; - -// if (it.lastpit == 0 && Text::isMainText(buf)) -// return false; - - switch (it->layout()->labeltype) { - - case LABEL_NO_LABEL: - case LABEL_MANUAL: - case LABEL_BIBLIO: - case LABEL_TOP_ENVIRONMENT: - case LABEL_CENTERED_TOP_ENVIRONMENT: - case LABEL_STATIC: - case LABEL_ITEMIZE: - setLabel(buf, it, buf.params().getTextClass()); - return true; - - case LABEL_SENSITIVE: - case LABEL_COUNTER: - // do more things with enumerate later - case LABEL_ENUMERATE: - return false; - } - - // This is dead code which get rid of a warning: - return true; -} - - -void updateLabels(Buffer const & buf, - ParIterator & from, ParIterator & to, bool childonly) -{ - for (ParIterator it = from; it != to; ++it) { - if (it.pit() > it.lastpit()) - return; - if (!updateCurrentLabel (buf, it)) { - updateLabels(buf, childonly); - return; - } - } -} - - -void updateLabels(Buffer const & buf, ParIterator & iter, bool childonly) -{ - if (updateCurrentLabel(buf, iter)) - return; - - updateLabels(buf, childonly); -} - - void updateLabels(Buffer const & buf, bool childonly) { + Buffer const * const master = buf.getMasterBuffer(); // Use the master text class also for child documents - TextClass const & textclass = buf.params().getTextClass(); + TextClass const & textclass = master->params().getTextClass(); if (!childonly) { // If this is a child document start with the master - Buffer const * const master = buf.getMasterBuffer(); if (master != &buf) { updateLabels(*master); return; @@ -698,16 +693,17 @@ void updateLabels(Buffer const & buf, bool childonly) Buffer & cbuf = const_cast(buf); cbuf.tocBackend().update(); - cbuf.structureChanged(); + if (!childonly) + cbuf.structureChanged(); } void checkBufferStructure(Buffer & buffer, ParIterator const & par_it) { - if (par_it->layout()->labeltype == LABEL_COUNTER - && par_it->layout()->toclevel != Layout::NOT_IN_TOC) { - buffer.tocBackend().updateItem(par_it); - buffer.structureChanged(); + if (par_it->layout()->toclevel != Layout::NOT_IN_TOC) { + Buffer * master = buffer.getMasterBuffer(); + master->tocBackend().updateItem(par_it); + master->structureChanged(); } }