#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_funcs.h"
#include "ParagraphParameters.h"
#include "pariterator.h"
+#include "lyxserver.h"
+#include "lyxsocket.h"
#include "undo.h"
#include "vspace.h"
+#include "frontends/Application.h"
#include "frontends/font_metrics.h"
-#include "frontends/LyXView.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;
for (pit_type pit = 0; pit != end; ++pit)
pars_[pit].rows().clear();
- current_font = getFont(pars_[0], 0);
updateLabels(*bv->buffer());
}
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));
+ theApp->lyxFunc().dispatch(FuncRequest(LFUN_LINE_BEGIN));
+ theApp->lyxFunc().dispatch(FuncRequest(LFUN_LINE_END_SELECT));
+ theApp->lyxFunc().dispatch(FuncRequest(LFUN_CUT));
InsetBase * inset = new InsetEnvironment(params, layout);
insertInset(cur, inset);
//inset->edit(cur, true);
- //bv.owner()->dispatch(FuncRequest(LFUN_PASTE));
+ //theApp->lyxFunc().dispatch(FuncRequest(LFUN_PASTE));
return;
}
bool LyXText::changeDepthAllowed(LCursor & cur, DEPTH_CHANGE type) const
{
BOOST_ASSERT(this == cur.text());
+ // this happens when selecting several cells in tabular (bug 2630)
+ if (cur.selBegin().idx() != cur.selEnd().idx())
+ return false;
+
pit_type const beg = cur.selBegin().pit();
pit_type const end = cur.selEnd().pit() + 1;
int max_depth = (beg != 0 ? pars_[beg - 1].getMaxDepthAfter() : 0);
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;
}
{
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.
idxstring = tmpcur.selectionAsString(false);
}
- return idxstring;
+ return lyx::to_utf8(idxstring);
}
// 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();
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(layout->labelsep, getLabelFont(par));
+ font_metrics::width(dlsep, getLabelFont(par));
if (par.isLineSeparator(body_pos - 1))
tmpx -= singleWidth(par, body_pos - 1);
}
if (!cur.selection()) {
int const y = bv_funcs::getPos(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.
if (!cur.selection()) {
int const y = bv_funcs::getPos(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.