int LyXText::top_y() const
{
- if (isInInset() || anchor_row_ == rowlist_.end() )
+ if (anchor_row_ == rowlist_.end())
return 0;
+
return anchor_row_->y() + anchor_row_offset_;
}
void LyXText::top_y(int newy)
{
- if (rows().empty() || isInInset())
+ if (rows().empty())
+ return;
+
+ if (isInInset()) {
+ anchor_row_ = rows().begin();
+ anchor_row_offset_ = newy;
return;
+ }
+
lyxerr[Debug::GUI] << "setting top y = " << newy << endl;
int y = newy;
}
-int LyXText::workWidth(Inset * inset) const
+int LyXText::workWidth(Inset const * inset) const
{
- Paragraph * par = inset->parOwner();
- lyx::Assert(par);
+ ParagraphList::iterator par = std::find(ownerParagraphs().begin(),
+ ownerParagraphs().end(),
+ *inset->parOwner());
+ //lyx::Assert(par);
pos_type pos = par->getPositionOfInset(inset);
lyx::Assert(pos != -1);
if (row.par()->layout() == tclass.defaultLayout()) {
// find the previous same level paragraph
if (row.par() != ownerParagraphs().begin()) {
- Paragraph * newpar =
- depthHook(&*row.par(), row.par()->getDepth());
- if (newpar &&
- newpar->layout()->nextnoindent)
+ ParagraphList::iterator newpit =
+ depthHook(row.par(), ownerParagraphs(),
+ row.par()->getDepth());
+ if (newpit == row.par() &&
+ newpit->layout()->nextnoindent)
parindent.erase();
}
}
} else {
// find the next level paragraph
- Paragraph * newpar = outerHook(&*row.par());
+ ParagraphList::iterator newpar = outerHook(row.par(),
+ ownerParagraphs());
// make a corresponding row. Needed to call leftMargin()
// check wether it is a sufficent paragraph
- if (newpar && newpar->layout()->isEnvironment()) {
+ if (newpar != ownerParagraphs().end() &&
+ newpar->layout()->isEnvironment()) {
Row dummyrow;
dummyrow.par(newpar);
dummyrow.pos(newpar->size());
x = leftMargin(dummyrow);
}
- if (newpar && row.par()->layout() == tclass.defaultLayout()) {
+ if (newpar != ownerParagraphs().end() &&
+ row.par()->layout() == tclass.defaultLayout()) {
if (newpar->params().noindent())
parindent.erase();
else {
// theorems (JMarc)
|| (layout->labeltype == LABEL_STATIC
&& layout->latextype == LATEX_ENVIRONMENT
- && !isFirstInSequence(&*row.par()))) {
+ && !isFirstInSequence(row.par(), ownerParagraphs()))) {
x += font_metrics::signedWidth(layout->leftmargin,
labelfont);
} else if (layout->labeltype != LABEL_TOP_ENVIRONMENT
|| layout->labeltype == LABEL_CENTERED_TOP_ENVIRONMENT
|| (layout->labeltype == LABEL_STATIC
&& layout->latextype == LATEX_ENVIRONMENT
- && !isFirstInSequence(&*row.par())))
+ && !isFirstInSequence(row.par(), ownerParagraphs())))
&& align == LYX_ALIGN_BLOCK
&& !row.par()->params().noindent()
// in tabulars and ert paragraphs are never indented!
};
-pos_type
-LyXText::rowBreakPoint(Row const & row) const
+pos_type LyXText::rowBreakPoint(Row const & row) const
{
ParagraphList::iterator pit = row.par();
// or the end of the par, then choose the possible break
// nearest that.
- int const left = leftMargin(const_cast<Row&>(row));
+ int const left = leftMargin(row);
int x = left;
// pixel width since last breakpoint
if ((layout->labeltype == LABEL_TOP_ENVIRONMENT
|| layout->labeltype == LABEL_BIBLIO
|| layout->labeltype == LABEL_CENTERED_TOP_ENVIRONMENT)
- && isFirstInSequence(&*pit)
+ && isFirstInSequence(pit, ownerParagraphs())
&& !pit->getLabelstring().empty())
{
float spacing_val = 1.0;
+ layout->labelbottomsep * defaultRowHeight());
}
- // and now the layout spaces, for example before and after a section,
- // or between the items of a itemize or enumerate environment
+ // And now the layout spaces, for example before and after
+ // a section, or between the items of a itemize or enumerate
+ // environment.
if (!pit->params().pagebreakTop()) {
- Paragraph * prev = pit->previous();
- if (prev)
- prev = depthHook(&*pit, pit->getDepth());
- if (prev && prev->layout() == layout &&
+ ParagraphList::iterator prev =
+ depthHook(pit, ownerParagraphs(),
+ pit->getDepth());
+ if (prev != pit && prev->layout() == layout &&
prev->getDepth() == pit->getDepth() &&
prev->getLabelWidthString() == pit->getLabelWidthString())
{
layoutasc = (tmptop * defaultRowHeight());
}
- prev = outerHook(&*pit);
- if (prev) {
+ prev = outerHook(pit, ownerParagraphs());
+ if (prev != ownerParagraphs().end()) {
maxasc += int(prev->layout()->parsep * defaultRowHeight());
} else if (pit != ownerParagraphs().begin()) {
ParagraphList::iterator prior_pit = boost::prior(pit);
if (comparepit->getDepth() > nextpit->getDepth()) {
usual = (comparepit->layout()->bottomsep * defaultRowHeight());
- comparepit = depthHook(&*comparepit, nextpit->getDepth());
+ comparepit = depthHook(comparepit, ownerParagraphs(), nextpit->getDepth());
if (comparepit->layout()!= nextpit->layout()
|| nextpit->getLabelWidthString() !=
comparepit->getLabelWidthString())
LyXLayout_ptr const & layout = cursor.par()->layout();
// this is only allowed, if the current paragraph is not empty or caption
- // and if it has not the keepempty flag aktive
- if (cursor.par()->empty()
- && layout->labeltype != LABEL_SENSITIVE
- && !layout->keepempty)
+ // and if it has not the keepempty flag active
+ if (cursor.par()->empty() && !cursor.par()->allowEmpty()
+ && layout->labeltype != LABEL_SENSITIVE)
return;
- setUndo(bv(), Undo::FINISH, &*cursor.par(), &*boost::next(cursor.par()));
+ setUndo(bv(), Undo::FINISH, cursor.par());
// Always break behind a space
//
// breakParagraph call should return a bool if it inserts the
// paragraph before or behind and we should react on that one
// but we can fix this in 1.3.0 (Jug 20020509)
- bool const isempty = (layout->keepempty && cursor.par()->empty());
+ bool const isempty = (cursor.par()->allowEmpty() && cursor.par()->empty());
::breakParagraph(bv()->buffer()->params, paragraphs, cursor.par(), cursor.pos(),
keep_layout);
// same Paragraph one to the right and make a rebreak
void LyXText::insertChar(char c)
{
- setUndo(bv(), Undo::INSERT, &*cursor.par(), &*boost::next(cursor.par()));
+ setUndo(bv(), Undo::INSERT, cursor.par());
// When the free-spacing option is set for the current layout,
// disable the double-space checking
false, cursor.boundary());
// cursor MUST be in row now.
- if (boost::next(row) != rows().end() &&
- boost::next(row)->par() == row->par())
- need_break_row = boost::next(row);
+ RowList::iterator next_row = boost::next(row);
+ if (next_row != rows().end() &&
+ next_row->par() == row->par())
+ need_break_row = next_row;
else
need_break_row = rows().end();
if (c == Paragraph::META_INSET || row->fill() < 0) {
postPaint(y);
breakAgainOneRow(row);
+
+ RowList::iterator next_row = boost::next(row);
+
// will the cursor be in another row now?
if (lastPos(*this, row) <= cursor.pos() + 1 &&
- boost::next(row) != rows().end()) {
- if (boost::next(row) != rows().end() &&
- boost::next(row)->par() == row->par())
+ next_row != rows().end()) {
+ if (next_row != rows().end() &&
+ next_row->par() == row->par()) {
// this should always be true
++row;
+ }
+
breakAgainOneRow(row);
}
current_font = rawtmpfont;
!= cursor.boundary())
setCursor(cursor.par(), cursor.pos(), false,
!cursor.boundary());
- if (boost::next(row) != rows().end() &&
- boost::next(row)->par() == row->par())
- need_break_row = boost::next(row);
+
+ next_row = boost::next(row);
+
+ if (next_row != rows().end() &&
+ next_row->par() == row->par())
+ need_break_row = next_row;
else
need_break_row = rows().end();
} else {
if (!selection.set() && cursor.par()->size())
return;
- bv()->hideCursor();
-
if (selection.start.par() == selection.end.par()) {
LyXCursor & startc = selection.start;
LyXCursor & endc = selection.end;
- setUndo(bv(), Undo::INSERT, &*startc.par(), &*boost::next(startc.par()));
+ setUndo(bv(), Undo::INSERT, startc.par());
startc.par()->acceptChange(startc.pos(), endc.pos());
finishUndo();
clearSelection();
if (!selection.set() && cursor.par()->size())
return;
- bv()->hideCursor();
-
if (selection.start.par() == selection.end.par()) {
LyXCursor & startc = selection.start;
LyXCursor & endc = selection.end;
- setUndo(bv(), Undo::INSERT, &*startc.par(),
- &*boost::next(startc.par()));
+ setUndo(bv(), Undo::INSERT, startc.par());
startc.par()->rejectChange(startc.pos(), endc.pos());
finishUndo();
clearSelection();
if (cursor.pos() < cursor.par()->size() &&
cursor.par()->isInset(cursor.pos())) {
// lock the inset!
- cursor.par()->getInset(cursor.pos())->edit(bv());
+ FuncRequest cmd(bv(), LFUN_INSET_EDIT, "left");
+ cursor.par()->getInset(cursor.pos())->localDispatch(cmd);
// now call us again to do the above trick
// but obviously we have to start from down below ;)
return bv()->text->selectNextWordToSpellcheck(value);
lyx::Assert(from <= to);
- setUndo(bv(), Undo::FINISH, &*from.par(), &*boost::next(to.par()));
+ setUndo(bv(), Undo::FINISH, from.par(), to.par());
pos_type pos = from.pos();
ParagraphList::iterator pit = from.par();
LyXCursor tmpcursor = cursor;
// to make sure undo gets the right cursor position
cursor = old_cursor;
- setUndo(bv(), Undo::DELETE,
- &*cursor.par(), &*boost::next(cursor.par()));
+ setUndo(bv(), Undo::DELETE, cursor.par());
cursor = tmpcursor;
backspace();
}
if (cursor.par() != ownerParagraphs().begin()) {
setUndo(bv(), Undo::DELETE,
- &*boost::prior(cursor.par()),
- &*boost::next(cursor.par()));
+ boost::prior(cursor.par()),
+ cursor.par());
}
ParagraphList::iterator tmppit = cursor.par();
} else {
// this is the code for a normal backspace, not pasting
// any paragraphs
- setUndo(bv(), Undo::DELETE,
- &*cursor.par(), &*boost::next(cursor.par()));
+ setUndo(bv(), Undo::DELETE, cursor.par());
// We used to do cursorLeftIntern() here, but it is
// not a good idea since it triggers the auto-delete
// mechanism. So we do a cursorLeftIntern()-lite,