#include <config.h>
#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 "support/debug.h"
+#include "CutAndPaste.h"
#include "DispatchResult.h"
#include "ErrorList.h"
#include "FuncRequest.h"
-#include "support/gettext.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 "TocBackend.h"
#include "frontends/alert.h"
#include "frontends/Painter.h"
+#include "support/debug.h"
+#include "support/gettext.h"
#include "support/lstrings.h"
#include <boost/bind.hpp>
-#include <boost/assert.hpp>
+#include "support/lassert.h"
using namespace std;
using namespace lyx::support;
using graphics::PreviewLoader;
-InsetText::InsetText(BufferParams const & bp)
+/////////////////////////////////////////////////////////////////////
+
+InsetText::InsetText(Buffer const & buf)
: drawFrame_(false), frame_color_(Color_insetframe)
{
- paragraphs().push_back(Paragraph());
- paragraphs().back().layout(bp.getTextClass().defaultLayout());
- init();
+ initParagraphs(buf.params());
+ setBuffer(const_cast<Buffer &>(buf));
}
drawFrame_ = in.drawFrame_;
frame_color_ = in.frame_color_;
text_.paragraphs() = in.text_.paragraphs();
- init();
+ setParagraphOwner();
}
-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::init()
+void InsetText::initParagraphs(BufferParams const & bparams)
+{
+ LASSERT(paragraphs().empty(), /**/);
+ paragraphs().push_back(Paragraph());
+ Paragraph & ourpar = paragraphs().back();
+ ourpar.setPlainOrDefaultLayout(bparams.documentClass());
+ ourpar.setInsetOwner(this);
+}
+
+
+void InsetText::setParagraphOwner()
{
for_each(paragraphs().begin(), paragraphs().end(),
bind(&Paragraph::setInsetOwner, _1, this));
void InsetText::clear()
{
ParagraphList & pars = paragraphs();
+ LASSERT(!pars.empty(), /**/);
// This is a gross hack...
- LayoutPtr old_layout = pars.begin()->layout();
+ Layout const & old_layout = pars.begin()->layout();
pars.clear();
pars.push_back(Paragraph());
pars.begin()->setInsetOwner(this);
- pars.begin()->layout(old_layout);
-}
-
-
-Inset * InsetText::clone() const
-{
- return new InsetText(*this);
+ pars.begin()->setLayout(old_layout);
}
}
-void InsetText::write(Buffer const & buf, ostream & os) const
+void InsetText::write(ostream & os) const
{
os << "Text\n";
- text_.write(buf, os);
+ text_.write(buffer(), os);
}
-void InsetText::read(Buffer const & buf, Lexer & lex)
+void InsetText::read(Lexer & lex)
{
clear();
Paragraph oldpar = *paragraphs().begin();
paragraphs().clear();
ErrorList errorList;
- bool res = text_.read(buf, lex, errorList);
- init();
+ 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.
TextMetrics & tm = pi.base.bv->textMetrics(&text_);
if (drawFrame_ || pi.full_repaint) {
- int const w = tm.width() + 2 * TEXT_TO_INSET_OFFSET;
+ int const w = tm.width() + TEXT_TO_INSET_OFFSET;
int const yframe = y - TEXT_TO_INSET_OFFSET - tm.ascent();
int const h = tm.height() + 2 * TEXT_TO_INSET_OFFSET;
+ int const xframe = x + TEXT_TO_INSET_OFFSET / 2;
if (pi.full_repaint)
- pi.pain.fillRectangle(x, yframe, w, h, backgroundColor());
+ pi.pain.fillRectangle(xframe, yframe, w, h, backgroundColor());
if (drawFrame_)
- pi.pain.rectangle(x, yframe, w, h, frameColor());
+ pi.pain.rectangle(xframe, yframe, w, h, frameColor());
}
tm.draw(pi, x + TEXT_TO_INSET_OFFSET, y);
}
-docstring const InsetText::editMessage() const
+docstring InsetText::editMessage() const
{
return _("Opened Text Inset");
}
}
-int InsetText::latex(Buffer const & buf, odocstream & os,
- OutputParams const & runparams) const
+int InsetText::latex(odocstream & os, OutputParams const & runparams) const
{
TexRow texrow;
- latexParagraphs(buf, text_, os, texrow, runparams);
+ latexParagraphs(buffer(), text_, os, texrow, runparams);
return texrow.rows();
}
-int InsetText::plaintext(Buffer const & buf, odocstream & os,
- OutputParams const & runparams) const
+int InsetText::plaintext(odocstream & os, OutputParams const & runparams) const
{
ParagraphList::const_iterator beg = paragraphs().begin();
ParagraphList::const_iterator end = paragraphs().end();
os << '\n';
}
odocstringstream oss;
- writePlaintextParagraph(buf, *it, oss, runparams, ref_printed);
+ writePlaintextParagraph(buffer(), *it, oss, runparams, ref_printed);
docstring const str = oss.str();
os << str;
// FIXME: len is not computed fully correctly; in principle,
}
-int InsetText::docbook(Buffer const & buf, odocstream & os,
- OutputParams const & runparams) const
+int InsetText::docbook(odocstream & os, OutputParams const & runparams) const
{
- docbookParagraphs(paragraphs(), buf, os, runparams);
+ docbookParagraphs(paragraphs(), buffer(), os, runparams);
return 0;
}
}
-void InsetText::appendParagraphs(Buffer * buffer, ParagraphList & plist)
+void InsetText::appendParagraphs(ParagraphList & plist)
{
// There is little we can do here to keep track of changes.
// As of 2006/10/20, appendParagraphs is used exclusively by
ParagraphList::iterator pit = plist.begin();
ParagraphList::iterator ins = pl.insert(pl.end(), *pit);
++pit;
- mergeParagraph(buffer->params(), pl,
+ mergeParagraph(buffer().params(), pl,
distance(pl.begin(), ins) - 1);
for_each(pit, plist.end(),
}
-//FIXME: instead of this hack, which only works by chance,
-// cells should have their own insetcell type, which returns CELL_CODE!
-bool InsetText::neverIndent(Buffer const & buffer) const
-{
- // this is only true for tabular cells
- return !text_.isMainText(buffer) && lyxCode() == TEXT_CODE;
-}
-
-
ParagraphList const & InsetText::paragraphs() const
{
return text_.paragraphs();
}
-void InsetText::updateLabels(Buffer const & buf, ParIterator const & it)
+void InsetText::updateLabels(ParIterator const & it)
{
ParIterator it2 = it;
it2.forwardPos();
- BOOST_ASSERT(&it2.inset() == this && it2.pit() == 0);
- lyx::updateLabels(buf, 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<InsetOptArg&>(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));
+ }
+ }
+}
+
+
+bool InsetText::notifyCursorLeaves(Cursor const & old, Cursor & cur)
+{
+ if (cur.buffer().isClean())
+ return Inset::notifyCursorLeaves(old, cur);
+
+ // find text inset in old cursor
+ Cursor insetCur = old;
+ int scriptSlice = insetCur.find(this);
+ LASSERT(scriptSlice != -1, /**/);
+ insetCur.cutOff(scriptSlice);
+ LASSERT(&insetCur.inset() == this, /**/);
+
+ // update the old paragraph's words
+ insetCur.paragraph().updateWords(insetCur.top());
+
+ return Inset::notifyCursorLeaves(old, cur);
+}
+
+
+bool InsetText::completionSupported(Cursor const & cur) const
+{
+ Cursor const & bvCur = cur.bv().cursor();
+ if (&bvCur.inset() != this)
+ return false;
+ return text_.completionSupported(cur);
+}
+
+
+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;
+}
+
+
+bool InsetText::showCompletionCursor() const
+{
+ return lyxrc.completion_cursor_text;
+}
+
+
+CompletionList const * InsetText::createCompletionList(Cursor const & cur) const
+{
+ return completionSupported(cur) ? text_.createCompletionList(cur) : 0;
+}
+
+
+docstring InsetText::completionPrefix(Cursor const & cur) const
+{
+ if (!completionSupported(cur))
+ return docstring();
+ return text_.completionPrefix(cur);
+}
+
+
+bool InsetText::insertCompletion(Cursor & cur, docstring const & s,
+ bool finished)
+{
+ if (!completionSupported(cur))
+ return false;
+
+ return text_.insertCompletion(cur, s, finished);
+}
+
+
+void InsetText::completionPosAndDim(Cursor const & cur, int & x, int & y,
+ Dimension & dim) const
+{
+ TextMetrics const & tm = cur.bv().textMetrics(&text_);
+ tm.completionPosAndDim(cur, x, y, dim);
+}
+
+
+docstring InsetText::contextMenu(BufferView const &, int, int) const
+{
+ return from_ascii("context-edit");
}