#include <config.h>
#include "InsetText.h"
-#include "InsetNewline.h"
-#include "Buffer.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 "frontends/alert.h"
#include "frontends/Painter.h"
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)
void InsetText::clear()
{
ParagraphList & pars = paragraphs();
+ BOOST_ASSERT(!pars.empty());
// This is a gross hack...
- Layout old_layout = pars.begin()->layout();
+ Layout const & old_layout = pars.begin()->layout();
pars.clear();
pars.push_back(Paragraph());
}
-// 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();
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);
}
}
-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;
}
{
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");
}