X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetText.cpp;h=71bc8ae80e72290076f0f859c8ad2e8eca9bc38c;hb=e182d5b98db05143388c6a60671866181cc644c8;hp=172255bc699d10d2eee4d95573d1d31c37b1874c;hpb=c7a0329a871a487ac59ea06bb004e1dbfa077226;p=lyx.git diff --git a/src/insets/InsetText.cpp b/src/insets/InsetText.cpp index 172255bc69..71bc8ae80e 100644 --- a/src/insets/InsetText.cpp +++ b/src/insets/InsetText.cpp @@ -11,39 +11,41 @@ #include #include "InsetText.h" -#include "InsetNewline.h" -#include "Buffer.h" +#include "insets/InsetOptArg.h" + #include "buffer_funcs.h" +#include "Buffer.h" #include "BufferParams.h" #include "BufferView.h" +#include "CompletionList.h" #include "CoordCache.h" -#include "CutAndPaste.h" #include "Cursor.h" +#include "CutAndPaste.h" #include "DispatchResult.h" #include "ErrorList.h" #include "FuncRequest.h" #include "InsetList.h" #include "Intl.h" -#include "lyxfind.h" #include "Lexer.h" +#include "lyxfind.h" #include "LyXRC.h" -#include "Text.h" #include "MetricsInfo.h" -#include "OutputParams.h" #include "output_docbook.h" #include "output_latex.h" +#include "OutputParams.h" #include "output_plaintext.h" -#include "Paragraph.h" #include "paragraph_funcs.h" +#include "Paragraph.h" #include "ParagraphParameters.h" #include "ParIterator.h" #include "Row.h" #include "sgml.h" +#include "TexRow.h" #include "TextClass.h" +#include "Text.h" #include "TextMetrics.h" -#include "TexRow.h" -#include "WordList.h" +#include "TocBackend.h" #include "frontends/alert.h" #include "frontends/Painter.h" @@ -53,7 +55,7 @@ #include "support/lstrings.h" #include -#include +#include "support/lassert.h" using namespace std; using namespace lyx::support; @@ -66,36 +68,6 @@ namespace lyx { using graphics::PreviewLoader; -class TextCompletionList : public Inset::CompletionList -{ -public: - /// - TextCompletionList(Cursor const & cur) - : buf_(cur.buffer()), pos_(0) {} - /// - virtual ~TextCompletionList() {} - - /// - virtual bool sorted() const { return true; } - /// - virtual size_t size() const - { - return theWordList().size(); - } - /// - virtual docstring const & data(size_t idx) const - { - return theWordList().word(idx); - } - -private: - /// - Buffer const & buf_; - /// - size_t pos_; -}; - - ///////////////////////////////////////////////////////////////////// InsetText::InsetText(Buffer const & buf) @@ -120,13 +92,22 @@ InsetText::InsetText() {} +void InsetText::setBuffer(Buffer & buf) +{ + ParagraphList::iterator end = paragraphs().end(); + for (ParagraphList::iterator it = paragraphs().begin(); it != end; ++it) + it->setBuffer(buf); + Inset::setBuffer(buf); +} + + void InsetText::initParagraphs(Buffer const & buf) { - BOOST_ASSERT(paragraphs().empty()); + LASSERT(paragraphs().empty(), /**/); buffer_ = const_cast(&buf); paragraphs().push_back(Paragraph()); Paragraph & ourpar = paragraphs().back(); - ourpar.setEmptyOrDefaultLayout(buf.params().documentClass()); + ourpar.setPlainOrDefaultLayout(buf.params().documentClass()); ourpar.setInsetOwner(this); } @@ -140,7 +121,7 @@ void InsetText::setParagraphOwner() void InsetText::clear() { ParagraphList & pars = paragraphs(); - BOOST_ASSERT(!pars.empty()); + LASSERT(!pars.empty(), /**/); // This is a gross hack... Layout const & old_layout = pars.begin()->layout(); @@ -178,12 +159,11 @@ void InsetText::read(Lexer & lex) Paragraph oldpar = *paragraphs().begin(); paragraphs().clear(); ErrorList errorList; + lex.setContext("InsetText::read"); bool res = text_.read(buffer(), lex, errorList, this); - if (!res) { - lex.printError("Missing \\end_inset at this point. " - "Read: `$$Token'"); - } + if (!res) + lex.printError("Missing \\end_inset at this point. "); // sanity check // ensure we have at least one paragraph. @@ -443,15 +423,6 @@ void InsetText::addPreview(PreviewLoader & loader) const } -// FIXME: instead of this hack, which only works by chance, -// cells should have their own insetcell type, which returns CELL_CODE! -bool InsetText::neverIndent() const -{ - // this is only true for tabular cells - return !text_.isMainText(buffer()) && lyxCode() == TEXT_CODE; -} - - ParagraphList const & InsetText::paragraphs() const { return text_.paragraphs(); @@ -468,8 +439,69 @@ void InsetText::updateLabels(ParIterator const & it) { ParIterator it2 = it; it2.forwardPos(); - BOOST_ASSERT(&it2.inset() == this && it2.pit() == 0); - lyx::updateLabels(buffer(), it2); + LASSERT(&it2.inset() == this && it2.pit() == 0, /**/); + if (producesOutput()) + lyx::updateLabels(buffer(), it2); + else { + DocumentClass const & tclass = buffer().params().documentClass(); + Counters const savecnt = tclass.counters(); + lyx::updateLabels(buffer(), it2); + tclass.counters() = savecnt; + } +} + + +void InsetText::addToToc(DocIterator const & cdit) +{ + DocIterator dit = cdit; + dit.push_back(CursorSlice(*this)); + Toc & toc = buffer().tocBackend().toc("tableofcontents"); + + BufferParams const & bufparams = buffer_->params(); + const int min_toclevel = bufparams.documentClass().min_toclevel(); + + // For each paragraph, traverse its insets and let them add + // their toc items + ParagraphList & pars = paragraphs(); + pit_type pend = paragraphs().size(); + for (pit_type pit = 0; pit != pend; ++pit) { + Paragraph const & par = pars[pit]; + dit.pit() = pit; + // the string that goes to the toc (could be the optarg) + docstring tocstring; + InsetList::const_iterator it = par.insetList().begin(); + InsetList::const_iterator end = par.insetList().end(); + for (; it != end; ++it) { + Inset & inset = *it->inset; + dit.pos() = it->pos; + //lyxerr << (void*)&inset << " code: " << inset.lyxCode() << std::endl; + inset.addToToc(dit); + switch (inset.lyxCode()) { + case OPTARG_CODE: { + if (!tocstring.empty()) + break; + dit.pos() = 0; + Paragraph const & insetpar = + *static_cast(inset).paragraphs().begin(); + if (!par.labelString().empty()) + tocstring = par.labelString() + ' '; + tocstring += insetpar.asString(); + break; + } + default: + break; + } + } + /// now the toc entry for the paragraph + int const toclevel = par.layout().toclevel; + if (toclevel != Layout::NOT_IN_TOC && toclevel >= min_toclevel) { + dit.pos() = 0; + // insert this into the table of contents + if (tocstring.empty()) + tocstring = par.asString(AS_STR_LABEL); + toc.push_back(TocItem(dit, toclevel - min_toclevel, tocstring)); + } + } } @@ -481,9 +513,9 @@ bool InsetText::notifyCursorLeaves(Cursor const & old, Cursor & cur) // find text inset in old cursor Cursor insetCur = old; int scriptSlice = insetCur.find(this); - BOOST_ASSERT(scriptSlice != -1); + LASSERT(scriptSlice != -1, /**/); insetCur.cutOff(scriptSlice); - BOOST_ASSERT(&insetCur.inset() == this); + LASSERT(&insetCur.inset() == this, /**/); // update the old paragraph's words insetCur.paragraph().updateWords(insetCur.top()); @@ -497,10 +529,7 @@ 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); + return text_.completionSupported(cur); } @@ -522,26 +551,15 @@ bool InsetText::automaticPopupCompletion() const } -Inset::CompletionList const * InsetText::createCompletionList( - Cursor const & cur) const +bool InsetText::showCompletionCursor() const { - if (!completionSupported(cur)) - return 0; - - return new TextCompletionList(cur); + return lyxrc.completion_cursor_text; } -docstring InsetText::previousWord(CursorSlice const & sl) const +CompletionList const * InsetText::createCompletionList(Cursor const & cur) 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(from.pos(), to.pos(), false); + return completionSupported(cur) ? text_.createCompletionList(cur) : 0; } @@ -549,50 +567,31 @@ docstring InsetText::completionPrefix(Cursor const & cur) const { if (!completionSupported(cur)) return docstring(); - return previousWord(cur.top()); + return text_.completionPrefix(cur); } bool InsetText::insertCompletion(Cursor & cur, docstring const & s, - bool /*finished*/) + bool finished) { if (!completionSupported(cur)) return false; - BOOST_ASSERT(cur.bv().cursor() == cur); - cur.insert(s); - cur.bv().cursor() = cur; - if (!(cur.disp_.update() & Update::Force)) - cur.updateFlags(cur.disp_.update() | Update::SinglePar); - return true; + return text_.insertCompletion(cur, s, finished); } void InsetText::completionPosAndDim(Cursor const & cur, int & x, int & y, Dimension & dim) const { - Cursor const & bvcur = cur.bv().cursor(); - - // get word in front of cursor - docstring word = previousWord(bvcur.top()); - DocIterator wordStart = bvcur; - wordStart.pos() -= word.length(); - - // get position on screen of the word start and end - Point lxy = cur.bv().getPos(wordStart, false); - Point rxy = cur.bv().getPos(bvcur, bvcur.boundary()); - - // calculate dimensions of the word TextMetrics const & tm = cur.bv().textMetrics(&text_); - dim = tm.rowHeight(bvcur.pit(), wordStart.pos(), bvcur.pos(), false); - dim.wid = abs(rxy.x_ - lxy.x_); - - // calculate position of word - y = lxy.y_; - x = min(rxy.x_, lxy.x_); - - //lyxerr << "wid=" << dim.width() << " x=" << x << " y=" << y << " lxy.x_=" << lxy.x_ << " rxy.x_=" << rxy.x_ << " word=" << word << std::endl; - //lyxerr << " wordstart=" << wordStart << " bvcur=" << bvcur << " cur=" << cur << std::endl; + tm.completionPosAndDim(cur, x, y, dim); +} + + +docstring InsetText::contextMenu(BufferView const &, int, int) const +{ + return from_ascii("context-edit"); }