#include "buffer.h"
#include "buffer_funcs.h"
+#include "bufferlist.h"
#include "bufferparams.h"
#include "BufferView.h"
#include "Bullet.h"
#include "gettext.h"
#include "language.h"
#include "LColor.h"
+#include "lyxfunc.h"
#include "lyxrc.h"
#include "lyxrow.h"
-#include "lyxrow_funcs.h"
#include "paragraph.h"
#include "paragraph_funcs.h"
#include "ParagraphParameters.h"
#include "pariterator.h"
+#include "lyxserver.h"
+#include "lyxsocket.h"
#include "undo.h"
#include "vspace.h"
-#include "frontends/font_metrics.h"
-#include "frontends/LyXView.h"
+#include "frontends/FontMetrics.h"
#include "insets/insetenv.h"
+#include "mathed/InsetMathHull.h"
+
#include "support/textutils.h"
#include <boost/current_function.hpp>
#include <sstream>
-using lyx::docstring;
-using lyx::pit_type;
-using lyx::pos_type;
+
+namespace lyx {
using std::endl;
using std::ostringstream;
<< BOOST_CURRENT_FUNCTION
<< ": examining inset " << inset << endl;
- if (theCoords.getInsets().has(inset))
+ if (bv()->coordCache().getInsets().has(inset))
lyxerr[Debug::DEBUG]
<< BOOST_CURRENT_FUNCTION
- << ": xo: " << inset->xo() << "..."
- << inset->xo() + inset->width()
- << " yo: " << inset->yo() - inset->ascent()
+ << ": xo: " << inset->xo(*bv()) << "..."
+ << inset->xo(*bv()) + inset->width()
+ << " yo: " << inset->yo(*bv()) - inset->ascent()
<< "..."
- << inset->yo() + inset->descent()
+ << inset->yo(*bv()) + inset->descent()
<< endl;
else
lyxerr[Debug::DEBUG]
<< BOOST_CURRENT_FUNCTION
<< ": inset has no cached position" << endl;
#endif
- if (inset->covers(x, y)) {
+ if (inset->covers(*bv(), x, y)) {
lyxerr[Debug::DEBUG]
<< BOOST_CURRENT_FUNCTION
<< ": Hit inset: " << inset << endl;
if (lyxlayout->is_environment) {
// move everything in a new environment inset
lyxerr[Debug::DEBUG] << "setting layout " << layout << endl;
- bv.owner()->dispatch(FuncRequest(LFUN_LINE_BEGIN));
- bv.owner()->dispatch(FuncRequest(LFUN_LINE_END_SELECT));
- bv.owner()->dispatch(FuncRequest(LFUN_CUT));
+ lyx::dispatch(FuncRequest(LFUN_LINE_BEGIN));
+ lyx::dispatch(FuncRequest(LFUN_LINE_END_SELECT));
+ lyx::dispatch(FuncRequest(LFUN_CUT));
InsetBase * inset = new InsetEnvironment(params, layout);
insertInset(cur, inset);
//inset->edit(cur, true);
- //bv.owner()->dispatch(FuncRequest(LFUN_PASTE));
+ //lyx::dispatch(FuncRequest(LFUN_PASTE));
return;
}
}
-namespace {
-
-
-bool changeDepthAllowed(LyXText::DEPTH_CHANGE type,
+static bool changeDepthAllowed(LyXText::DEPTH_CHANGE type,
Paragraph const & par, int max_depth)
{
if (par.layout()->labeltype == LABEL_BIBLIO)
}
-}
-
-
bool LyXText::changeDepthAllowed(LCursor & cur, DEPTH_CHANGE type) const
{
BOOST_ASSERT(this == cur.text());
int max_depth = (beg != 0 ? pars_[beg - 1].getMaxDepthAfter() : 0);
for (pit_type pit = beg; pit != end; ++pit) {
- if (::changeDepthAllowed(type, pars_[pit], max_depth))
+ if (lyx::changeDepthAllowed(type, pars_[pit], max_depth))
return true;
max_depth = pars_[pit].getMaxDepthAfter();
}
for (pit_type pit = beg; pit != end; ++pit) {
Paragraph & par = pars_[pit];
- if (::changeDepthAllowed(type, par, max_depth)) {
+ if (lyx::changeDepthAllowed(type, par, max_depth)) {
int const depth = par.params().depth();
if (type == INC_DEPTH)
par.params().depth(depth + 1);
{
BOOST_ASSERT(this == cur.text());
Row const & row = cur.paragraph().getRow(cur.pos(),cur.boundary());
-
return setCursor(cur, cur.pit(), row.pos());
}
if (font == LyXFont(LyXFont::ALL_IGNORE)) {
// Could only happen with user style
cur.message(_("No font change defined. "
- "Use Character under the Layout menu to define font change."));
+ "Use Character under the Layout menu to define font change."));
return;
}
bool implicitSelection =
font.language() == ignore_language
&& font.number() == LyXFont::IGNORE
- && selectWordWhenUnderCursor(cur, lyx::WHOLE_WORD_STRICT);
+ && selectWordWhenUnderCursor(cur, WHOLE_WORD_STRICT);
// Set font
setFont(cur, font, toggleall);
{
BOOST_ASSERT(this == cur.text());
- string idxstring;
- if (cur.selection()) {
+ docstring idxstring;
+ if (cur.selection())
idxstring = cur.selectionAsString(false);
- } else {
+ else {
// Try implicit word selection. If there is a change
// in the language the implicit word selection is
// disabled.
LCursor tmpcur = cur;
- selectWord(tmpcur, lyx::PREVIOUS_WORD);
+ selectWord(tmpcur, PREVIOUS_WORD);
if (!tmpcur.selection())
cur.message(_("Nothing to index!"));
idxstring = tmpcur.selectionAsString(false);
}
- return idxstring;
+ return to_utf8(idxstring);
}
else
params.align(align);
}
- par.setLabelWidthString(labelwidthstring);
+ // FIXME UNICODE
+ par.setLabelWidthString(from_ascii(labelwidthstring));
params.noindent(noindent);
}
}
{
BOOST_ASSERT(this == cur.text());
BOOST_ASSERT(inset);
- cur.paragraph().insertInset(cur.pos(), inset);
+ cur.paragraph().insertInset(cur.pos(), inset,
+ Change(cur.buffer().params().trackChanges ?
+ Change::INSERTED : Change::UNCHANGED));
}
// needed to insert the selection
-void LyXText::insertStringAsLines(LCursor & cur, string const & str)
+void LyXText::insertStringAsLines(LCursor & cur, docstring const & str)
{
cur.buffer().insertStringAsLines(pars_, cur.pit(), cur.pos(),
current_font, str, autoBreakRows_);
// turn double CR to single CR, others are converted into one
// blank. Then insertStringAsLines is called
-void LyXText::insertStringAsParagraphs(LCursor & cur, string const & str)
+void LyXText::insertStringAsParagraphs(LCursor & cur, docstring const & str)
{
- string linestr = str;
+ docstring linestr = str;
bool newline_inserted = false;
for (string::size_type i = 0, siz = linestr.size(); i < siz; ++i) {
void LyXText::setCursorIntern(LCursor & cur,
pit_type par, pos_type pos, bool setfont, bool boundary)
{
+ BOOST_ASSERT(this == cur.text());
cur.boundary(boundary);
setCursor(cur.top(), par, pos);
cur.setTargetX();
pos_type LyXText::getColumnNearX(pit_type const pit,
Row const & row, int & x, bool & boundary) const
{
- int const xo = theCoords.get(this, pit).x_;
+ int const xo = bv()->coordCache().get(this, pit).x_;
x -= xo;
RowMetrics const r = computeRowMetrics(pit, row);
Paragraph const & par = pars_[pit];
return 0;
}
+ frontend::FontMetrics const & fm
+ = theFontMetrics(getLabelFont(par));
+
while (vc < end && tmpx <= x) {
c = bidi.vis2log(vc);
last_tmpx = tmpx;
if (body_pos > 0 && c == body_pos - 1) {
- string lsep = layout->labelsep;
- docstring dlsep(lsep.begin(), lsep.end());
- tmpx += r.label_hfill +
- font_metrics::width(dlsep, getLabelFont(par));
+ // FIXME UNICODE
+ docstring const lsep = from_utf8(layout->labelsep);
+ tmpx += r.label_hfill + fm.width(lsep);
if (par.isLineSeparator(body_pos - 1))
tmpx -= singleWidth(par, body_pos - 1);
}
- if (hfillExpansion(par, row, c)) {
+ if (par.hfillExpansion(row, c)) {
tmpx += singleWidth(par, c);
if (c >= body_pos)
tmpx += r.hfill;
pit_type LyXText::getPitNearY(int y) const
{
BOOST_ASSERT(!paragraphs().empty());
- BOOST_ASSERT(theCoords.getParPos().find(this) != theCoords.getParPos().end());
- CoordCache::InnerParPosCache const & cc = theCoords.getParPos().find(this)->second;
+ BOOST_ASSERT(bv()->coordCache().getParPos().find(this) != bv()->coordCache().getParPos().end());
+ CoordCache::InnerParPosCache const & cc = bv()->coordCache().getParPos().find(this)->second;
lyxerr[Debug::DEBUG]
<< BOOST_CURRENT_FUNCTION
<< ": y: " << y << " cache size: " << cc.size()
Row const & LyXText::getRowNearY(int y, pit_type pit) const
{
Paragraph const & par = pars_[pit];
- int yy = theCoords.get(this, pit).y_ - par.ascent();
+ int yy = bv()->coordCache().get(this, pit).y_ - par.ascent();
BOOST_ASSERT(!par.rows().empty());
RowList::const_iterator rit = par.rows().begin();
RowList::const_iterator const rlast = boost::prior(par.rows().end());
// sets cursor recursively descending into nested editable insets
InsetBase * LyXText::editXY(LCursor & cur, int x, int y)
{
+ if (lyxerr.debugging(Debug::WORKAREA)) {
+ lyxerr << "LyXText::editXY(cur, " << x << ", " << y << ")" << std::endl;
+ bv()->coordCache().dump();
+ }
pit_type pit = getPitNearY(y);
BOOST_ASSERT(pit != -1);
Row const & row = getRowNearY(y, pit);
// This should be just before or just behind the
// cursor position set above.
- BOOST_ASSERT((pos != 0 && inset == pars_[pit].getInset(pos - 1))
- || inset == pars_[pit].getInset(pos));
+ InsetBase * inset2 = pars_[pit].getInset(pos - 1);
+ InsetBase * inset3 = pars_[pit].getInset(pos);
+
+ BOOST_ASSERT((pos != 0 && inset == inset2)
+ || inset == inset3);
// Make sure the cursor points to the position before
// this inset.
if (inset == pars_[pit].getInset(pos - 1))
row = par.pos2row(cur.pos());
if (!cur.selection()) {
- int const y = bv_funcs::getPos(cur, cur.boundary()).y_;
+ int const y = bv_funcs::getPos(cur.bv(), cur, cur.boundary()).y_;
LCursor old = cur;
- editXY(cur, x, y - par.rows()[row].ascent() - 1);
+ // Go to middle of previous row. 16 found to work OK;
+ // 12 = top/bottom margin of display math
+ int const margin = 3 * InsetMathHull::displayMargin() / 2;
+ editXY(cur, x, y - par.rows()[row].ascent() - margin);
cur.clearSelection();
// This happens when you move out of an inset.
row = par.pos2row(cur.pos());
if (!cur.selection()) {
- int const y = bv_funcs::getPos(cur, cur.boundary()).y_;
+ int const y = bv_funcs::getPos(cur.bv(), cur, cur.boundary()).y_;
LCursor old = cur;
- editXY(cur, x, y + par.rows()[row].descent() + 1);
+ // To middle of next row
+ int const margin = 3 * InsetMathHull::displayMargin() / 2;
+ editXY(cur, x, y + par.rows()[row].descent() + margin);
cur.clearSelection();
// This happens when you move out of an inset.
&& old.pos() < oldpar.size()
&& oldpar.isLineSeparator(old.pos())
&& oldpar.isLineSeparator(old.pos() - 1)
- && oldpar.lookupChange(old.pos() - 1) != Change::DELETED) {
- // We need to set the text to Change::INSERTED to
- // get it erased properly
- oldpar.setChange(old.pos() -1, Change::INSERTED);
- oldpar.erase(old.pos() - 1);
+ && !oldpar.isDeleted(old.pos() - 1)) {
+ oldpar.eraseChar(old.pos() - 1, false); // do not track changes in DEPM
#ifdef WITH_WARNINGS
#warning This will not work anymore when we have multiple views of the same buffer
// In this case, we will have to correct also the cursors held by
int defaultRowHeight()
{
- return int(font_metrics::maxHeight(LyXFont(LyXFont::ALL_SANE)) * 1.2);
+ return int(theFontMetrics(LyXFont(LyXFont::ALL_SANE)).maxHeight() * 1.2);
}
+
+
+} // namespace lyx