X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetText.cpp;h=0e8f3ad5715f8bc42f3d32a99f235e91740b4e46;hb=2c357c1d23b7b83839a9beb8225d4f1ae4f793b4;hp=04841ff780c763e1fd3a28aeb0dd02eb8e11c256;hpb=2bf1c09376de37a3d66b79ca5f4304f29d5b4d06;p=lyx.git diff --git a/src/insets/InsetText.cpp b/src/insets/InsetText.cpp index 04841ff780..0e8f3ad571 100644 --- a/src/insets/InsetText.cpp +++ b/src/insets/InsetText.cpp @@ -65,15 +65,46 @@ namespace lyx { using graphics::PreviewLoader; +class TextCompletionList : public Inset::CompletionList { +public: + /// + TextCompletionList(Cursor const & cur) + : buf_(cur.buffer()), it_(buf_.registeredWords().begin()), pos_(0) {} + /// + virtual ~TextCompletionList() {} + + /// + virtual size_t size() const { + return buf_.registeredWords().size(); + } + /// + virtual docstring data(size_t idx) const { + std::set::const_iterator it + = buf_.registeredWords().begin(); + for (size_t i = 0; i < idx; ++i) + it++; + return *it; + } + +private: + Buffer const & buf_; + std::set::const_iterator const it_; + size_t pos_; +}; + + +///////////////////////////////////////////////////////////////////// + InsetText::InsetText(BufferParams const & bp) : drawFrame_(false), frame_color_(Color_insetframe) { paragraphs().push_back(Paragraph()); + Paragraph & ourpar = paragraphs().back(); if (useEmptyLayout()) - paragraphs().back().layout(bp.getTextClass().emptyLayout()); + ourpar.layout(bp.getTextClass().emptyLayout()); else - paragraphs().back().layout(bp.getTextClass().defaultLayout()); - init(); + ourpar.layout(bp.getTextClass().defaultLayout()); + ourpar.setInsetOwner(this); } @@ -84,7 +115,7 @@ InsetText::InsetText(InsetText const & in) drawFrame_ = in.drawFrame_; frame_color_ = in.frame_color_; text_.paragraphs() = in.text_.paragraphs(); - init(); + setParagraphOwner(); } @@ -92,7 +123,7 @@ InsetText::InsetText() {} -void InsetText::init() +void InsetText::setParagraphOwner() { for_each(paragraphs().begin(), paragraphs().end(), bind(&Paragraph::setInsetOwner, _1, this)); @@ -145,8 +176,7 @@ void InsetText::read(Buffer const & buf, Lexer & lex) Paragraph oldpar = *paragraphs().begin(); paragraphs().clear(); ErrorList errorList; - bool res = text_.read(buf, lex, errorList); - init(); + bool res = text_.read(buf, lex, errorList, this); if (!res) { lex.printError("Missing \\end_inset at this point. " @@ -444,4 +474,100 @@ void InsetText::updateLabels(Buffer const & buf, ParIterator const & it) } +bool InsetText::completionSupported(Cursor const & cur) const +{ + Cursor const & bvCur = cur.bv().cursor(); + if (&bvCur.inset() != this) + return false; + Paragraph const & par = cur.paragraph(); + return cur.pos() > 0 + && (cur.pos() >= par.size() || !par.isLetter(cur.pos())) + && par.isLetter(cur.pos() - 1); +} + + +bool InsetText::inlineCompletionSupported(Cursor const & cur) const +{ + return completionSupported(cur); +} + + +bool InsetText::automaticInlineCompletion() const +{ + return lyxrc.completion_inline_text; +} + + +bool InsetText::automaticPopupCompletion() const +{ + return lyxrc.completion_popup_text; +} + + +Inset::CompletionList const * InsetText::completionList(Cursor const & cur) const +{ + if (!completionSupported(cur)) + return 0; + + return new TextCompletionList(cur); +} + + +docstring InsetText::previousWord(Buffer const & buffer, CursorSlice const & sl) const +{ + CursorSlice from = sl; + CursorSlice to = sl; + text_.getWord(from, to, PREVIOUS_WORD); + if (sl == from || to == from) + return docstring(); + + Paragraph const & par = sl.paragraph(); + return par.asString(buffer, from.pos(), to.pos(), false); +} + + +docstring InsetText::completionPrefix(Cursor const & cur) const +{ + if (!completionSupported(cur)) + return docstring(); + + return previousWord(cur.buffer(), cur.top()); +} + + +bool InsetText::insertCompletion(Cursor & cur, docstring const & s, + bool finished) +{ + if (!completionSupported(cur)) + return false; + + BOOST_ASSERT(cur.bv().cursor() == cur); + cur.insert(s); + cur.bv().cursor() = cur; + return true; +} + + +void InsetText::completionPosAndDim(Cursor const & cur, int & x, int & y, + Dimension & dim) const +{ + // get word in front of cursor + docstring word = previousWord(cur.buffer(), cur.top()); + DocIterator wordStart = cur; + wordStart.pos() -= word.length(); + + // get position on screen of the word start + Point lxy = cur.bv().getPos(wordStart, false); + x = lxy.x_; + y = lxy.y_; + + // Calculate dimensions of the word + TextMetrics const & tm = cur.bv().textMetrics(&text_); + dim = tm.rowHeight(cur.pit(), wordStart.pos(), cur.pos(), false); + Point rxy = cur.bv().getPos(cur, cur.boundary()); + dim.wid = abs(rxy.x_ - x); + x = (rxy.x_ < x) ? x - dim.wid : x; // for RTL +} + + } // namespace lyx