#include "insets/insetspecialchar.h"
#include "insets/insettext.h"
-#include "support/LAssert.h"
#include "support/lstrings.h"
#include "support/tostr.h"
#include "support/std_sstream.h"
#include <clocale>
-using namespace lyx::support;
-using namespace bv_funcs;
+using bv_funcs::replaceSelection;
+
+using lyx::pos_type;
+
+using lyx::support::isStrUnsignedInt;
+using lyx::support::strToUnsignedInt;
using std::endl;
using std::find;
-
+using std::string;
using std::istringstream;
using std::vector;
-using lyx::pos_type;
-
extern string current_layout;
extern int bibitemMaxWidth(BufferView *, LyXFont const &);
// check if the given co-ordinates are inside an inset at the
// given cursor, if one exists. If so, the inset is returned,
// and the co-ordinates are made relative. Otherwise, 0 is returned.
- InsetOld * checkInset(BufferView * /*bv*/, LyXText & text,
+ InsetOld * checkInset(LyXText & text,
LyXCursor const & cur, int & x, int & y)
{
lyx::pos_type const pos = cur.pos();
- ParagraphList::iterator par = cur.par();
+ ParagraphList::iterator par = text.getPar(cur);
if (pos >= par->size() || !par->isInset(pos))
return 0;
return 0;
// get inset dimensions
- Assert(par->getInset(pos));
+ BOOST_ASSERT(par->getInset(pos));
LyXFont const & font = text.getFont(par, pos);
return 0;
}
- text.setCursor(par, pos, true);
+ text.setCursor(cur.par(), pos, true);
x -= b.x1;
// The origin of an inset is on the baseline
LyXCursor cur;
setCursorFromCoordinates(cur, x, y_tmp);
- InsetOld * inset = checkInset(bv(), *this, cur, x, y_tmp);
+ InsetOld * inset = checkInset(*this, cur, x, y_tmp);
if (inset) {
y = y_tmp;
return inset;
// move back one
setCursor(cur, cur.par(), cur.pos() - 1, true);
- inset = checkInset(bv(), *this, cur, x, y_tmp);
+ inset = checkInset(*this, cur, x, y_tmp);
if (inset)
y = y_tmp;
return inset;
string const & contents)
{
ParagraphList::iterator end = ownerParagraphs().end();
- ParagraphList::iterator pit = cursor.par();
+ ParagraphList::iterator pit = cursorPar();
pos_type pos = cursor.pos();
InsetOld * inset;
static_cast<InsetCommand *>(pit->getInset(pos))->getContents()
== contents)));
- if (pit != end) {
- setCursor(pit, pos, false);
- return true;
- }
- return false;
+ if (pit == end)
+ return false;
+
+ setCursor(parOffset(pit), pos, false);
+ return true;
}
bv()->beforeChange(this);
string contents;
- if (same_content && cursor.pos() < cursor.par()->size()
- && cursor.par()->isInset(cursor.pos())) {
- InsetOld const * inset = cursor.par()->getInset(cursor.pos());
+ if (same_content && cursor.pos() < cursorPar()->size()
+ && cursorPar()->isInset(cursor.pos())) {
+ InsetOld const * inset = cursorPar()->getInset(cursor.pos());
if (find(codes.begin(), codes.end(), inset->lyxCode())
!= codes.end())
contents = static_cast<InsetCommand const *>(inset)->getContents();
}
if (!gotoNextInset(codes, contents)) {
- if (cursor.pos() || cursor.par() != ownerParagraphs().begin()) {
+ if (cursor.pos() || cursorPar() != ownerParagraphs().begin()) {
LyXCursor tmp = cursor;
- cursor.par(ownerParagraphs().begin());
+ cursor.par(0);
cursor.pos(0);
if (!gotoNextInset(codes, contents)) {
cursor = tmp;
}
LyXCursor cur;
- ParagraphList::iterator pit = cursor.par();
+ ParagraphList::iterator pit = cursorPar();
previousRow(pit, rit);
- setCursor(cur, pit, rit->pos(), false);
+ setCursor(cur, parOffset(pit), rit->pos(), false);
if (cur.y() > bv_owner->top_y())
cursorUp(true);
bv()->updateScrollbar();
}
}
- ParagraphList::iterator pit = cursor.par();
+ ParagraphList::iterator pit = cursorPar();
nextRow(pit, rit);
LyXCursor cur;
- setCursor(cur, pit, rit->pos(), false);
+ setCursor(cur, parOffset(pit), rit->pos(), false);
if (cur.y() < bv_owner->top_y() + bv()->workHeight())
cursorDown(true);
bv()->updateScrollbar();
}
}
-}
+} // anon namespace
+
-InsetOld::RESULT LyXText::dispatch(FuncRequest const & cmd)
+dispatch_result LyXText::dispatch(FuncRequest const & cmd)
{
lyxerr[Debug::ACTION] << "LyXText::dispatch: action[" << cmd.action
<<"] arg[" << cmd.argument << ']' << "xy[" <<
switch (cmd.action) {
case LFUN_APPENDIX: {
- ParagraphList::iterator pit = cursor.par();
+ ParagraphList::iterator pit = cursorPar();
bool start = !pit->params().startOfAppendix();
// ensure that we have only one start_of_appendix in this document
// we can set the refreshing parameters now
updateCounters();
- redoParagraph(cursor.par());
- setCursor(cursor.par(), cursor.pos());
+ redoParagraph(cursorPar());
+ setCursor(cursorPar(), cursor.pos());
bv->update();
break;
}
case LFUN_WORDRIGHT:
if (!selection.mark())
bv->beforeChange(this);
- if (cursor.par()->isRightToLeftPar(bv->buffer()->params()))
+ if (cursorPar()->isRightToLeftPar(bv->buffer()->params()))
cursorLeftOneWord();
else
cursorRightOneWord();
case LFUN_WORDLEFT:
if (!selection.mark())
bv->beforeChange(this);
- if (cursor.par()->isRightToLeftPar(bv->buffer()->params()))
+ if (cursorPar()->isRightToLeftPar(bv->buffer()->params()))
cursorRightOneWord();
else
cursorLeftOneWord();
case LFUN_RIGHTSEL:
if (!selection.set())
selection.cursor = cursor;
- if (cursor.par()->isRightToLeftPar(bv->buffer()->params()))
+ if (cursorPar()->isRightToLeftPar(bv->buffer()->params()))
cursorLeft(bv);
else
cursorRight(bv);
case LFUN_LEFTSEL:
if (!selection.set())
selection.cursor = cursor;
- if (cursor.par()->isRightToLeftPar(bv->buffer()->params()))
+ if (cursorPar()->isRightToLeftPar(bv->buffer()->params()))
cursorRight(bv);
else
cursorLeft(bv);
break;
case LFUN_WORDRIGHTSEL:
- if (cursor.par()->isRightToLeftPar(bv->buffer()->params()))
+ if (cursorPar()->isRightToLeftPar(bv->buffer()->params()))
cursorLeftOneWord();
else
cursorRightOneWord();
break;
case LFUN_WORDLEFTSEL:
- if (cursor.par()->isRightToLeftPar(bv->buffer()->params()))
+ if (cursorPar()->isRightToLeftPar(bv->buffer()->params()))
cursorRightOneWord();
else
cursorLeftOneWord();
case LFUN_WORDSEL: {
LyXCursor cur1 = cursor;
LyXCursor cur2;
- ::getWord(cur1, cur2, lyx::WHOLE_WORD, ownerParagraphs());
+ ::getWord(*this, cur1, cur2, lyx::WHOLE_WORD, ownerParagraphs());
setCursor(cur1.par(), cur1.pos());
bv->beforeChange(this);
setCursor(cur2.par(), cur2.pos());
}
case LFUN_RIGHT: {
- bool is_rtl = cursor.par()->isRightToLeftPar(bv->buffer()->params());
+ bool is_rtl = cursorPar()->isRightToLeftPar(bv->buffer()->params());
if (!selection.mark())
bv->beforeChange(this);
if (is_rtl)
cursorLeft(false);
- if (cursor.pos() < cursor.par()->size()
- && cursor.par()->isInset(cursor.pos())
- && isHighlyEditableInset(cursor.par()->getInset(cursor.pos()))) {
- InsetOld * tmpinset = cursor.par()->getInset(cursor.pos());
+ if (cursor.pos() < cursorPar()->size()
+ && cursorPar()->isInset(cursor.pos())
+ && isHighlyEditableInset(cursorPar()->getInset(cursor.pos()))) {
+ InsetOld * tmpinset = cursorPar()->getInset(cursor.pos());
cmd.message(tmpinset->editMessage());
FuncRequest cmd1(bv, LFUN_INSET_EDIT, is_rtl ? "right" : "left");
tmpinset->localDispatch(cmd1);
case LFUN_LEFT: {
// This is soooo ugly. Isn`t it possible to make
// it simpler? (Lgb)
- bool const is_rtl = cursor.par()->isRightToLeftPar(bv->buffer()->params());
+ bool const is_rtl = cursorPar()->isRightToLeftPar(bv->buffer()->params());
if (!selection.mark())
bv->beforeChange(this);
LyXCursor const cur = cursor;
if (!is_rtl)
cursorLeft(false);
if ((is_rtl || cur != cursor) && // only if really moved!
- cursor.pos() < cursor.par()->size() &&
- cursor.par()->isInset(cursor.pos()) &&
- isHighlyEditableInset(cursor.par()->getInset(cursor.pos()))) {
- InsetOld * tmpinset = cursor.par()->getInset(cursor.pos());
+ cursor.pos() < cursorPar()->size() &&
+ cursorPar()->isInset(cursor.pos()) &&
+ isHighlyEditableInset(cursorPar()->getInset(cursor.pos()))) {
+ InsetOld * tmpinset = cursorPar()->getInset(cursor.pos());
cmd.message(tmpinset->editMessage());
FuncRequest cmd1(bv, LFUN_INSET_EDIT, is_rtl ? "left" : "right");
tmpinset->localDispatch(cmd1);
break;
case LFUN_BREAKLINE: {
- lyx::pos_type body = cursor.par()->beginningOfBody();
+ lyx::pos_type body = cursorPar()->beginningOfBody();
// Not allowed by LaTeX (labels or empty par)
if (cursor.pos() <= body)
replaceSelection(bv->getLyXText());
insertInset(new InsetNewline);
- setCursor(cursor.par(), cursor.pos());
+ setCursor(cursorPar(), cursor.pos());
moveCursorUpdate(bv, false);
break;
}
case LFUN_DELETE_SKIP:
// Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP.
if (!selection.set()) {
- LyXCursor cur = cursor;
- if (cur.pos() == cur.par()->size()) {
+ if (cursor.pos() == cursorPar()->size()) {
cursorRight(bv);
- cur = cursor;
- if (cur.pos() == 0
- && !(cur.par()->params().spaceTop()
- == VSpace (VSpace::NONE))) {
+ ParagraphParameters & params = cursorPar()->params();
+ if (cursor.pos() == 0
+ && !(params.spaceTop() == VSpace (VSpace::NONE))) {
setParagraph(
- cur.par()->params().lineTop(),
- cur.par()->params().lineBottom(),
- cur.par()->params().pagebreakTop(),
- cur.par()->params().pagebreakBottom(),
+ params.lineTop(),
+ params.lineBottom(),
+ params.pagebreakTop(),
+ params.pagebreakBottom(),
VSpace(VSpace::NONE),
- cur.par()->params().spaceBottom(),
- cur.par()->params().spacing(),
- cur.par()->params().align(),
- cur.par()->params().labelWidthString(), 0);
+ params.spaceBottom(),
+ params.spacing(),
+ params.align(),
+ params.labelWidthString(), 0);
cursorLeft(bv);
} else {
cursorLeft(bv);
case LFUN_BACKSPACE_SKIP:
// Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP.
if (!selection.set()) {
- LyXCursor cur = cursor;
- if (cur.pos() == 0
- && !(cur.par()->params().spaceTop() == VSpace(VSpace::NONE))) {
+ ParagraphParameters & params = cursorPar()->params();
+ if (cursor.pos() == 0 && !(params.spaceTop() == VSpace(VSpace::NONE))) {
setParagraph(
- cur.par()->params().lineTop(),
- cur.par()->params().lineBottom(),
- cur.par()->params().pagebreakTop(),
- cur.par()->params().pagebreakBottom(),
+ params.lineTop(),
+ params.lineBottom(),
+ params.pagebreakTop(),
+ params.pagebreakBottom(),
VSpace(VSpace::NONE),
- cur.par()->params().spaceBottom(),
- cur.par()->params().spacing(),
- cur.par()->params().align(),
- cur.par()->params().labelWidthString(), 0);
+ params.spaceBottom(),
+ params.spacing(),
+ params.align(),
+ params.labelWidthString(), 0);
} else {
+ LyXCursor cur = cursor;
backspace();
selection.cursor = cur;
}
LyXCursor cur = cursor;
replaceSelection(bv->getLyXText());
if (cur.pos() == 0) {
- if (cur.par()->params().spaceTop() == VSpace(VSpace::NONE)) {
+ ParagraphParameters & params = getPar(cur)->params();
+ if (params.spaceTop() == VSpace(VSpace::NONE)) {
setParagraph(
- cur.par()->params().lineTop(),
- cur.par()->params().lineBottom(),
- cur.par()->params().pagebreakTop(),
- cur.par()->params().pagebreakBottom(),
- VSpace(VSpace::DEFSKIP), cur.par()->params().spaceBottom(),
- cur.par()->params().spacing(),
- cur.par()->params().align(),
- cur.par()->params().labelWidthString(), 1);
+ params.lineTop(),
+ params.lineBottom(),
+ params.pagebreakTop(),
+ params.pagebreakBottom(),
+ VSpace(VSpace::DEFSKIP), params.spaceBottom(),
+ params.spacing(),
+ params.align(),
+ params.labelWidthString(), 1);
}
}
else {
}
case LFUN_PARAGRAPH_SPACING: {
- ParagraphList::iterator pit = cursor.par();
+ ParagraphList::iterator pit = cursorPar();
Spacing::Space cur_spacing = pit->params().spacing().getSpace();
float cur_value = 1.0;
if (cur_spacing == Spacing::Other)
cur_value = pit->params().spacing().getValue();
- istringstream is(STRCONV(cmd.argument));
+ istringstream is(cmd.argument);
string tmp;
is >> tmp;
Spacing::Space new_spacing = cur_spacing;
}
case LFUN_INSET_SETTINGS:
- Assert(bv->theLockingInset());
+ BOOST_ASSERT(bv->theLockingInset());
bv->theLockingInset()->getLockingInset()->showInsetDialog(bv);
break;
break;
case LFUN_SPACE_INSERT:
- if (cursor.par()->layout()->free_spacing)
+ if (cursorPar()->layout()->free_spacing)
insertChar(' ');
else
doInsertInset(this, cmd, false, false);
break;
case LFUN_TRANSPOSE_CHARS:
- recordUndo(bv, Undo::ATOMIC, cursor.par());
+ recordUndo(bv, Undo::ATOMIC, cursorPar());
redoParagraph();
bv->update();
break;
- case LFUN_PASTE: {
+ case LFUN_PASTE:
cmd.message(_("Paste"));
replaceSelection(bv->getLyXText());
- size_t sel_index = 0;
- string const & arg = cmd.argument;
- if (isStrUnsignedInt(arg)) {
- size_t const paste_arg = strToUnsignedInt(arg);
#warning FIXME Check if the arg is in the domain of available selections.
- sel_index = paste_arg;
- }
- pasteSelection(sel_index);
+ if (isStrUnsignedInt(cmd.argument))
+ pasteSelection(strToUnsignedInt(cmd.argument));
+ else
+ pasteSelection(0);
clearSelection(); // bug 393
bv->update();
bv->switchKeyMap();
+ finishUndo();
break;
- }
case LFUN_CUT:
cutSelection(true, true);
case LFUN_SETXY: {
int x = 0;
int y = 0;
- istringstream is(STRCONV(cmd.argument));
+ istringstream is(cmd.argument);
is >> x >> y;
if (!is)
lyxerr << "SETXY: Could not parse coordinates in '"
break;
case LFUN_GETLAYOUT:
- cmd.message(tostr(cursor.par()->layout()));
+ cmd.message(tostr(cursorPar()->layout()));
break;
case LFUN_LAYOUT: {
if (!change_layout && selection.set() &&
selection.start.par() != selection.end.par())
{
- ParagraphList::iterator spit = selection.start.par();
- ParagraphList::iterator epit = boost::next(selection.end.par());
+ ParagraphList::iterator spit = getPar(selection.start);
+ ParagraphList::iterator epit = boost::next(getPar(selection.end));
while (spit != epit) {
if (spit->layout()->name() != current_layout) {
change_layout = true;
case LFUN_QUOTE: {
replaceSelection(bv->getLyXText());
- ParagraphList::iterator pit = cursor.par();
+ ParagraphList::iterator pit = cursorPar();
lyx::pos_type pos = cursor.pos();
char c;
if (!pos)
if (bv->theLockingInset()) {
InsetOld * tli = bv->theLockingInset();
LyXCursor cursor = bv->text->cursor;
- LyXFont font = bv->text->getFont(cursor.par(), cursor.pos());
+ LyXFont font = bv->text->getFont(cursorPar(), cursor.pos());
int width = tli->width();
int inset_x = font.isVisibleRightToLeft()
? cursor.x() - width : cursor.x();
case LFUN_INSET_CAPTION:
#endif
case LFUN_INSERT_NOTE:
+ case LFUN_INSERT_BOX:
case LFUN_INSERT_BRANCH:
case LFUN_INSERT_BIBITEM:
case LFUN_INSET_ERT:
doInsertInset(this, cmd, false, false);
break;
+ case LFUN_DEPTH_MIN:
+ bv_funcs::changeDepth(bv, this, bv_funcs::DEC_DEPTH, false);
+ clearSelection();
+ bv->update();
+ break;
+
+ case LFUN_DEPTH_PLUS:
+ clearSelection();
+ bv_funcs::changeDepth(bv, this, bv_funcs::INC_DEPTH, false);
+ clearSelection();
+ bv->update();
+ break;
+
default:
return UNDISPATCHED;
}