X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.cpp;h=0bbf6497964536773073c44e2490c486d3f25476;hb=9716e79624a4d;hp=b36b8ee5b6a694fc226862fead4a719e370946bb;hpb=22e5903bf30a711d7a43793a85000d26c11704c3;p=lyx.git diff --git a/src/BufferView.cpp b/src/BufferView.cpp index b36b8ee5b6..0bbf649796 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -38,6 +38,7 @@ #include "MetricsInfo.h" #include "Paragraph.h" #include "Session.h" +#include "texstream.h" #include "Text.h" #include "TextMetrics.h" #include "TexRow.h" @@ -47,6 +48,7 @@ #include "insets/InsetCitation.h" #include "insets/InsetCommand.h" // ChangeRefs #include "insets/InsetGraphics.h" +#include "insets/InsetIndex.h" #include "insets/InsetRef.h" #include "insets/InsetText.h" @@ -1760,6 +1762,78 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) break; } + case LFUN_INDEX_TAG_ALL: { + Inset * ins = cur.nextInset(); + if (!ins || ins->lyxCode() != INDEX_CODE) + // not at index inset + break; + + // clone the index inset + InsetIndex * cins = + new InsetIndex(static_cast(*cur.nextInset())); + // In order to avoid duplication, we compare the + // LaTeX output if we find another index inset after + // the word + odocstringstream oilatex; + otexstream oits(oilatex); + OutputParams rp(&cur.buffer()->params().encoding()); + ins->latex(oits, rp); + cap::copyInsetToTemp(cur, cins); + + // move backwards into preceding word + // skip over other index insets + cur.backwardPosIgnoreCollapsed(); + while (true) { + if (cur.inset().lyxCode() == INDEX_CODE) + cur.pop_back(); + else if (cur.prevInset() && cur.prevInset()->lyxCode() == INDEX_CODE) + cur.backwardPosIgnoreCollapsed(); + else + break; + } + if (!cur.inTexted()) { + // Nothing to do here. + setCursorFromInset(ins); + break; + } + // Get word or selection + cur.text()->selectWord(cur, WHOLE_WORD); + docstring const searched_string = cur.selectionAsString(false); + // Start from the beginning + lyx::dispatch(FuncRequest(LFUN_BUFFER_BEGIN)); + while (findOne(this, searched_string, + false,// case sensitive + true,// match whole word only + true,// forward + false,//find deleted + false,//check wrap + false,// auto-wrap + false,// instant + false// only selection + )) { + cur.clearSelection(); + Inset * ains = cur.nextInset(); + if (ains && ains->lyxCode() == INDEX_CODE) { + // We have an index inset. + // Check whether it has the same + // LaTeX content and move on if so. + odocstringstream filatex; + otexstream fits(filatex); + ains->latex(fits, rp); + if (oilatex.str() == filatex.str()) + continue; + } + // Paste the inset and possibly continue + cap::pasteFromTemp(cursor(), cursor().buffer()->errorList("Paste")); + } + // Go back to start position. + setCursorFromInset(ins); + dr.screenUpdate(cur.result().screenUpdate()); + if (cur.result().needBufferUpdate()) + dr.forceBufferUpdate(); + break; + } + case LFUN_MARK_OFF: cur.clearSelection(); dr.setMessage(from_utf8(N_("Mark off")));