]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetRef.cpp
Get rid of Qt resources
[lyx.git] / src / insets / InsetRef.cpp
index 4767f7b653a3f22d434abcd3a7676478f5d82ad8..79dfad24806415beefb79254718844040bd042f0 100644 (file)
@@ -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<Toc> 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> toc = backend.toc("label");
        toc->push_back(TocItem(cpit, 0, screenLabel(), output_active));
+       shared_ptr<Toc> 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: ")},
@@ -485,23 +558,13 @@ InsetRef::type_info const InsetRef::types[] = {
 };
 
 
-int InsetRef::getType(string const & name)
-{
-       for (int i = 0; !types[i].latex_name.empty(); ++i)
-               if (name == types[i].latex_name)
-                       return i;
-       return 0;
-}
-
-
-string const & InsetRef::getName(int type)
-{
-       return types[type].latex_name;
-}
-
-
 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_;
 }