X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetRef.cpp;h=79dfad24806415beefb79254718844040bd042f0;hb=c0adb03a7ae15cf6409ee3cb64f4cc91c24c052e;hp=c9fcd993d09dbcc29114c7adbc2e5266e859ca32;hpb=d6b4db1a4f85b15090d15afda0b9ec6c23d28e4c;p=lyx.git diff --git a/src/insets/InsetRef.cpp b/src/insets/InsetRef.cpp index c9fcd993d0..79dfad2480 100644 --- a/src/insets/InsetRef.cpp +++ b/src/insets/InsetRef.cpp @@ -22,6 +22,7 @@ #include "LyX.h" #include "OutputParams.h" #include "output_xhtml.h" +#include "Paragraph.h" #include "ParIterator.h" #include "sgml.h" #include "texstream.h" @@ -40,12 +41,12 @@ namespace lyx { InsetRef::InsetRef(Buffer * buf, InsetCommandParams const & p) - : InsetCommand(buf, p), broken_(false) + : InsetCommand(buf, p), broken_(false), active_(true) {} InsetRef::InsetRef(InsetRef const & ir) - : InsetCommand(ir), broken_(false) + : InsetCommand(ir), broken_(false), active_(true) {} @@ -79,6 +80,28 @@ ParamInfo const & InsetRef::findInfo(string const & /* cmdName */) } +docstring InsetRef::layoutName() const +{ + return from_ascii("Ref"); +} + + +void InsetRef::changeTarget(docstring const & new_label) +{ + // With change tracking, we insert a new ref + // and delete the old one + if (buffer().masterParams().track_changes) { + InsetCommandParams icp(REF_CODE, "ref"); + icp["reference"] = new_label; + string const data = InsetCommand::params2string(icp); + lyx::dispatch(FuncRequest(LFUN_INSET_INSERT, data)); + lyx::dispatch(FuncRequest(LFUN_CHAR_DELETE_FORWARD)); + } else + setParam("reference", new_label); +} + + + void InsetRef::doDispatch(Cursor & cur, FuncRequest & cmd) { string const inset = cmd.getArg(0); @@ -91,6 +114,15 @@ void InsetRef::doDispatch(Cursor & cur, FuncRequest & cmd) pstring = "caps"; else if (arg == "toggle-noprefix") pstring = "noprefix"; + else if (arg == "changetarget") { + string const oldtarget = cmd.getArg(2); + string const newtarget = cmd.getArg(3); + if (!oldtarget.empty() && !newtarget.empty() + && getParam("reference") == from_utf8(oldtarget)) + changeTarget(from_utf8(newtarget)); + cur.forceBufferUpdate(); + return; + } } // otherwise not for us if (pstring.empty()) @@ -111,6 +143,8 @@ bool InsetRef::getStatus(Cursor & cur, FuncRequest const & cmd, string const arg = cmd.getArg(1); string pstring; + if (arg == "changetarget") + return true; if (arg == "toggle-plural") pstring = "plural"; else if (arg == "toggle-caps") @@ -365,9 +399,26 @@ void InsetRef::forOutliner(docstring & os, size_t const, bool const) const } -void InsetRef::updateBuffer(ParIterator const & it, UpdateType) +void InsetRef::updateBuffer(ParIterator const & it, UpdateType, bool const /*deleted*/) { docstring const & ref = getParam("reference"); + + // Check if this one is active (i.e., neither deleted with change-tracking + // nor in an inset that does not produce output, such as notes or inactive branches) + Paragraph const & para = it.paragraph(); + active_ = !para.isDeleted(it.pos()) && para.inInset().producesOutput(); + // If not, check whether we are in a deleted/non-outputting inset + if (active_) { + for (size_type sl = 0 ; sl < it.depth() ; ++sl) { + Paragraph const & outer_par = it[sl].paragraph(); + if (outer_par.isDeleted(it[sl].pos()) + || !outer_par.inInset().producesOutput()) { + active_ = false; + break; + } + } + } + // register this inset into the buffer reference cache. buffer().addReference(ref, this, it); @@ -410,6 +461,7 @@ void InsetRef::updateBuffer(ParIterator const & it, UpdateType) screen_label_ = label; broken_ = false; + setBroken(broken_); } @@ -420,20 +472,28 @@ docstring InsetRef::screenLabel() const void InsetRef::addToToc(DocIterator const & cpit, bool output_active, - UpdateType, TocBackend & backend) const + UpdateType, TocBackend & backend) const { + active_ = output_active; docstring const & label = getParam("reference"); if (buffer().insetLabel(label)) { broken_ = !buffer().activeLabel(label); + setBroken(broken_); + if (broken_ && output_active) { + shared_ptr toc2 = backend.toc("brokenrefs"); + toc2->push_back(TocItem(cpit, 0, screenLabel(), output_active)); + } // This InsetRef has already been taken care of in InsetLabel::addToToc(). return; } // It seems that this reference does not point to any valid label. - broken_ = true; + setBroken(broken_); shared_ptr toc = backend.toc("label"); toc->push_back(TocItem(cpit, 0, screenLabel(), output_active)); + shared_ptr toc2 = backend.toc("brokenrefs"); + toc2->push_back(TocItem(cpit, 0, screenLabel(), output_active)); } @@ -471,6 +531,19 @@ void InsetRef::validate(LaTeXFeatures & features) const features.require("nameref"); } +bool InsetRef::forceLTR(OutputParams const & rp) const +{ + // We force LTR for references. However, + // * Namerefs are output in the scripts direction + // at least with fontspec/bidi and luabidi, though (see #11518). + // * Parentheses are automatically swapped with XeTeX/bidi + // [not with LuaTeX/luabidi] (see #11626). + // FIXME: Re-Audit all other RTL cases. + if (rp.useBidiPackage()) + return false; + return (getCmdName() != "nameref" || !buffer().masterParams().useNonTeXFonts); +} + InsetRef::type_info const InsetRef::types[] = { { "ref", N_("Standard"), N_("Ref: ")}, @@ -487,6 +560,11 @@ InsetRef::type_info const InsetRef::types[] = { docstring InsetRef::getTOCString() const { + docstring const & label = getParam("reference"); + if (buffer().insetLabel(label)) + broken_ = !buffer().activeLabel(label) && active_; + else + broken_ = active_; return tooltip_.empty() ? screenLabel() : tooltip_; }