#include "insets/inseterror.h"
#include "insets/insetbib.h"
#include "insets/insetspecialchar.h"
+#include "insets/insettext.h"
#include "layout.h"
#include "LyXView.h"
#include "support/textutils.h"
using std::endl;
using std::pair;
-LyXText::LyXText(BufferView * bv, int pw, Buffer * p)
+LyXText::LyXText(BufferView * bv)
+{
+ bv_owner = bv;
+ inset_owner = 0;
+ init();
+}
+
+
+LyXText::LyXText(InsetText * inset)
+{
+ inset_owner = inset;
+ bv_owner = 0;
+ init();
+}
+
+
+void LyXText::init()
{
- owner_ = bv;
firstrow = 0;
lastrow = 0;
- paperwidth = pw;
- buffer = p;
number_of_rows = 0;
refresh_y = 0;
- status = LyXText::UNCHANGED;
- LyXParagraph * par = p->paragraph;
- current_font = GetFont(par, 0);
-
height = 0;
-
- while (par) {
- InsertParagraph(par, lastrow);
- par = par->Next();
- }
-
+ width = 0;
+ first = 0;
+ status = LyXText::UNCHANGED;
// set cursor at the very top position
selection = true; /* these setting is necessary
because of the delete-empty-
paragraph mechanism in
SetCursor */
- SetCursor(firstrow->par, 0);
+ if (bv_owner) {
+ LyXParagraph * par = OwnerParagraph();
+ current_font = GetFont(bv_owner->buffer(), par, 0);
+ while (par) {
+ InsertParagraph(bv_owner, par, lastrow);
+ par = par->Next();
+ }
+ SetCursor(bv_owner, firstrow->par(), 0);
+ } else
+ current_font = LyXFont(LyXFont::ALL_SANE);
+
sel_cursor = cursor;
selection = false;
mark_set = false;
Row * tmprow = firstrow;
lyxerr << "Baseline Paragraph Pos Height Ascent Fill\n";
while (tmprow) {
- lyxerr << tmprow->baseline << '\t'
+ lyxerr << tmprow->baseline() << '\t'
<< tmprow->par << '\t'
- << tmprow->pos << '\t'
+ << tmprow->pos() << '\t'
<< tmprow->height << '\t'
<< tmprow->ascent_of_text << '\t'
<< tmprow->fill << '\n';
- tmprow = tmprow->next;
+ tmprow = tmprow->next();
}
lyxerr.flush();
#endif
}
+void LyXText::init(BufferView * bview)
+{
+ if (firstrow)
+ return;
+
+ LyXParagraph * par = OwnerParagraph();
+ current_font = GetFont(bview->buffer(), par, 0);
+ while (par) {
+ InsertParagraph(bview, par, lastrow);
+ par = par->Next();
+ }
+ SetCursorIntern(bview, firstrow->par(), 0);
+#if 0
+ // Dump all rowinformation:
+ Row * tmprow = firstrow;
+ lyxerr << "Width = " << width << endl;
+ lyxerr << "Baseline Paragraph Pos Height Ascent Fill\n";
+ while (tmprow) {
+ lyxerr << tmprow->baseline() << '\t'
+ << tmprow->par() << '\t'
+ << tmprow->pos() << '\t'
+ << tmprow->height() << '\t'
+ << tmprow->ascent_of_text() << '\t'
+ << tmprow->fill() << '\n';
+ tmprow = tmprow->next();
+ }
+ lyxerr.flush();
+#endif
+}
+
LyXText::~LyXText()
{
// Delete all rows, this does not touch the paragraphs!
Row * tmprow = firstrow;
while (firstrow) {
- tmprow = firstrow->next;
+ tmprow = firstrow->next();
delete firstrow;
firstrow = tmprow;
}
}
-void LyXText::owner(BufferView * bv)
-{
- if (owner_ && bv) lyxerr << "LyXText::owner_ already set!" << endl;
- owner_ = bv;
-}
-
// Gets the fully instantiated font at a given position in a paragraph
// Basically the same routine as LyXParagraph::getFont() in paragraph.C.
// The difference is that this one is used for displaying, and thus we
// smaller. (Asger)
// If position is -1, we get the layout font of the paragraph.
// If position is -2, we get the font of the manual label of the paragraph.
-LyXFont LyXText::GetFont(LyXParagraph * par,
+LyXFont LyXText::GetFont(Buffer const * buf, LyXParagraph * par,
LyXParagraph::size_type pos) const
{
LyXLayout const & layout =
- textclasslist.Style(buffer->params.textclass,
- par->GetLayout());
+ textclasslist.Style(buf->params.textclass, par->GetLayout());
char par_depth = par->GetDepth();
// We specialize the 95% common case:
if (pos >= 0){
// 95% goes here
if (layout.labeltype == LABEL_MANUAL
- && pos < BeginningOfMainBody(par)) {
+ && pos < BeginningOfMainBody(buf, par)) {
// 1% goes here
- return par->GetFontSettings(pos).
- realize(layout.reslabelfont);
+ return par->GetFontSettings(buf->params, pos).
+ realize(layout.reslabelfont);
} else
- return par->GetFontSettings(pos).
- realize(layout.resfont);
+ return par->GetFontSettings(buf->params, pos).
+ realize(layout.resfont);
} else {
// 5% goes here.
// process layoutfont for pos == -1 and labelfont for pos < -1
if (pos >= 0){
// 95% goes here
- if (pos < BeginningOfMainBody(par)) {
+ if (pos < BeginningOfMainBody(buf, par)) {
// 1% goes here
layoutfont = layout.labelfont;
} else {
// 99% goes here
layoutfont = layout.font;
}
- tmpfont = par->GetFontSettings(pos);
+ tmpfont = par->GetFontSettings(buf->params, pos);
tmpfont.realize(layoutfont);
} else {
// 5% goes here.
par = par->DepthHook(par_depth - 1);
if (par) {
tmpfont.realize(textclasslist.
- Style(buffer->params.textclass,
+ Style(buf->params.textclass,
par->GetLayout()).font);
par_depth = par->GetDepth();
}
}
- tmpfont.realize(textclasslist.TextClass(buffer->params.textclass).defaultfont());
+ tmpfont.realize(textclasslist.TextClass(buf->params.textclass).defaultfont());
+#ifndef NEW_INSETS
// Cosmetic improvement: If this is an open footnote, make the font
// smaller.
if (par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
&& par->footnotekind == LyXParagraph::FOOTNOTE) {
tmpfont.decSize();
}
-
+#endif
return tmpfont;
}
-void LyXText::SetCharFont(LyXParagraph * par,
+void LyXText::SetCharFont(Buffer const * buf, LyXParagraph * par,
LyXParagraph::size_type pos,
LyXFont const & fnt)
{
}
LyXLayout const & layout =
- textclasslist.Style(buffer->params.textclass,
+ textclasslist.Style(buf->params.textclass,
par->GetLayout());
// Get concrete layout font to reduce against
LyXFont layoutfont;
- if (pos < BeginningOfMainBody(par))
+ if (pos < BeginningOfMainBody(buf, par))
layoutfont = layout.labelfont;
else
layoutfont = layout.font;
tp = tp->DepthHook(tp->GetDepth()-1);
if (tp)
layoutfont.realize(textclasslist.
- Style(buffer->params.textclass,
+ Style(buf->params.textclass,
tp->GetLayout()).font);
}
}
- layoutfont.realize(textclasslist.TextClass(buffer->params.textclass).defaultfont());
+ layoutfont.realize(textclasslist.TextClass(buf->params.textclass).defaultfont());
+#ifndef NEW_INSETS
if (par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
&& par->footnotekind == LyXParagraph::FOOTNOTE) {
layoutfont.decSize();
}
-
+#endif
// Now, reduce font against full layout font
font.reduce(layoutfont);
{
Row * tmprow = new Row;
if (!row) {
- tmprow->previous = 0;
- tmprow->next = firstrow;
+ tmprow->previous(0);
+ tmprow->next(firstrow);
firstrow = tmprow;
} else {
- tmprow->previous = row;
- tmprow->next = row->next;
- row->next = tmprow;
+ tmprow->previous(row);
+ tmprow->next(row->next());
+ row->next(tmprow);
}
- if (tmprow->next)
- tmprow->next->previous = tmprow;
+ if (tmprow->next())
+ tmprow->next()->previous(tmprow);
- if (tmprow->previous)
- tmprow->previous->next = tmprow;
+ if (tmprow->previous())
+ tmprow->previous()->next(tmprow);
- tmprow->par = par;
- tmprow->pos = pos;
+ tmprow->par(par);
+ tmprow->pos(pos);
if (row == lastrow)
lastrow = tmprow;
so the trick is just to set the current row onto the previous
row of this row */
long unused_y;
- GetRow(row->par, row->pos, unused_y);
+ GetRow(row->par(), row->pos(), unused_y);
- if (row->next)
- row->next->previous = row->previous;
- if (!row->previous) {
- firstrow = row->next;
+ if (row->next())
+ row->next()->previous(row->previous());
+ if (!row->previous()) {
+ firstrow = row->next();
} else {
- row->previous->next = row->next;
+ row->previous()->next(row->next());
}
if (row == lastrow)
- lastrow = row->previous;
+ lastrow = row->previous();
- height -= row->height; // the text becomes smaller
+ height -= row->height(); // the text becomes smaller
delete row;
--number_of_rows; // one row less
// remove all following rows of the paragraph of the specified row.
void LyXText::RemoveParagraph(Row * row) const
{
- LyXParagraph * tmppar = row->par;
- row = row->next;
+ LyXParagraph * tmppar = row->par();
+ row = row->next();
Row * tmprow;
- while (row && row->par == tmppar) {
- tmprow = row->next;
+ while (row && row->par() == tmppar) {
+ tmprow = row->next();
RemoveRow(row);
row = tmprow;
}
// insert the specified paragraph behind the specified row
-void LyXText::InsertParagraph(LyXParagraph * par, Row * row) const
+void LyXText::InsertParagraph(BufferView * bview, LyXParagraph * par,
+ Row * row) const
{
InsertRow(row, par, 0); /* insert a new row, starting
* at postition 0 */
- SetCounter(par); // set the counters
+ SetCounter(bview->buffer(), par); // set the counters
// and now append the whole paragraph behind the new row
if (!row) {
- firstrow->height = 0;
- AppendParagraph(firstrow);
+ firstrow->height(0);
+ AppendParagraph(bview, firstrow);
} else {
- row->next->height = 0;
- AppendParagraph(row->next);
+ row->next()->height(0);
+ AppendParagraph(bview, row->next());
}
}
-
-void LyXText::ToggleFootnote()
+
+#ifndef NEW_INSETS
+void LyXText::ToggleFootnote(BufferView * bview)
{
- LyXParagraph * par = cursor.par->ParFromPos(cursor.pos);
+ LyXParagraph * par = cursor.par()->ParFromPos(cursor.pos());
if (par->next
&& par->next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) {
- OpenFootnote();
- owner_->owner()->getMiniBuffer()->Set(_("Opened float"));
+ OpenFootnote(bview);
+ bview->owner()->getMiniBuffer()->Set(_("Opened float"));
} else {
- owner_->owner()->getMiniBuffer()->Set(_("Closed float"));
- CloseFootnote();
+ bview->owner()->getMiniBuffer()->Set(_("Closed float"));
+ CloseFootnote(bview);
}
}
+#endif
-void LyXText::OpenStuff()
+void LyXText::OpenStuff(BufferView * bview)
{
- if (cursor.pos == 0 && cursor.par->bibkey){
- cursor.par->bibkey->Edit(owner_, 0, 0, 0);
+ if (cursor.pos() == 0 && cursor.par()->bibkey){
+ cursor.par()->bibkey->Edit(bview, 0, 0, 0);
}
- else if (cursor.pos < cursor.par->Last()
- && cursor.par->GetChar(cursor.pos) == LyXParagraph::META_INSET
- && cursor.par->GetInset(cursor.pos)->Editable()) {
- owner_->owner()->getMiniBuffer()
- ->Set(cursor.par->GetInset(cursor.pos)->EditMessage());
- if (cursor.par->GetInset(cursor.pos)->Editable() != Inset::HIGHLY_EDITABLE)
- SetCursorParUndo();
- cursor.par->GetInset(cursor.pos)->Edit(owner_, 0, 0, 0);
+ else if (cursor.pos() < cursor.par()->Last()
+ && cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET
+ && cursor.par()->GetInset(cursor.pos())->Editable()) {
+ bview->owner()->getMiniBuffer()
+ ->Set(cursor.par()->GetInset(cursor.pos())->EditMessage());
+ if (cursor.par()->GetInset(cursor.pos())->Editable() != Inset::HIGHLY_EDITABLE)
+ SetCursorParUndo(bview->buffer());
+ cursor.par()->GetInset(cursor.pos())->Edit(bview, 0, 0, 0);
} else {
- ToggleFootnote();
+ ToggleFootnote(bview);
}
}
-void LyXText::CloseFootnote()
+#ifndef NEW_INSETS
+void LyXText::CloseFootnote(BufferView * bview)
{
LyXParagraph * tmppar;
- LyXParagraph * par = cursor.par->ParFromPos(cursor.pos);
+ LyXParagraph * par = cursor.par()->ParFromPos(cursor.pos());
// if the cursor is not in an open footnote, or
// there is no open footnote in this paragraph, just return.
- if (cursor.par->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
+ if (cursor.par()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
if (!par->next ||
par->next->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
- owner_->owner()->getMiniBuffer()
+ bview->owner()->getMiniBuffer()
->Set(_("Nothing to do"));
return;
}
// ok, move the cursor right before the footnote
// just a little faster than using CursorRight()
- for (cursor.pos = 0;
- cursor.par->ParFromPos(cursor.pos) != par;
- cursor.pos++)
- {}
+ for (cursor.pos(0);
+ cursor.par()->ParFromPos(cursor.pos()) != par;) {
+ cursor.pos(cursor.pos() + 1);
+ }
// now the cursor is at the beginning of the physical par
- SetCursor(cursor.par,
- cursor.pos +
- cursor.par->ParFromPos(cursor.pos)->size());
+ SetCursor(bview, cursor.par(),
+ cursor.pos() +
+ cursor.par()->ParFromPos(cursor.pos())->size());
} else {
/* we are in a footnote, so let us move at the beginning */
/* this is just faster than using just CursorLeft() */
- tmppar = cursor.par;
+ tmppar = cursor.par();
while (tmppar->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
// just a little bit faster than movin the cursor
tmppar = tmppar->Previous();
}
- SetCursor(tmppar, tmppar->Last());
+ SetCursor(bview, tmppar, tmppar->Last());
}
// the cursor must be exactly before the footnote
- par = cursor.par->ParFromPos(cursor.pos);
+ par = cursor.par()->ParFromPos(cursor.pos());
status = LyXText::NEED_MORE_REFRESH;
- refresh_row = cursor.row;
- refresh_y = cursor.y - cursor.row->baseline;
+ refresh_row = cursor.row();
+ refresh_y = cursor.y() - cursor.row()->baseline();
- tmppar = cursor.par;
+ tmppar = cursor.par();
LyXParagraph * endpar = par->NextAfterFootnote()->Next();
- Row * row = cursor.row;
+ Row * row = cursor.row();
- tmppar->CloseFootnote(cursor.pos);
+ tmppar->CloseFootnote(cursor.pos());
while (tmppar != endpar) {
- RemoveRow(row->next);
- if (row->next)
- tmppar = row->next->par;
+ RemoveRow(row->next());
+ if (row->next())
+ tmppar = row->next()->par();
else
tmppar = 0;
}
- AppendParagraph(cursor.row);
+ AppendParagraph(bview, cursor.row());
- SetCursor(cursor.par, cursor.pos);
+ SetCursor(bview, cursor.par(), cursor.pos());
sel_cursor = cursor;
// just necessary
- if (cursor.row->next)
- SetHeightOfRow(cursor.row->next);
+ if (cursor.row()->next())
+ SetHeightOfRow(bview, cursor.row()->next());
}
+#endif
/* used in setlayout */
// Asger is not sure we want to do this...
-void LyXText::MakeFontEntriesLayoutSpecific(LyXParagraph * par)
+void LyXText::MakeFontEntriesLayoutSpecific(Buffer const * buf,
+ LyXParagraph * par)
{
LyXLayout const & layout =
- textclasslist.Style(buffer->params.textclass,
- par->GetLayout());
+ textclasslist.Style(buf->params.textclass, par->GetLayout());
LyXFont layoutfont, tmpfont;
for (LyXParagraph::size_type pos = 0;
pos < par->Last(); ++pos) {
- if (pos < BeginningOfMainBody(par))
+ if (pos < BeginningOfMainBody(buf, par))
layoutfont = layout.labelfont;
else
layoutfont = layout.font;
- tmpfont = par->GetFontSettings(pos);
+ tmpfont = par->GetFontSettings(buf->params, pos);
tmpfont.reduce(layoutfont);
par->SetFont(pos, tmpfont);
}
}
-LyXParagraph * LyXText::SetLayout(LyXCursor & cur, LyXCursor & sstart_cur,
+
+LyXParagraph * LyXText::SetLayout(BufferView * bview,
+ LyXCursor & cur, LyXCursor & sstart_cur,
LyXCursor & send_cur,
LyXTextClass::size_type layout)
{
- LyXParagraph * endpar = send_cur.par->LastPhysicalPar()->Next();
+ LyXParagraph * endpar = send_cur.par()->LastPhysicalPar()->Next();
LyXParagraph * undoendpar = endpar;
if (endpar && endpar->GetDepth()) {
endpar = endpar->Next(); // because of parindents etc.
}
- SetUndo(Undo::EDIT,
- sstart_cur.par->ParFromPos(sstart_cur.pos)->previous,
+ SetUndo(bview->buffer(), Undo::EDIT,
+ sstart_cur.par()->ParFromPos(sstart_cur.pos())->previous,
undoendpar);
/* ok we have a selection. This is always between sstart_cur
cur = sstart_cur;
LyXLayout const & lyxlayout =
- textclasslist.Style(buffer->params.textclass, layout);
+ textclasslist.Style(bview->buffer()->params.textclass, layout);
- while (cur.par != send_cur.par) {
- if (cur.par->footnoteflag == sstart_cur.par->footnoteflag) {
- cur.par->SetLayout(layout);
- MakeFontEntriesLayoutSpecific(cur.par);
- LyXParagraph* fppar = cur.par->FirstPhysicalPar();
+ while (cur.par() != send_cur.par()) {
+ if (cur.par()->footnoteflag == sstart_cur.par()->footnoteflag) {
+ cur.par()->SetLayout(bview->buffer()->params, layout);
+ MakeFontEntriesLayoutSpecific(bview->buffer(), cur.par());
+ LyXParagraph * fppar = cur.par()->FirstPhysicalPar();
fppar->added_space_top = lyxlayout.fill_top ?
VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
fppar->added_space_bottom = lyxlayout.fill_bottom ?
VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
if (lyxlayout.margintype == MARGIN_MANUAL)
- cur.par->SetLabelWidthString(lyxlayout.labelstring());
+ cur.par()->SetLabelWidthString(lyxlayout.labelstring());
if (lyxlayout.labeltype != LABEL_BIBLIO
&& fppar->bibkey) {
delete fppar->bibkey;
fppar->bibkey = 0;
}
}
- cur.par = cur.par->Next();
+ cur.par(cur.par()->Next());
}
- if (cur.par->footnoteflag == sstart_cur.par->footnoteflag) {
- cur.par->SetLayout(layout);
- MakeFontEntriesLayoutSpecific(cur.par);
- LyXParagraph* fppar = cur.par->FirstPhysicalPar();
+ if (cur.par()->footnoteflag == sstart_cur.par()->footnoteflag) {
+ cur.par()->SetLayout(bview->buffer()->params, layout);
+ MakeFontEntriesLayoutSpecific(bview->buffer(), cur.par());
+ LyXParagraph * fppar = cur.par()->FirstPhysicalPar();
fppar->added_space_top = lyxlayout.fill_top ?
VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
fppar->added_space_bottom = lyxlayout.fill_bottom ?
VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
if (lyxlayout.margintype == MARGIN_MANUAL)
- cur.par->SetLabelWidthString(lyxlayout.labelstring());
+ cur.par()->SetLabelWidthString(lyxlayout.labelstring());
if (lyxlayout.labeltype != LABEL_BIBLIO
&& fppar->bibkey) {
delete fppar->bibkey;
}
// set layout over selection and make a total rebreak of those paragraphs
-void LyXText::SetLayout(LyXTextClass::size_type layout)
+void LyXText::SetLayout(BufferView * bview, LyXTextClass::size_type layout)
{
LyXCursor
tmpcursor = cursor; /* store the current cursor */
sel_end_cursor = cursor;
}
- LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+ LyXParagraph * endpar = sel_end_cursor.par()->LastPhysicalPar()->Next();
LyXParagraph * undoendpar = endpar;
if (endpar && endpar->GetDepth()) {
}
SetUndo(Undo::EDIT,
- sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous,
+ sel_start_cursor.par()->ParFromPos(sel_start_cursor.pos())->previous,
undoendpar);
/* ok we have a selection. This is always between sel_start_cursor
cursor = sel_start_cursor;
LyXLayout const & lyxlayout =
- textclasslist.Style(buffer->params.textclass, layout);
-
- while (cursor.par != sel_end_cursor.par) {
- if (cursor.par->footnoteflag ==
- sel_start_cursor.par->footnoteflag) {
- cursor.par->SetLayout(layout);
- MakeFontEntriesLayoutSpecific(cursor.par);
- LyXParagraph* fppar = cursor.par->FirstPhysicalPar();
+ textclasslist.Style(bview->buffer()->params.textclass, layout);
+
+ while (cursor.par() != sel_end_cursor.par()) {
+ if (cursor.par()->footnoteflag ==
+ sel_start_cursor.par()->footnoteflag) {
+ cursor.par()->SetLayout(layout);
+ MakeFontEntriesLayoutSpecific(cursor.par());
+ LyXParagraph* fppar = cursor.par()->FirstPhysicalPar();
fppar->added_space_top = lyxlayout.fill_top ?
VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
fppar->added_space_bottom = lyxlayout.fill_bottom ?
VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
if (lyxlayout.margintype == MARGIN_MANUAL)
- cursor.par->SetLabelWidthString(lyxlayout.labelstring());
+ cursor.par()->SetLabelWidthString(lyxlayout.labelstring());
if (lyxlayout.labeltype != LABEL_BIBLIO
&& fppar->bibkey) {
delete fppar->bibkey;
fppar->bibkey = 0;
}
}
- cursor.par = cursor.par->Next();
+ cursor.par() = cursor.par()->Next();
}
- if (cursor.par->footnoteflag ==
- sel_start_cursor.par->footnoteflag) {
- cursor.par->SetLayout(layout);
- MakeFontEntriesLayoutSpecific(cursor.par);
- LyXParagraph* fppar = cursor.par->FirstPhysicalPar();
+ if (cursor.par()->footnoteflag ==
+ sel_start_cursor.par()->footnoteflag) {
+ cursor.par()->SetLayout(layout);
+ MakeFontEntriesLayoutSpecific(cursor.par());
+ LyXParagraph* fppar = cursor.par()->FirstPhysicalPar();
fppar->added_space_top = lyxlayout.fill_top ?
VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
fppar->added_space_bottom = lyxlayout.fill_bottom ?
VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
if (lyxlayout.margintype == MARGIN_MANUAL)
- cursor.par->SetLabelWidthString(lyxlayout.labelstring());
+ cursor.par()->SetLabelWidthString(lyxlayout.labelstring());
if (lyxlayout.labeltype != LABEL_BIBLIO
&& fppar->bibkey) {
delete fppar->bibkey;
sel_end_cursor = cursor;
}
LyXParagraph *
- endpar = SetLayout(cursor, sel_start_cursor, sel_end_cursor, layout);
+ endpar = SetLayout(bview, cursor, sel_start_cursor,
+ sel_end_cursor, layout);
#endif
- RedoParagraphs(sel_start_cursor, endpar);
+ RedoParagraphs(bview, sel_start_cursor, endpar);
// we have to reset the selection, because the
// geometry could have changed */
- SetCursor(sel_start_cursor.par, sel_start_cursor.pos, false);
+ SetCursor(bview, sel_start_cursor.par(),
+ sel_start_cursor.pos(), false);
sel_cursor = cursor;
- SetCursor(sel_end_cursor.par, sel_end_cursor.pos, false);
- UpdateCounters(cursor.row);
+ SetCursor(bview, sel_end_cursor.par(), sel_end_cursor.pos(),
+ false);
+ UpdateCounters(bview, cursor.row());
ClearSelection();
SetSelection();
- SetCursor(tmpcursor.par, tmpcursor.pos, true);
+ SetCursor(bview, tmpcursor.par(), tmpcursor.pos(), true);
}
// increment depth over selection and
// make a total rebreak of those paragraphs
-void LyXText::IncDepth()
+void LyXText::IncDepth(BufferView * bview)
{
// If there is no selection, just use the current paragraph
if (!selection) {
}
// We end at the next paragraph with depth 0
- LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+ LyXParagraph * endpar =
+ sel_end_cursor.par()->LastPhysicalPar()->Next();
LyXParagraph * undoendpar = endpar;
if (endpar && endpar->GetDepth()) {
endpar = endpar->Next(); // because of parindents etc.
}
- SetUndo(Undo::EDIT,
+ SetUndo(bview->buffer(), Undo::EDIT,
sel_start_cursor
- .par->ParFromPos(sel_start_cursor.pos)->previous,
+ .par()->ParFromPos(sel_start_cursor.pos())->previous,
undoendpar);
LyXCursor tmpcursor = cursor; // store the current cursor
while (true) {
// NOTE: you can't change the depth of a bibliography entry
- if (cursor.par->footnoteflag ==
- sel_start_cursor.par->footnoteflag
- && textclasslist.Style(buffer->params.textclass,
- cursor.par->GetLayout()
+ if (cursor.par()->footnoteflag ==
+ sel_start_cursor.par()->footnoteflag
+ && textclasslist.Style(bview->buffer()->params.textclass,
+ cursor.par()->GetLayout()
).labeltype != LABEL_BIBLIO) {
LyXParagraph * prev =
- cursor.par->FirstPhysicalPar()->Previous();
+ cursor.par()->FirstPhysicalPar()->Previous();
if (prev
- && (prev->GetDepth() - cursor.par->GetDepth() > 0
- || (prev->GetDepth() == cursor.par->GetDepth()
- && textclasslist.Style(buffer->params.textclass,
+ && (prev->GetDepth() - cursor.par()->GetDepth() > 0
+ || (prev->GetDepth() == cursor.par()->GetDepth()
+ && textclasslist.Style(bview->buffer()->params.textclass,
prev->GetLayout()).isEnvironment()))) {
- cursor.par->FirstPhysicalPar()->depth++;
+ cursor.par()->FirstPhysicalPar()->depth++;
anything_changed = true;
}
}
- if (cursor.par == sel_end_cursor.par)
+ if (cursor.par() == sel_end_cursor.par())
break;
- cursor.par = cursor.par->Next();
+ cursor.par(cursor.par()->Next());
}
// if nothing changed set all depth to 0
if (!anything_changed) {
cursor = sel_start_cursor;
- while (cursor.par != sel_end_cursor.par) {
- cursor.par->FirstPhysicalPar()->depth = 0;
- cursor.par = cursor.par->Next();
+ while (cursor.par() != sel_end_cursor.par()) {
+ cursor.par()->FirstPhysicalPar()->depth = 0;
+ cursor.par(cursor.par()->Next());
}
- if (cursor.par->footnoteflag == sel_start_cursor.par->footnoteflag)
- cursor.par->FirstPhysicalPar()->depth = 0;
+ if (cursor.par()->footnoteflag == sel_start_cursor.par()->footnoteflag)
+ cursor.par()->FirstPhysicalPar()->depth = 0;
}
- RedoParagraphs(sel_start_cursor, endpar);
+ RedoParagraphs(bview, sel_start_cursor, endpar);
// we have to reset the selection, because the
// geometry could have changed
- SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
+ SetCursor(bview, sel_start_cursor.par(),
+ sel_start_cursor.pos());
sel_cursor = cursor;
- SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
- UpdateCounters(cursor.row);
+ SetCursor(bview, sel_end_cursor.par(), sel_end_cursor.pos());
+ UpdateCounters(bview, cursor.row());
ClearSelection();
SetSelection();
- SetCursor(tmpcursor.par, tmpcursor.pos);
+ SetCursor(bview, tmpcursor.par(), tmpcursor.pos());
}
// decrement depth over selection and
// make a total rebreak of those paragraphs
-void LyXText::DecDepth()
+void LyXText::DecDepth(BufferView * bview)
{
// if there is no selection just set the layout
// of the current paragraph
sel_end_cursor = cursor;
}
- LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+ LyXParagraph * endpar = sel_end_cursor.par()->LastPhysicalPar()->Next();
LyXParagraph * undoendpar = endpar;
if (endpar && endpar->GetDepth()) {
endpar = endpar->Next(); // because of parindents etc.
}
- SetUndo(Undo::EDIT,
+ SetUndo(bview->buffer(), Undo::EDIT,
sel_start_cursor
- .par->ParFromPos(sel_start_cursor.pos)->previous,
+ .par()->ParFromPos(sel_start_cursor.pos())->previous,
undoendpar);
LyXCursor tmpcursor = cursor; // store the current cursor
cursor = sel_start_cursor;
while (true) {
- if (cursor.par->footnoteflag ==
- sel_start_cursor.par->footnoteflag) {
- if (cursor.par->FirstPhysicalPar()->depth)
- cursor.par->FirstPhysicalPar()->depth--;
+ if (cursor.par()->footnoteflag ==
+ sel_start_cursor.par()->footnoteflag) {
+ if (cursor.par()->FirstPhysicalPar()->depth)
+ cursor.par()->FirstPhysicalPar()->depth--;
}
- if (cursor.par == sel_end_cursor.par)
+ if (cursor.par() == sel_end_cursor.par())
break;
- cursor.par = cursor.par->Next();
+ cursor.par(cursor.par()->Next());
}
- RedoParagraphs(sel_start_cursor, endpar);
+ RedoParagraphs(bview, sel_start_cursor, endpar);
// we have to reset the selection, because the
// geometry could have changed
- SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
+ SetCursor(bview, sel_start_cursor.par(),
+ sel_start_cursor.pos());
sel_cursor = cursor;
- SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
- UpdateCounters(cursor.row);
+ SetCursor(bview, sel_end_cursor.par(), sel_end_cursor.pos());
+ UpdateCounters(bview, cursor.row());
ClearSelection();
SetSelection();
- SetCursor(tmpcursor.par, tmpcursor.pos);
+ SetCursor(bview, tmpcursor.par(), tmpcursor.pos());
}
// set font over selection and make a total rebreak of those paragraphs
-void LyXText::SetFont(LyXFont const & font, bool toggleall)
+void LyXText::SetFont(BufferView * bview, LyXFont const & font, bool toggleall)
{
// if there is no selection just set the current_font
if (!selection) {
// Determine basis font
LyXFont layoutfont;
- if (cursor.pos < BeginningOfMainBody(cursor.par))
- layoutfont = GetFont(cursor.par, -2);
+ if (cursor.pos() < BeginningOfMainBody(bview->buffer(),
+ cursor.par()))
+ layoutfont = GetFont(bview->buffer(), cursor.par(),-2);
else
- layoutfont = GetFont(cursor.par, -1);
+ layoutfont = GetFont(bview->buffer(), cursor.par(),-1);
// Update current font
real_current_font.update(font,
- buffer->params.language_info,
+ bview->buffer()->params.language_info,
toggleall);
// Reduce to implicit settings
// ok we have a selection. This is always between sel_start_cursor
// and sel_end cursor
- SetUndo(Undo::EDIT,
- sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous,
- sel_end_cursor.par->ParFromPos(sel_end_cursor.pos)->next);
+ SetUndo(bview->buffer(), Undo::EDIT,
+ sel_start_cursor.par()->ParFromPos(sel_start_cursor.pos())->previous,
+ sel_end_cursor.par()->ParFromPos(sel_end_cursor.pos())->next);
cursor = sel_start_cursor;
- while (cursor.par != sel_end_cursor.par ||
- (cursor.par->footnoteflag == sel_start_cursor.par->footnoteflag
- && cursor.pos < sel_end_cursor.pos))
+ while (cursor.par() != sel_end_cursor.par() ||
+ (cursor.par()->footnoteflag == sel_start_cursor.par()->footnoteflag
+ && cursor.pos() < sel_end_cursor.pos()))
{
- if (cursor.pos < cursor.par->Last()
- && cursor.par->footnoteflag
- == sel_start_cursor.par->footnoteflag) {
+ if (cursor.pos() < cursor.par()->Last()
+ && cursor.par()->footnoteflag
+ == sel_start_cursor.par()->footnoteflag) {
// an open footnote should behave
// like a closed one
- LyXFont newfont = GetFont(cursor.par, cursor.pos);
+ LyXFont newfont = GetFont(bview->buffer(),
+ cursor.par(), cursor.pos());
newfont.update(font,
- buffer->params.language_info,
+ bview->buffer()->params.language_info,
toggleall);
- SetCharFont(cursor.par, cursor.pos, newfont);
- cursor.pos++;
+ SetCharFont(bview->buffer(),
+ cursor.par(), cursor.pos(), newfont);
+ cursor.pos(cursor.pos() + 1);
} else {
- cursor.pos = 0;
- cursor.par = cursor.par->Next();
+ cursor.pos(0);
+ cursor.par(cursor.par()->Next());
}
}
- RedoParagraphs(sel_start_cursor, sel_end_cursor.par->Next());
+ RedoParagraphs(bview, sel_start_cursor, sel_end_cursor.par()->Next());
// we have to reset the selection, because the
// geometry could have changed
- SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
+ SetCursor(bview, sel_start_cursor.par(), sel_start_cursor.pos());
sel_cursor = cursor;
- SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
+ SetCursor(bview, sel_end_cursor.par(), sel_end_cursor.pos());
ClearSelection();
SetSelection();
- SetCursor(tmpcursor.par, tmpcursor.pos);
+ SetCursor(bview, tmpcursor.par(), tmpcursor.pos(), true,
+ tmpcursor.boundary());
}
-void LyXText::RedoHeightOfParagraph(LyXCursor const & cur)
+void LyXText::RedoHeightOfParagraph(BufferView * bview, LyXCursor const & cur)
{
- Row * tmprow = cur.row;
- long y = cur.y - tmprow->baseline;
+ Row * tmprow = cur.row();
+ long y = cur.y() - tmprow->baseline();
- SetHeightOfRow(tmprow);
- LyXParagraph * first_phys_par = tmprow->par->FirstPhysicalPar();
+ SetHeightOfRow(bview, tmprow);
+ LyXParagraph * first_phys_par = tmprow->par()->FirstPhysicalPar();
// find the first row of the paragraph
- if (first_phys_par != tmprow->par)
- while (tmprow->previous
- && tmprow->previous->par != first_phys_par) {
- tmprow = tmprow->previous;
- y -= tmprow->height;
- SetHeightOfRow(tmprow);
- }
- while (tmprow->previous && tmprow->previous->par == first_phys_par) {
- tmprow = tmprow->previous;
- y -= tmprow->height;
- SetHeightOfRow(tmprow);
+ if (first_phys_par != tmprow->par())
+ while (tmprow->previous()
+ && tmprow->previous()->par() != first_phys_par) {
+ tmprow = tmprow->previous();
+ y -= tmprow->height();
+ SetHeightOfRow(bview, tmprow);
+ }
+ while (tmprow->previous() && tmprow->previous()->par() == first_phys_par) {
+ tmprow = tmprow->previous();
+ y -= tmprow->height();
+ SetHeightOfRow(bview, tmprow);
}
// we can set the refreshing parameters now
status = LyXText::NEED_MORE_REFRESH;
refresh_y = y;
refresh_row = tmprow;
- SetCursor(cur.par, cur.pos);
+ SetCursor(bview, cur.par(), cur.pos(), false, cursor.boundary());
}
-void LyXText::RedoDrawingOfParagraph(LyXCursor const & cur)
+void LyXText::RedoDrawingOfParagraph(BufferView * bview, LyXCursor const & cur)
{
- Row * tmprow = cur.row;
+ Row * tmprow = cur.row();
- long y = cur.y - tmprow->baseline;
- SetHeightOfRow(tmprow);
- LyXParagraph * first_phys_par = tmprow->par->FirstPhysicalPar();
+ long y = cur.y() - tmprow->baseline();
+ SetHeightOfRow(bview, tmprow);
+ LyXParagraph * first_phys_par = tmprow->par()->FirstPhysicalPar();
// find the first row of the paragraph
- if (first_phys_par != tmprow->par)
- while (tmprow->previous && tmprow->previous->par != first_phys_par) {
- tmprow = tmprow->previous;
- y -= tmprow->height;
+ if (first_phys_par != tmprow->par())
+ while (tmprow->previous() && tmprow->previous()->par() != first_phys_par) {
+ tmprow = tmprow->previous();
+ y -= tmprow->height();
}
- while (tmprow->previous && tmprow->previous->par == first_phys_par) {
- tmprow = tmprow->previous;
- y -= tmprow->height;
+ while (tmprow->previous() && tmprow->previous()->par() == first_phys_par) {
+ tmprow = tmprow->previous();
+ y -= tmprow->height();
}
// we can set the refreshing parameters now
refresh_row = tmprow;
}
status = LyXText::NEED_MORE_REFRESH;
- SetCursor(cur.par, cur.pos);
+ SetCursor(bview, cur.par(), cur.pos());
}
/* deletes and inserts again all paragaphs between the cursor
* and the specified par
* This function is needed after SetLayout and SetFont etc. */
-void LyXText::RedoParagraphs(LyXCursor const & cur,
+void LyXText::RedoParagraphs(BufferView * bview, LyXCursor const & cur,
LyXParagraph const * endpar) const
{
Row * tmprow2;
- LyXParagraph * tmppar, * first_phys_par;
+ LyXParagraph * tmppar = 0, * first_phys_par = 0;
- Row * tmprow = cur.row;
+ Row * tmprow = cur.row();
- long y = cur.y - tmprow->baseline;
+ long y = cur.y() - tmprow->baseline();
- if (!tmprow->previous){
+ if (!tmprow->previous()){
first_phys_par = FirstParagraph(); // a trick/hack for UNDO
} else {
- first_phys_par = tmprow->par->FirstPhysicalPar();
+ first_phys_par = tmprow->par()->FirstPhysicalPar();
// find the first row of the paragraph
- if (first_phys_par != tmprow->par)
- while (tmprow->previous &&
- (tmprow->previous->par != first_phys_par)) {
- tmprow = tmprow->previous;
- y -= tmprow->height;
+ if (first_phys_par != tmprow->par())
+ while (tmprow->previous() &&
+ (tmprow->previous()->par() != first_phys_par)) {
+ tmprow = tmprow->previous();
+ y -= tmprow->height();
}
- while (tmprow->previous
- && tmprow->previous->par == first_phys_par) {
- tmprow = tmprow->previous;
- y -= tmprow->height;
+ while (tmprow->previous()
+ && tmprow->previous()->par() == first_phys_par) {
+ tmprow = tmprow->previous();
+ y -= tmprow->height();
}
}
// we can set the refreshing parameters now
status = LyXText::NEED_MORE_REFRESH;
refresh_y = y;
- refresh_row = tmprow->previous; /* the real refresh row will
+ refresh_row = tmprow->previous(); /* the real refresh row will
be deleted, so I store
the previous here */
// remove it
- if (tmprow->next)
- tmppar = tmprow->next->par;
+ if (tmprow->next())
+ tmppar = tmprow->next()->par();
else
tmppar = 0;
while (tmppar != endpar) {
- RemoveRow(tmprow->next);
- if (tmprow->next)
- tmppar = tmprow->next->par;
+ RemoveRow(tmprow->next());
+ if (tmprow->next())
+ tmppar = tmprow->next()->par();
else
tmppar = 0;
}
// remove the first one
- tmprow2 = tmprow; /* this is because tmprow->previous
+ tmprow2 = tmprow; /* this is because tmprow->previous()
can be 0 */
- tmprow = tmprow->previous;
+ tmprow = tmprow->previous();
RemoveRow(tmprow2);
tmppar = first_phys_par;
do {
if (tmppar) {
- InsertParagraph(tmppar, tmprow);
+ InsertParagraph(bview, tmppar, tmprow);
if (!tmprow)
tmprow = firstrow;
- while (tmprow->next && tmprow->next->par == tmppar)
- tmprow = tmprow->next;
+ while (tmprow->next() && tmprow->next()->par() == tmppar)
+ tmprow = tmprow->next();
tmppar = tmppar->Next();
}
} while (tmppar != endpar);
// this is because of layout changes
if (refresh_row) {
- refresh_y -= refresh_row->height;
- SetHeightOfRow(refresh_row);
+ refresh_y -= refresh_row->height();
+ SetHeightOfRow(bview, refresh_row);
} else {
refresh_row = firstrow;
refresh_y = 0;
- SetHeightOfRow(refresh_row);
+ SetHeightOfRow(bview, refresh_row);
}
- if (tmprow && tmprow->next)
- SetHeightOfRow(tmprow->next);
+ if (tmprow && tmprow->next())
+ SetHeightOfRow(bview, tmprow->next());
}
-bool LyXText::FullRebreak()
+bool LyXText::FullRebreak(BufferView * bview)
{
+ if (!firstrow) {
+ init(bview);
+ return true;
+ }
if (need_break_row) {
- BreakAgain(need_break_row);
+ BreakAgain(bview, need_break_row);
need_break_row = 0;
return true;
}
/* the cursor set functions have a special mechanism. When they
-* realize, that you left an empty paragraph, they will delete it.
-* They also delet the corresponding row */
+ * realize, that you left an empty paragraph, they will delete it.
+ * They also delete the corresponding row */
// need the selection cursor:
void LyXText::SetSelection()
selection = true;
// first the toggling area
- if (cursor.y < last_sel_cursor.y ||
- (cursor.y == last_sel_cursor.y && cursor.x < last_sel_cursor.x)) {
+ if (cursor.y() < last_sel_cursor.y()
+ || (cursor.y() == last_sel_cursor.y()
+ && cursor.x() < last_sel_cursor.x())) {
toggle_end_cursor = last_sel_cursor;
toggle_cursor = cursor;
- }
- else {
+ } else {
toggle_end_cursor = cursor;
toggle_cursor = last_sel_cursor;
}
// and now the whole selection
- if (sel_cursor.par == cursor.par)
- if (sel_cursor.pos < cursor.pos) {
+ if (sel_cursor.par() == cursor.par())
+ if (sel_cursor.pos() < cursor.pos()) {
sel_end_cursor = cursor;
sel_start_cursor = sel_cursor;
} else {
sel_end_cursor = sel_cursor;
sel_start_cursor = cursor;
}
- else if (sel_cursor.y < cursor.y ||
- (sel_cursor.y == cursor.y && sel_cursor.x < cursor.x)) {
+ else if (sel_cursor.y() < cursor.y() ||
+ (sel_cursor.y() == cursor.y() && sel_cursor.x() < cursor.x())) {
sel_end_cursor = cursor;
sel_start_cursor = sel_cursor;
}
}
// a selection with no contents is not a selection
- if (sel_start_cursor.x == sel_end_cursor.x &&
- sel_start_cursor.y == sel_end_cursor.y)
+ if (sel_start_cursor.par() == sel_end_cursor.par() &&
+ sel_start_cursor.pos() == sel_end_cursor.pos())
selection = false;
}
+string LyXText::selectionAsString(Buffer const * buffer) const
+{
+ if (!selection) return string();
+ string result;
+
+ // Special handling if the whole selection is within one paragraph
+ if (sel_start_cursor.par() == sel_end_cursor.par()) {
+ result += sel_start_cursor.par()->String(buffer,
+ sel_start_cursor.pos(),
+ sel_end_cursor.pos());
+ return result;
+ }
+
+ // The selection spans more than one paragraph
+
+ // First paragraph in selection
+ result += sel_start_cursor.par()->String(buffer,
+ sel_start_cursor.pos(),
+ sel_start_cursor.par()->Last())
+ + "\n\n";
+
+ // The paragraphs in between (if any)
+ LyXCursor tmpcur(sel_start_cursor);
+ tmpcur.par(tmpcur.par()->Next());
+ while (tmpcur.par() != sel_end_cursor.par()) {
+ result += tmpcur.par()->String(buffer, 0, tmpcur.par()->Last()) + "\n\n";
+ tmpcur.par(tmpcur.par()->Next()); // Or NextAfterFootnote??
+ }
+
+ // Last paragraph in selection
+ result += sel_end_cursor.par()->String(buffer, 0, sel_end_cursor.pos());
+
+ return result;
+}
+
+
void LyXText::ClearSelection() const
{
selection = false;
}
-void LyXText::CursorHome() const
+void LyXText::CursorHome(BufferView * bview) const
{
- SetCursor(cursor.par, cursor.row->pos);
+ SetCursor(bview, cursor.par(), cursor.row()->pos());
}
-void LyXText::CursorEnd() const
+void LyXText::CursorEnd(BufferView * bview) const
{
- if (!cursor.row->next || cursor.row->next->par != cursor.row->par)
- SetCursor(cursor.par, RowLast(cursor.row) + 1);
+ if (!cursor.row()->next() || cursor.row()->next()->par() != cursor.row()->par())
+ SetCursor(bview, cursor.par(), RowLast(cursor.row()) + 1);
else {
- if (cursor.par->Last() &&
- (cursor.par->GetChar(RowLast(cursor.row)) == ' '
- || cursor.par->IsNewline(RowLast(cursor.row))))
- SetCursor(cursor.par, RowLast(cursor.row));
+ if (cursor.par()->Last() &&
+ (cursor.par()->GetChar(RowLast(cursor.row())) == ' '
+ || cursor.par()->IsNewline(RowLast(cursor.row()))))
+ SetCursor(bview, cursor.par(), RowLast(cursor.row()));
else
- SetCursor(cursor.par, RowLast(cursor.row) + 1);
- }
- if (cursor.par->table) {
- int cell = NumberOfCell(cursor.par, cursor.pos);
- if (cursor.par->table->RowHasContRow(cell) &&
- cursor.par->table->CellHasContRow(cell)<0) {
- if (!cursor.row->next || cursor.row->next->par != cursor.row->par)
- SetCursor(cursor.par, RowLast(cursor.row) + 1);
+ SetCursor(bview,cursor.par(), RowLast(cursor.row()) + 1);
+ }
+#ifndef NEW_TABULAR
+ if (cursor.par()->table) {
+ int cell = NumberOfCell(cursor.par(), cursor.pos());
+ if (cursor.par()->table->RowHasContRow(cell) &&
+ cursor.par()->table->CellHasContRow(cell)<0) {
+ if (!cursor.row()->next() || cursor.row()->next()->par() != cursor.row()->par())
+ SetCursor(bview, cursor.par(), RowLast(cursor.row()) + 1);
else {
- if (cursor.par->Last() &&
- (cursor.par->GetChar(RowLast(cursor.row)) == ' '
- || cursor.par->IsNewline(RowLast(cursor.row))))
- SetCursor(cursor.par, RowLast(cursor.row));
+ if (cursor.par()->Last() &&
+ (cursor.par()->GetChar(RowLast(cursor.row())) == ' '
+ || cursor.par()->IsNewline(RowLast(cursor.row()))))
+ SetCursor(bview, cursor.par(), RowLast(cursor.row()));
else
- SetCursor(cursor.par, RowLast(cursor.row) + 1);
+ SetCursor(bview, cursor.par(), RowLast(cursor.row()) + 1);
}
}
}
+#endif
}
-void LyXText::CursorTop() const
+void LyXText::CursorTop(BufferView * bview) const
{
- while (cursor.par->Previous())
- cursor.par = cursor.par->Previous();
- SetCursor(cursor.par, 0);
+ while (cursor.par()->Previous())
+ cursor.par(cursor.par()->Previous());
+ SetCursor(bview, cursor.par(), 0);
}
-void LyXText::CursorBottom() const
+void LyXText::CursorBottom(BufferView * bview) const
{
- while (cursor.par->Next())
- cursor.par = cursor.par->Next();
- SetCursor(cursor.par, cursor.par->Last());
+ while (cursor.par()->Next())
+ cursor.par(cursor.par()->Next());
+ SetCursor(bview, cursor.par(), cursor.par()->Last());
}
Row * tmprow = firstrow;
long tmpy = 0;
- while (tmprow->next && tmpy + tmprow->height <= y) {
- tmpy += tmprow->height;
- tmprow = tmprow->next;
+ while (tmprow->next() && tmpy + tmprow->height() <= y) {
+ tmpy += tmprow->height();
+ tmprow = tmprow->next();
}
y = tmpy; // return the real y
}
-void LyXText::ToggleFree(LyXFont const & font, bool toggleall)
+void LyXText::ToggleFree(BufferView * bview,
+ LyXFont const & font, bool toggleall)
{
// If the mask is completely neutral, tell user
if (font == LyXFont(LyXFont::ALL_IGNORE)) {
// Could only happen with user style
- owner_->owner()->getMiniBuffer()
+ bview->owner()->getMiniBuffer()
->Set(_("No font change defined. Use Character under"
- " the Layout menu to define font change."));
+ " the Layout menu to define font change."));
return;
}
// is disabled.
LyXCursor resetCursor = cursor;
bool implicitSelection = (font.language() == ignore_language)
- ? SelectWordWhenUnderCursor() : false;
+ ? SelectWordWhenUnderCursor(bview) : false;
// Set font
- SetFont(font, toggleall);
+ SetFont(bview, font, toggleall);
/* Implicit selections are cleared afterwards and cursor is set to the
original position. */
if (implicitSelection) {
ClearSelection();
cursor = resetCursor;
- SetCursor( cursor.par, cursor.pos );
+ SetCursor(bview, cursor.par(), cursor.pos());
sel_cursor = cursor;
}
}
-LyXParagraph::size_type LyXText::BeginningOfMainBody(LyXParagraph * par) const
+LyXParagraph::size_type
+LyXText::BeginningOfMainBody(Buffer const * buf,
+ LyXParagraph const * par) const
{
- if (textclasslist.Style(buffer->params.textclass,
+ if (textclasslist.Style(buf->params.textclass,
par->GetLayout()).labeltype != LABEL_MANUAL)
return 0;
else
}
+#ifndef NEW_INSETS
/* if there is a selection, reset every environment you can find
* in the selection, otherwise just the environment you are in */
-void LyXText::MeltFootnoteEnvironment()
+void LyXText::MeltFootnoteEnvironment(BufferView * bview)
{
LyXParagraph * tmppar, * firsttmppar;
/* is is only allowed, if the cursor is IN an open footnote.
* Otherwise it is too dangerous */
- if (cursor.par->footnoteflag != LyXParagraph::OPEN_FOOTNOTE)
+ if (cursor.par()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE)
return;
- SetUndo(Undo::FINISH,
- cursor.par->PreviousBeforeFootnote()->previous,
- cursor.par->NextAfterFootnote()->next);
+ SetUndo(bview->buffer(), Undo::FINISH,
+ cursor.par()->PreviousBeforeFootnote()->previous,
+ cursor.par()->NextAfterFootnote()->next);
/* ok, move to the beginning of the footnote. */
- while (cursor.par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
- cursor.par = cursor.par->Previous();
+ while (cursor.par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
+ cursor.par(cursor.par()->Previous());
- SetCursor(cursor.par, cursor.par->Last());
+ SetCursor(bview, cursor.par(), cursor.par()->Last());
/* this is just faster than using CursorLeft(); */
- firsttmppar = cursor.par->ParFromPos(cursor.pos);
+ firsttmppar = cursor.par()->ParFromPos(cursor.pos());
tmppar = firsttmppar;
/* tmppar is now the paragraph right before the footnote */
tmppar->footnoteflag = LyXParagraph::NO_FOOTNOTE;
/* remember the captions and empty paragraphs */
- if ((textclasslist.Style(buffer->params.textclass,
+ if ((textclasslist.Style(bview->buffer()->params.textclass,
tmppar->GetLayout())
.labeltype == LABEL_SENSITIVE)
|| !tmppar->Last())
- tmppar->SetLayout(0);
+ tmppar->SetLayout(bview->buffer()->params, 0);
}
// now we will paste the ex-footnote, if the layouts allow it
// first restore the layout of the paragraph right behind
// the footnote
if (tmppar->next)
- tmppar->next->MakeSameLayout(cursor.par);
+ tmppar->next->MakeSameLayout(cursor.par());
// first the end
if ((!tmppar->GetLayout() && !tmppar->table)
if (tmppar->Next()->Last()
&& tmppar->Next()->IsLineSeparator(0))
tmppar->Next()->Erase(0);
- tmppar->PasteParagraph();
+ tmppar->PasteParagraph(bview->buffer()->params);
}
tmppar = tmppar->Next(); /* make sure tmppar cannot be touched
&& first_footnote_par_is_not_empty) {
firsttmppar->next->InsertChar(0, ' ');
}
- firsttmppar->PasteParagraph();
+ firsttmppar->PasteParagraph(bview->buffer()->params);
}
/* now redo the paragaphs */
- RedoParagraphs(cursor, tmppar);
+ RedoParagraphs(bview, cursor, tmppar);
- SetCursor(cursor.par, cursor.pos);
+ SetCursor(bview, cursor.par(), cursor.pos());
/* sometimes it can happen, that there is a counter change */
- Row * row = cursor.row;
- while (row->next && row->par != tmppar && row->next->par != tmppar)
- row = row->next;
- UpdateCounters(row);
+ Row * row = cursor.row();
+ while (row->next() && row->par() != tmppar && row->next()->par() != tmppar)
+ row = row->next();
+ UpdateCounters(bview, row);
ClearSelection();
}
+#endif
/* the DTP switches for paragraphs. LyX will store them in the
* they do not duplicate themself and you cannnot make dirty things with
* them! */
-void LyXText::SetParagraph(bool line_top, bool line_bottom,
+void LyXText::SetParagraph(BufferView * bview,
+ bool line_top, bool line_bottom,
bool pagebreak_top, bool pagebreak_bottom,
VSpace const & space_top,
VSpace const & space_bottom,
}
// make sure that the depth behind the selection are restored, too
- LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+ LyXParagraph * endpar = sel_end_cursor.par()->LastPhysicalPar()->Next();
LyXParagraph * undoendpar = endpar;
if (endpar && endpar->GetDepth()) {
endpar = endpar->Next(); // because of parindents etc.
}
- SetUndo(Undo::EDIT,
+ SetUndo(bview->buffer(), Undo::EDIT,
sel_start_cursor
- .par->ParFromPos(sel_start_cursor.pos)->previous,
+ .par()->ParFromPos(sel_start_cursor.pos())->previous,
undoendpar);
- LyXParagraph * tmppar = sel_end_cursor.par;
- while (tmppar != sel_start_cursor.par->FirstPhysicalPar()->Previous()) {
- SetCursor(tmppar->FirstPhysicalPar(), 0);
+ LyXParagraph * tmppar = sel_end_cursor.par();
+ while (tmppar != sel_start_cursor.par()->FirstPhysicalPar()->Previous()) {
+ SetCursor(bview, tmppar->FirstPhysicalPar(), 0);
status = LyXText::NEED_MORE_REFRESH;
- refresh_row = cursor.row;
- refresh_y = cursor.y - cursor.row->baseline;
- if (cursor.par->footnoteflag ==
- sel_start_cursor.par->footnoteflag) {
- cursor.par->line_top = line_top;
- cursor.par->line_bottom = line_bottom;
- cursor.par->pagebreak_top = pagebreak_top;
- cursor.par->pagebreak_bottom = pagebreak_bottom;
- cursor.par->added_space_top = space_top;
- cursor.par->added_space_bottom = space_bottom;
+ refresh_row = cursor.row();
+ refresh_y = cursor.y() - cursor.row()->baseline();
+ if (cursor.par()->footnoteflag ==
+ sel_start_cursor.par()->footnoteflag) {
+ cursor.par()->line_top = line_top;
+ cursor.par()->line_bottom = line_bottom;
+ cursor.par()->pagebreak_top = pagebreak_top;
+ cursor.par()->pagebreak_bottom = pagebreak_bottom;
+ cursor.par()->added_space_top = space_top;
+ cursor.par()->added_space_bottom = space_bottom;
// does the layout allow the new alignment?
if (align == LYX_ALIGN_LAYOUT)
align = textclasslist
- .Style(buffer->params.textclass,
- cursor.par->GetLayout()).align;
+ .Style(bview->buffer()->params.textclass,
+ cursor.par()->GetLayout()).align;
if (align & textclasslist
- .Style(buffer->params.textclass,
- cursor.par->GetLayout()).alignpossible) {
+ .Style(bview->buffer()->params.textclass,
+ cursor.par()->GetLayout()).alignpossible) {
if (align == textclasslist
- .Style(buffer->params.textclass,
- cursor.par->GetLayout()).align)
- cursor.par->align = LYX_ALIGN_LAYOUT;
+ .Style(bview->buffer()->params.textclass,
+ cursor.par()->GetLayout()).align)
+ cursor.par()->align = LYX_ALIGN_LAYOUT;
else
- cursor.par->align = align;
+ cursor.par()->align = align;
}
- cursor.par->SetLabelWidthString(labelwidthstring);
- cursor.par->noindent = noindent;
+ cursor.par()->SetLabelWidthString(labelwidthstring);
+ cursor.par()->noindent = noindent;
}
- tmppar = cursor.par->FirstPhysicalPar()->Previous();
+ tmppar = cursor.par()->FirstPhysicalPar()->Previous();
}
- RedoParagraphs(sel_start_cursor, endpar);
+ RedoParagraphs(bview, sel_start_cursor, endpar);
ClearSelection();
- SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
+ SetCursor(bview, sel_start_cursor.par(), sel_start_cursor.pos());
sel_cursor = cursor;
- SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
+ SetCursor(bview, sel_end_cursor.par(), sel_end_cursor.pos());
SetSelection();
- SetCursor(tmpcursor.par, tmpcursor.pos);
+ SetCursor(bview, tmpcursor.par(), tmpcursor.pos());
}
-void LyXText::SetParagraphExtraOpt(int type,
+void LyXText::SetParagraphExtraOpt(BufferView * bview, int type,
char const * width,
char const * widthp,
int alignment, bool hfill,
}
// make sure that the depth behind the selection are restored, too
- LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+ LyXParagraph * endpar = sel_end_cursor.par()->LastPhysicalPar()->Next();
LyXParagraph * undoendpar = endpar;
if (endpar && endpar->GetDepth()) {
endpar = endpar->Next(); // because of parindents etc.
}
- SetUndo(Undo::EDIT,
+ SetUndo(bview->buffer(), Undo::EDIT,
sel_start_cursor
- .par->ParFromPos(sel_start_cursor.pos)->previous,
+ .par()->ParFromPos(sel_start_cursor.pos())->previous,
undoendpar);
- tmppar = sel_end_cursor.par;
- while(tmppar != sel_start_cursor.par->FirstPhysicalPar()->Previous()) {
- SetCursor(tmppar->FirstPhysicalPar(), 0);
+ tmppar = sel_end_cursor.par();
+ while(tmppar != sel_start_cursor.par()->FirstPhysicalPar()->Previous()) {
+ SetCursor(bview, tmppar->FirstPhysicalPar(), 0);
status = LyXText::NEED_MORE_REFRESH;
- refresh_row = cursor.row;
- refresh_y = cursor.y - cursor.row->baseline;
- if (cursor.par->footnoteflag ==
- sel_start_cursor.par->footnoteflag) {
+ refresh_row = cursor.row();
+ refresh_y = cursor.y() - cursor.row()->baseline();
+ if (cursor.par()->footnoteflag ==
+ sel_start_cursor.par()->footnoteflag) {
if (type == LyXParagraph::PEXTRA_NONE) {
- if (cursor.par->pextra_type != LyXParagraph::PEXTRA_NONE) {
- cursor.par->UnsetPExtraType();
- cursor.par->pextra_type = LyXParagraph::PEXTRA_NONE;
+ if (cursor.par()->pextra_type != LyXParagraph::PEXTRA_NONE) {
+ cursor.par()->UnsetPExtraType(bview->buffer()->params);
+ cursor.par()->pextra_type = LyXParagraph::PEXTRA_NONE;
}
} else {
- cursor.par->SetPExtraType(type, width, widthp);
- cursor.par->pextra_hfill = hfill;
- cursor.par->pextra_start_minipage = start_minipage;
- cursor.par->pextra_alignment = alignment;
+ cursor.par()->SetPExtraType(bview->buffer()->params,
+ type, width, widthp);
+ cursor.par()->pextra_hfill = hfill;
+ cursor.par()->pextra_start_minipage = start_minipage;
+ cursor.par()->pextra_alignment = alignment;
}
}
- tmppar = cursor.par->FirstPhysicalPar()->Previous();
+ tmppar = cursor.par()->FirstPhysicalPar()->Previous();
}
- RedoParagraphs(sel_start_cursor, endpar);
+ RedoParagraphs(bview, sel_start_cursor, endpar);
ClearSelection();
- SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
+ SetCursor(bview, sel_start_cursor.par(), sel_start_cursor.pos());
sel_cursor = cursor;
- SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
+ SetCursor(bview, sel_end_cursor.par(), sel_end_cursor.pos());
SetSelection();
- SetCursor(tmpcursor.par, tmpcursor.pos);
+ SetCursor(bview, tmpcursor.par(), tmpcursor.pos());
}
}
// set the counter of a paragraph. This includes the labels
-void LyXText::SetCounter(LyXParagraph * par) const
+void LyXText::SetCounter(Buffer const * buf, LyXParagraph * par) const
{
// this is only relevant for the beginning of paragraph
par = par->FirstPhysicalPar();
LyXLayout const & layout =
- textclasslist.Style(buffer->params.textclass,
+ textclasslist.Style(buf->params.textclass,
par->GetLayout());
LyXTextClass const & textclass =
- textclasslist.TextClass(buffer->params.textclass);
+ textclasslist.TextClass(buf->params.textclass);
/* copy the prev-counters to this one, unless this is the start of a
footnote or of a bibliography or the very first paragraph */
&& !(par->Previous()->footnoteflag == LyXParagraph::NO_FOOTNOTE
&& par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
&& par->footnotekind == LyXParagraph::FOOTNOTE)
- && !(textclasslist.Style(buffer->params.textclass,
+ && !(textclasslist.Style(buf->params.textclass,
par->Previous()->GetLayout()
).labeltype != LABEL_BIBLIO
&& layout.labeltype == LABEL_BIBLIO)) {
par->itemdepth = 0;
}
+#ifndef NEW_INSETS
// if this is an open marginnote and this is the first
// entry in the marginnote and the enclosing
// environment is an enum/item then correct for the
&& par->Previous()
&& par->Previous()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE
&& (par->PreviousBeforeFootnote()
- && textclasslist.Style(buffer->params.textclass,
+ && textclasslist.Style(buf->params.textclass,
par->PreviousBeforeFootnote()->GetLayout()
).labeltype >= LABEL_COUNTER_ENUMI)) {
// Any itemize or enumerate environment in a marginnote
par->enumdepth++;
par->itemdepth++;
}
-
+#endif
/* Maybe we have to increment the enumeration depth.
* BUT, enumeration in a footnote is considered in isolation from its
* surrounding paragraph so don't increment if this is the
*/
if (par->Previous()
&& par->Previous()->GetDepth() < par->GetDepth()
- && textclasslist.Style(buffer->params.textclass,
+ && textclasslist.Style(buf->params.textclass,
par->Previous()->GetLayout()
).labeltype == LABEL_COUNTER_ENUMI
&& par->enumdepth < 3
if (layout.labeltype >= LABEL_FIRST_COUNTER) {
int i = layout.labeltype - LABEL_FIRST_COUNTER;
- if (i >= 0 && i<= buffer->params.secnumdepth) {
+ if (i >= 0 && i<= buf->params.secnumdepth) {
par->incCounter(i); // increment the counter
// Is there a label? Useful for Chapter layout
} else { // appendix
switch (2 * LABEL_FIRST_COUNTER - textclass.maxcounter() + i) {
case LABEL_COUNTER_CHAPTER:
- if (par->isRightToLeftPar())
+ if (par->isRightToLeftPar(buf->params))
s << hebrewCounter(par->getCounter(i));
else
s << alphaCounter(par->getCounter(i));
break;
case LABEL_COUNTER_SECTION:
- if (par->isRightToLeftPar())
+ if (par->isRightToLeftPar(buf->params))
s << hebrewCounter(par->getCounter(i - 1));
else
s << alphaCounter(par->getCounter(i - 1));
break;
case LABEL_COUNTER_SUBSECTION:
- if (par->isRightToLeftPar())
+ if (par->isRightToLeftPar(buf->params))
s << hebrewCounter(par->getCounter(i - 2));
else
s << alphaCounter(par->getCounter(i - 2));
break;
case LABEL_COUNTER_SUBSUBSECTION:
- if (par->isRightToLeftPar())
+ if (par->isRightToLeftPar(buf->params))
s << hebrewCounter(par->getCounter(i-3));
else
s << alphaCounter(par->getCounter(i-3));
break;
case LABEL_COUNTER_PARAGRAPH:
- if (par->isRightToLeftPar())
+ if (par->isRightToLeftPar(buf->params))
s << hebrewCounter(par->getCounter(i-4));
else
s << alphaCounter(par->getCounter(i-4));
break;
case LABEL_COUNTER_SUBPARAGRAPH:
- if (par->isRightToLeftPar())
+ if (par->isRightToLeftPar(buf->params))
s << hebrewCounter(par->getCounter(i-5));
else
s << alphaCounter(par->getCounter(i-5));
#endif
switch (par->enumdepth) {
case 1:
- if (par->isRightToLeftPar())
+ if (par->isRightToLeftPar(buf->params))
s << '('
<< hebrewCounter(number)
<< ')';
<< ')';
break;
case 2:
- if (par->isRightToLeftPar())
+ if (par->isRightToLeftPar(buf->params))
s << '.' << romanCounter(number);
else
s << romanCounter(number) << '.';
break;
case 3:
- if (par->isRightToLeftPar())
+ if (par->isRightToLeftPar(buf->params))
s << '.'
<< alphaCounter(number);
else
<< '.';
break;
default:
- if (par->isRightToLeftPar())
+ if (par->isRightToLeftPar(buf->params))
s << '.' << number;
else
s << number << '.';
if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE
&& (par->footnotekind == LyXParagraph::FIG
|| par->footnotekind == LyXParagraph::WIDE_FIG))
- s = (par->getParLanguage()->lang == "hebrew")
+ s = (par->getParLanguage(buf->params)->lang() == "hebrew")
? ":øåéà " : "Figure:";
else if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE
&& (par->footnotekind == LyXParagraph::TAB
|| par->footnotekind == LyXParagraph::WIDE_TAB))
- s = (par->getParLanguage()->lang == "hebrew")
+ s = (par->getParLanguage(buf->params)->lang() == "hebrew")
? ":äìáè" : "Table:";
else if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE
&& par->footnotekind == LyXParagraph::ALGORITHM)
- s = (par->getParLanguage()->lang == "hebrew")
+ s = (par->getParLanguage(buf->params)->lang() == "hebrew")
? ":Ãúéøåâìà " : "Algorithm:";
else {
/* par->SetLayout(0);
s = layout->labelstring; */
- s = (par->getParLanguage()->lang == "hebrew")
+ s = (par->getParLanguage(buf->params)->lang() == "hebrew")
? " :úåòîùî øñç" : "Senseless: ";
}
}
/* Updates all counters BEHIND the row. Changed paragraphs
* with a dynamic left margin will be rebroken. */
-void LyXText::UpdateCounters(Row * row) const
+void LyXText::UpdateCounters(BufferView * bview, Row * row) const
{
LyXParagraph * par;
if (!row) {
row = firstrow;
- par = row->par;
+ par = row->par();
}
else {
- if (row->par->next
- && row->par->next->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
- par = row->par->LastPhysicalPar()->Next();
+ if (row->par()->next
+ && row->par()->next->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
+ par = row->par()->LastPhysicalPar()->Next();
} else {
- par = row->par->next;
+ par = row->par()->next;
}
}
while (par) {
- while (row->par != par)
- row = row->next;
+ while (row->par() != par)
+ row = row->next();
- SetCounter(par);
+ SetCounter(bview->buffer(), par);
/* now check for the headline layouts. remember that they
* have a dynamic left margin */
if (!par->IsDummy()
- && ( textclasslist.Style(buffer->params.textclass,
+ && ( textclasslist.Style(bview->buffer()->params.textclass,
par->layout).margintype == MARGIN_DYNAMIC
- || textclasslist.Style(buffer->params.textclass,
+ || textclasslist.Style(bview->buffer()->params.textclass,
par->layout).labeltype == LABEL_SENSITIVE)
) {
/* Rebreak the paragraph */
RemoveParagraph(row);
- AppendParagraph(row);
-
+ AppendParagraph(bview, row);
+
+#ifndef NEW_INSETS
/* think about the damned open footnotes! */
while (par->Next() &&
(par->Next()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
|| par->Next()->IsDummy())){
par = par->Next();
if (par->IsDummy()) {
- while (row->par != par)
- row = row->next;
+ while (row->par() != par)
+ row = row->next();
RemoveParagraph(row);
- AppendParagraph(row);
+ AppendParagraph(bview, row);
}
}
+#endif
}
par = par->LastPhysicalPar()->Next();
/* insets an inset. */
-void LyXText::InsertInset(Inset *inset)
+void LyXText::InsertInset(BufferView * bview, Inset * inset)
{
- if (!cursor.par->InsertInsetAllowed(inset))
+ if (!cursor.par()->InsertInsetAllowed(inset))
return;
- SetUndo(Undo::INSERT,
- cursor.par->ParFromPos(cursor.pos)->previous,
- cursor.par->ParFromPos(cursor.pos)->next);
- cursor.par->InsertChar(cursor.pos, LyXParagraph::META_INSET);
- cursor.par->InsertInset(cursor.pos, inset);
- InsertChar(LyXParagraph::META_INSET); /* just to rebreak and refresh correctly.
+ SetUndo(bview->buffer(), Undo::INSERT,
+ cursor.par()->ParFromPos(cursor.pos())->previous,
+ cursor.par()->ParFromPos(cursor.pos())->next);
+ cursor.par()->InsertInset(cursor.pos(), inset);
+ InsertChar(bview, LyXParagraph::META_INSET); /* just to rebreak and refresh correctly.
* The character will not be inserted a
* second time */
}
-#ifdef USE_OLD_CUT_AND_PASTE
-// this is for the simple cut and paste mechanism
-static LyXParagraph * simple_cut_buffer = 0;
-static char simple_cut_buffer_textclass = 0;
-
-void DeleteSimpleCutBuffer()
-{
- if (!simple_cut_buffer)
- return;
- LyXParagraph * tmppar;
-
- while (simple_cut_buffer) {
- tmppar = simple_cut_buffer;
- simple_cut_buffer = simple_cut_buffer->next;
- delete tmppar;
- }
- simple_cut_buffer = 0;
-}
-#endif
-
void LyXText::copyEnvironmentType()
{
- copylayouttype = cursor.par->GetLayout();
+ copylayouttype = cursor.par()->GetLayout();
}
-void LyXText::pasteEnvironmentType()
+void LyXText::pasteEnvironmentType(BufferView * bview)
{
- SetLayout(copylayouttype);
+ SetLayout(bview, copylayouttype);
}
-#ifdef USE_OLD_CUT_AND_PASTE
-void LyXText::CutSelection(bool doclear)
+
+void LyXText::CutSelection(BufferView * bview, bool doclear)
{
+ // Stuff what we got on the clipboard. Even if there is no selection.
+
+ // There is a problem with having the stuffing here in that the
+ // larger the selection the slower LyX will get. This can be
+ // solved by running the line below only when the selection has
+ // finished. The solution used currently just works, to make it
+ // faster we need to be more clever and probably also have more
+ // calls to stuffClipboard. (Lgb)
+ bview->stuffClipboard(selectionAsString(bview->buffer()));
+
// This doesn't make sense, if there is no selection
if (!selection)
return;
// OK, we have a selection. This is always between sel_start_cursor
// and sel_end cursor
LyXParagraph * tmppar;
-
+
+#ifndef NEW_INSETS
// Check whether there are half footnotes in the selection
- if (sel_start_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
- || sel_end_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
- tmppar = sel_start_cursor.par;
- while (tmppar != sel_end_cursor.par){
- if (tmppar->footnoteflag != sel_end_cursor.par->footnoteflag) {
+ if (sel_start_cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE
+ || sel_end_cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
+ tmppar = sel_start_cursor.par();
+ while (tmppar != sel_end_cursor.par()){
+ if (tmppar->footnoteflag != sel_end_cursor.par()->footnoteflag) {
WriteAlert(_("Impossible operation"),
_("Don't know what to do with half floats."),
_("sorry."));
tmppar = tmppar->Next();
}
}
-
+#endif
+#ifndef NEW_TABULAR
/* table stuff -- begin */
- if (sel_start_cursor.par->table || sel_end_cursor.par->table) {
- if ( sel_start_cursor.par != sel_end_cursor.par) {
+ if (sel_start_cursor.par()->table || sel_end_cursor.par()->table) {
+ if ( sel_start_cursor.par() != sel_end_cursor.par()) {
WriteAlert(_("Impossible operation"),
_("Don't know what to do with half tables."),
_("sorry."));
return;
}
- sel_start_cursor.par->table->Reinit();
+ sel_start_cursor.par()->table->Reinit();
}
/* table stuff -- end */
-
+#endif
// make sure that the depth behind the selection are restored, too
- LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+ LyXParagraph * endpar = sel_end_cursor.par()->LastPhysicalPar()->Next();
LyXParagraph * undoendpar = endpar;
-
+
if (endpar && endpar->GetDepth()) {
while (endpar && endpar->GetDepth()) {
endpar = endpar->LastPhysicalPar()->Next();
} else if (endpar) {
endpar = endpar->Next(); // because of parindents etc.
}
-
- SetUndo(Undo::DELETE,
- sel_start_cursor
- .par->ParFromPos(sel_start_cursor.pos)->previous,
- undoendpar);
-
- // clear the simple_cut_buffer
- DeleteSimpleCutBuffer();
-
- // set the textclass
- simple_cut_buffer_textclass = buffer->params.textclass;
-
-#ifdef WITH_WARNINGS
-#warning Asger: Make cut more intelligent here.
-#endif
- /*
- White paper for "intelligent" cutting:
-
- Example: "This is our text."
- Using " our " as selection, cutting will give "This istext.".
- Using "our" as selection, cutting will give "This is text.".
- Using " our" as selection, cutting will give "This is text.".
- Using "our " as selection, cutting will give "This is text.".
-
- All those four selections will (however) paste identically:
- Pasting with the cursor right after the "is" will give the
- original text with all four selections.
-
- The rationale is to be intelligent such that words are copied,
- cut and pasted in a functional manner.
-
- This is not implemented yet. (Asger)
-
- The changes below sees to do a lot of what you want. However
- I have not verified that all cases work as they should:
- - cut in single row
- - cut in multiple row
- - cut with insets
- - cut across footnotes and paragraph
- My simplistic tests show that the idea are basically sound but
- there are some items to fix up...we only need to find them
- first.
-
- As do redo Asger's example above (with | beeing the cursor in the
- result after cutting.):
-
- Example: "This is our text."
- Using " our " as selection, cutting will give "This is|text.".
- Using "our" as selection, cutting will give "This is | text.".
- Using " our" as selection, cutting will give "This is| text.".
- Using "our " as selection, cutting will give "This is |text.".
-
- (Lgb)
- */
+
+ SetUndo(bview->buffer(), Undo::DELETE, sel_start_cursor
+ .par()->ParFromPos(sel_start_cursor.pos())->previous, undoendpar);
+
+ CutAndPaste cap;
// there are two cases: cut only within one paragraph or
// more than one paragraph
-
- if (sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)
- == sel_end_cursor.par->ParFromPos(sel_end_cursor.pos)) {
+ if (sel_start_cursor.par()->ParFromPos(sel_start_cursor.pos())
+ == sel_end_cursor.par()->ParFromPos(sel_end_cursor.pos())) {
// only within one paragraph
- simple_cut_buffer = new LyXParagraph;
- LyXParagraph::size_type i =
- sel_start_cursor.pos;
- for (; i < sel_end_cursor.pos; ++i) {
- /* table stuff -- begin */
- if (sel_start_cursor.par->table
- && sel_start_cursor.par->IsNewline(sel_start_cursor.pos)) {
- sel_start_cursor.par->CopyIntoMinibuffer(sel_start_cursor.pos);
- sel_start_cursor.pos++;
- } else {
- /* table stuff -- end */
- sel_start_cursor.par->CopyIntoMinibuffer(sel_start_cursor.pos);
- sel_start_cursor.par->Erase(sel_start_cursor.pos);
- }
- simple_cut_buffer->InsertFromMinibuffer(simple_cut_buffer->Last());
- }
- endpar = sel_end_cursor.par->Next();
+ endpar = sel_start_cursor.par();
+ int pos = sel_end_cursor.pos();
+ cap.cutSelection(sel_start_cursor.par(), &endpar,
+ sel_start_cursor.pos(), pos,
+ bview->buffer()->params.textclass, doclear);
+ sel_end_cursor.pos(pos);
} else {
- // cut more than one paragraph
-
- sel_end_cursor.par
- ->BreakParagraphConservative(sel_end_cursor.pos);
- sel_end_cursor.par = sel_end_cursor.par->Next();
- sel_end_cursor.pos = 0;
-
- cursor = sel_end_cursor;
-
- sel_start_cursor.par
- ->BreakParagraphConservative(sel_start_cursor.pos);
- // store the endparagraph for redoing later
- endpar = sel_end_cursor.par->Next(); /* needed because
- the sel_end_
- cursor.par
- will be pasted! */
-
- // store the selection
- simple_cut_buffer = sel_start_cursor.par
- ->ParFromPos(sel_start_cursor.pos)->next;
- simple_cut_buffer->previous = 0;
- sel_end_cursor.par->previous->next = 0;
-
- // cut the selection
- sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->next
- = sel_end_cursor.par;
-
- sel_end_cursor.par->previous
- = sel_start_cursor.par->ParFromPos(sel_start_cursor.pos);
-
- // care about footnotes
- if (simple_cut_buffer->footnoteflag) {
- LyXParagraph * tmppar = simple_cut_buffer;
- while (tmppar){
- tmppar->footnoteflag = LyXParagraph::NO_FOOTNOTE;
- tmppar = tmppar->next;
- }
- }
+ endpar = sel_end_cursor.par();
- // the cut selection should begin with standard layout
- simple_cut_buffer->Clear();
-
- // paste the paragraphs again, if possible
- if (doclear)
- sel_start_cursor.par->Next()->ClearParagraph();
- if (sel_start_cursor.par->FirstPhysicalPar()->HasSameLayout(sel_start_cursor.par->Next())
- ||
- !sel_start_cursor.par->Next()->Last())
- sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->PasteParagraph();
+ int pos = sel_end_cursor.pos();
+ cap.cutSelection(sel_start_cursor.par(), &endpar,
+ sel_start_cursor.pos(), pos,
+ bview->buffer()->params.textclass, doclear);
+ cursor.par(endpar);
+ sel_end_cursor.par(endpar);
+ sel_end_cursor.pos(pos);
+ cursor.pos(sel_end_cursor.pos());
}
+ endpar = endpar->Next();
// sometimes necessary
if (doclear)
- sel_start_cursor.par->ClearParagraph();
+ sel_start_cursor.par()->StripLeadingSpaces(bview->buffer()->params.textclass);
- RedoParagraphs(sel_start_cursor, endpar);
+ RedoParagraphs(bview, sel_start_cursor, endpar);
ClearSelection();
cursor = sel_start_cursor;
- SetCursor(cursor.par, cursor.pos);
+ SetCursor(bview, cursor.par(), cursor.pos());
sel_cursor = cursor;
- UpdateCounters(cursor.row);
+ UpdateCounters(bview, cursor.row());
}
-#else ///////////////////////////////////////////////////////////////////
-void LyXText::CutSelection(bool doclear)
+void LyXText::CopySelection(BufferView * bview)
{
- // This doesn't make sense, if there is no selection
- if (!selection)
- return;
-
- // OK, we have a selection. This is always between sel_start_cursor
- // and sel_end cursor
- LyXParagraph * tmppar;
-
- // Check whether there are half footnotes in the selection
- if (sel_start_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
- || sel_end_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
- tmppar = sel_start_cursor.par;
- while (tmppar != sel_end_cursor.par){
- if (tmppar->footnoteflag != sel_end_cursor.par->footnoteflag) {
- WriteAlert(_("Impossible operation"),
- _("Don't know what to do with half floats."),
- _("sorry."));
- return;
- }
- tmppar = tmppar->Next();
- }
- }
-
- /* table stuff -- begin */
- if (sel_start_cursor.par->table || sel_end_cursor.par->table) {
- if ( sel_start_cursor.par != sel_end_cursor.par) {
- WriteAlert(_("Impossible operation"),
- _("Don't know what to do with half tables."),
- _("sorry."));
- return;
- }
- sel_start_cursor.par->table->Reinit();
- }
- /* table stuff -- end */
-
- // make sure that the depth behind the selection are restored, too
- LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
- LyXParagraph * undoendpar = endpar;
-
- if (endpar && endpar->GetDepth()) {
- while (endpar && endpar->GetDepth()) {
- endpar = endpar->LastPhysicalPar()->Next();
- undoendpar = endpar;
- }
- } else if (endpar) {
- endpar = endpar->Next(); // because of parindents etc.
- }
-
- SetUndo(Undo::DELETE, sel_start_cursor
- .par->ParFromPos(sel_start_cursor.pos)->previous, undoendpar);
-
- CutAndPaste cap;
-
- // there are two cases: cut only within one paragraph or
- // more than one paragraph
- if (sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)
- == sel_end_cursor.par->ParFromPos(sel_end_cursor.pos)) {
- // only within one paragraph
- endpar = sel_start_cursor.par;
- cap.cutSelection(sel_start_cursor.par, &endpar,
- sel_start_cursor.pos, sel_end_cursor.pos,
- buffer->params.textclass, doclear);
- } else {
- endpar = sel_end_cursor.par;
-
- cap.cutSelection(sel_start_cursor.par, &endpar,
- sel_start_cursor.pos, sel_end_cursor.pos,
- buffer->params.textclass, doclear);
- cursor.par = sel_end_cursor.par = endpar;
- cursor.pos = sel_end_cursor.pos;
- }
- endpar = endpar->Next();
-
- // sometimes necessary
- if (doclear)
- sel_start_cursor.par->ClearParagraph();
-
- RedoParagraphs(sel_start_cursor, endpar);
-
- ClearSelection();
- cursor = sel_start_cursor;
- SetCursor(cursor.par, cursor.pos);
- sel_cursor = cursor;
- UpdateCounters(cursor.row);
-}
-#endif
-
-#ifdef USE_OLD_CUT_AND_PASTE
-void LyXText::CopySelection()
-{
- // this doesnt make sense, if there is no selection
- if (!selection)
- return;
+ // Stuff what we got on the clipboard. Even if there is no selection.
- // ok we have a selection. This is always between sel_start_cursor
- // and sel_end cursor
- LyXParagraph * tmppar;
-
- /* check wether there are half footnotes in the selection */
- if (sel_start_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
- || sel_end_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
- tmppar = sel_start_cursor.par;
- while (tmppar != sel_end_cursor.par) {
- if (tmppar->footnoteflag !=
- sel_end_cursor.par->footnoteflag) {
- WriteAlert(_("Impossible operation"),
- _("Don't know what to do"
- " with half floats."),
- _("sorry."));
- return;
- }
- tmppar = tmppar->Next();
- }
- }
+ // There is a problem with having the stuffing here in that the
+ // larger the selection the slower LyX will get. This can be
+ // solved by running the line below only when the selection has
+ // finished. The solution used currently just works, to make it
+ // faster we need to be more clever and probably also have more
+ // calls to stuffClipboard. (Lgb)
+ bview->stuffClipboard(selectionAsString(bview->buffer()));
- /* table stuff -- begin */
- if (sel_start_cursor.par->table || sel_end_cursor.par->table){
- if ( sel_start_cursor.par != sel_end_cursor.par){
- WriteAlert(_("Impossible operation"),
- _("Don't know what to do with half tables."),
- _("sorry."));
- return;
- }
- }
- /* table stuff -- end */
-
- // delete the simple_cut_buffer
- DeleteSimpleCutBuffer();
-
- // set the textclass
- simple_cut_buffer_textclass = buffer->params.textclass;
-
- // copy behind a space if there is one
- while (sel_start_cursor.par->Last() > sel_start_cursor.pos
- && sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos)
- && (sel_start_cursor.par != sel_end_cursor.par
- || sel_start_cursor.pos < sel_end_cursor.pos))
- sel_start_cursor.pos++;
-
- // there are two cases: copy only within one paragraph
- // or more than one paragraph
- if (sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)
- == sel_end_cursor.par->ParFromPos(sel_end_cursor.pos)) {
- // only within one paragraph
- simple_cut_buffer = new LyXParagraph;
- LyXParagraph::size_type i = 0;
- for (i = sel_start_cursor.pos; i < sel_end_cursor.pos; ++i){
- sel_start_cursor.par->CopyIntoMinibuffer(i);
- simple_cut_buffer->InsertFromMinibuffer(i - sel_start_cursor.pos);
- }
- } else {
- // copy more than one paragraph
- // clone the paragraphs within the selection
- tmppar =
- sel_start_cursor.par->ParFromPos(sel_start_cursor.pos);
- simple_cut_buffer = tmppar->Clone();
- LyXParagraph *tmppar2 = simple_cut_buffer;
-
- while (tmppar != sel_end_cursor.par->ParFromPos(sel_end_cursor.pos)
- && tmppar->next) {
- tmppar = tmppar->next;
- tmppar2->next = tmppar->Clone();
- tmppar2->next->previous = tmppar2;
- tmppar2 = tmppar2->next;
- }
- tmppar2->next = 0;
-
- // care about footnotes
- if (simple_cut_buffer->footnoteflag) {
- tmppar = simple_cut_buffer;
- while (tmppar){
- tmppar->footnoteflag =
- LyXParagraph::NO_FOOTNOTE;
- tmppar = tmppar->next;
- }
- }
-
- // the simple_cut_buffer paragraph is too big
- LyXParagraph::size_type tmpi2 =
- sel_start_cursor.par->PositionInParFromPos(sel_start_cursor.pos);
- for (; tmpi2; --tmpi2)
- simple_cut_buffer->Erase(0);
-
- // now tmppar 2 is too big, delete all after sel_end_cursor.pos
-
- tmpi2 = sel_end_cursor.par->PositionInParFromPos(sel_end_cursor.pos);
- while (tmppar2->size() > tmpi2) {
- tmppar2->Erase(tmppar2->size() - 1);
- }
- }
-}
-
-#else //////////////////////////////////////////////////////////////////////
-
-void LyXText::CopySelection()
-{
// this doesnt make sense, if there is no selection
if (!selection)
return;
// ok we have a selection. This is always between sel_start_cursor
// and sel_end cursor
LyXParagraph * tmppar;
-
+
+#ifndef NEW_INSETS
/* check wether there are half footnotes in the selection */
- if (sel_start_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
- || sel_end_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
- tmppar = sel_start_cursor.par;
- while (tmppar != sel_end_cursor.par) {
+ if (sel_start_cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE
+ || sel_end_cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
+ tmppar = sel_start_cursor.par();
+ while (tmppar != sel_end_cursor.par()) {
if (tmppar->footnoteflag !=
- sel_end_cursor.par->footnoteflag) {
+ sel_end_cursor.par()->footnoteflag) {
WriteAlert(_("Impossible operation"),
_("Don't know what to do"
" with half floats."),
tmppar = tmppar->Next();
}
}
-
+#endif
+#ifndef NEW_TABULAR
/* table stuff -- begin */
- if (sel_start_cursor.par->table || sel_end_cursor.par->table){
- if ( sel_start_cursor.par != sel_end_cursor.par){
+ if (sel_start_cursor.par()->table || sel_end_cursor.par()->table){
+ if ( sel_start_cursor.par() != sel_end_cursor.par()){
WriteAlert(_("Impossible operation"),
_("Don't know what to do with half tables."),
_("sorry."));
}
}
/* table stuff -- end */
+#endif
// copy behind a space if there is one
- while (sel_start_cursor.par->Last() > sel_start_cursor.pos
- && sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos)
- && (sel_start_cursor.par != sel_end_cursor.par
- || sel_start_cursor.pos < sel_end_cursor.pos))
- sel_start_cursor.pos++;
+ while (sel_start_cursor.par()->Last() > sel_start_cursor.pos()
+ && sel_start_cursor.par()->IsLineSeparator(sel_start_cursor.pos())
+ && (sel_start_cursor.par() != sel_end_cursor.par()
+ || sel_start_cursor.pos() < sel_end_cursor.pos()))
+ sel_start_cursor.pos(sel_start_cursor.pos() + 1);
CutAndPaste cap;
- cap.copySelection(sel_start_cursor.par, sel_end_cursor.par,
- sel_start_cursor.pos, sel_end_cursor.pos,
- buffer->params.textclass);
+ cap.copySelection(sel_start_cursor.par(), sel_end_cursor.par(),
+ sel_start_cursor.pos(), sel_end_cursor.pos(),
+ bview->buffer()->params.textclass);
}
-#endif
-#ifdef USE_OLD_CUT_AND_PASTE
-void LyXText::PasteSelection()
+
+void LyXText::PasteSelection(BufferView * bview)
{
+ CutAndPaste cap;
+
// this does not make sense, if there is nothing to paste
- if (!simple_cut_buffer)
+ if (!cap.checkPastePossible(cursor.par(), cursor.pos()))
return;
- LyXParagraph * tmppar;
- LyXParagraph * endpar;
-
- LyXCursor tmpcursor;
-
- // be carefull with footnotes in footnotes
- if (cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
-
- // check whether the cut_buffer includes a footnote
- tmppar = simple_cut_buffer;
- while (tmppar
- && tmppar->footnoteflag == LyXParagraph::NO_FOOTNOTE)
- tmppar = tmppar->next;
-
- if (tmppar) {
- WriteAlert(_("Impossible operation"),
- _("Can't paste float into float!"),
- _("Sorry."));
- return;
- }
- }
-
- /* table stuff -- begin */
- if (cursor.par->table) {
- if (simple_cut_buffer->next) {
- WriteAlert(_("Impossible operation"),
- _("Table cell cannot include more than one paragraph!"),
- _("Sorry."));
- return;
- }
- }
- /* table stuff -- end */
-
- SetUndo(Undo::INSERT,
- cursor.par->ParFromPos(cursor.pos)->previous,
- cursor.par->ParFromPos(cursor.pos)->next);
-
- tmpcursor = cursor;
-
- // There are two cases: cutbuffer only one paragraph or many
- if (!simple_cut_buffer->next) {
- // only within a paragraph
-
- tmppar = simple_cut_buffer->Clone();
- /* table stuff -- begin */
- bool table_too_small = false;
- if (tmpcursor.par->table) {
- while (simple_cut_buffer->size()
- && !table_too_small) {
- if (simple_cut_buffer->IsNewline(0)){
- while(tmpcursor.pos < tmpcursor.par->Last() && !tmpcursor.par->IsNewline(tmpcursor.pos))
- tmpcursor.pos++;
- simple_cut_buffer->Erase(0);
- if (tmpcursor.pos < tmpcursor.par->Last())
- tmpcursor.pos++;
- else
- table_too_small = true;
- } else {
- // This is an attempt to fix the
- // "never insert a space at the
- // beginning of a paragraph" problem.
- if (tmpcursor.pos == 0
- && simple_cut_buffer->IsLineSeparator(0)) {
- simple_cut_buffer->Erase(0);
- } else {
- simple_cut_buffer->CutIntoMinibuffer(0);
- simple_cut_buffer->Erase(0);
- tmpcursor.par->InsertFromMinibuffer(tmpcursor.pos);
- tmpcursor.pos++;
- }
- }
- }
- } else {
- /* table stuff -- end */
- // Some provisions should be done here for checking
- // if we are inserting at the beginning of a
- // paragraph. If there are a space at the beginning
- // of the text to insert and we are inserting at
- // the beginning of the paragraph the space should
- // be removed.
- while (simple_cut_buffer->size()) {
- // This is an attempt to fix the
- // "never insert a space at the
- // beginning of a paragraph" problem.
- if (tmpcursor.pos == 0
- && simple_cut_buffer->IsLineSeparator(0)) {
- simple_cut_buffer->Erase(0);
- } else {
- simple_cut_buffer->CutIntoMinibuffer(0);
- simple_cut_buffer->Erase(0);
- tmpcursor.par->InsertFromMinibuffer(tmpcursor.pos);
- tmpcursor.pos++;
- }
- }
- }
- delete simple_cut_buffer;
- simple_cut_buffer = tmppar;
- endpar = tmpcursor.par->Next();
- } else {
- // many paragraphs
- CutAndPaste cap;
-
- // make a copy of the simple cut_buffer
- tmppar = simple_cut_buffer;
- LyXParagraph * simple_cut_clone = tmppar->Clone();
- LyXParagraph * tmppar2 = simple_cut_clone;
- if (cursor.par->footnoteflag){
- tmppar->footnoteflag = cursor.par->footnoteflag;
- tmppar->footnotekind = cursor.par->footnotekind;
- }
- while (tmppar->next) {
- tmppar = tmppar->next;
- tmppar2->next = tmppar->Clone();
- tmppar2->next->previous = tmppar2;
- tmppar2 = tmppar2->next;
- if (cursor.par->footnoteflag){
- tmppar->footnoteflag = cursor.par->footnoteflag;
- tmppar->footnotekind = cursor.par->footnotekind;
- }
- }
-
- // make sure there is no class difference
- cap.SwitchLayoutsBetweenClasses(simple_cut_buffer_textclass,
- buffer->params.textclass,
- simple_cut_buffer);
-
- // make the simple_cut_buffer exactly the same layout than
- // the cursor paragraph
- simple_cut_buffer->MakeSameLayout(cursor.par);
-
- // find the end of the buffer
- LyXParagraph * lastbuffer = simple_cut_buffer;
- while (lastbuffer->Next())
- lastbuffer = lastbuffer->Next();
-
- bool paste_the_end = false;
-
- // open the paragraph for inserting the simple_cut_buffer
- // if necessary
- if (cursor.par->Last() > cursor.pos || !cursor.par->Next()){
- cursor.par->BreakParagraphConservative(cursor.pos);
- paste_the_end = true;
- }
+ SetUndo(bview->buffer(), Undo::INSERT,
+ cursor.par()->ParFromPos(cursor.pos())->previous,
+ cursor.par()->ParFromPos(cursor.pos())->next);
- // set the end for redoing later
- endpar = cursor.par->ParFromPos(cursor.pos)->next->Next();
-
- // paste it!
- lastbuffer->ParFromPos(lastbuffer->Last())->next =
- cursor.par->ParFromPos(cursor.pos)->next;
- cursor.par->ParFromPos(cursor.pos)->next->previous =
- lastbuffer->ParFromPos(lastbuffer->Last());
-
- cursor.par->ParFromPos(cursor.pos)->next = simple_cut_buffer;
- simple_cut_buffer->previous =
- cursor.par->ParFromPos(cursor.pos);
-
- if (cursor.par->ParFromPos(cursor.pos)->Next() == lastbuffer)
- lastbuffer = cursor.par;
-
- cursor.par->ParFromPos(cursor.pos)->PasteParagraph();
-
- // store the new cursor position
- tmpcursor.par = lastbuffer;
- tmpcursor.pos = lastbuffer->Last();
-
- // maybe some pasting
- if (lastbuffer->Next() && paste_the_end) {
- if (lastbuffer->Next()->HasSameLayout(lastbuffer)) {
- lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph();
-
- } else if (!lastbuffer->Next()->Last()) {
- lastbuffer->Next()->MakeSameLayout(lastbuffer);
- lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph();
-
- } else if (!lastbuffer->Last()) {
- lastbuffer->MakeSameLayout(lastbuffer->next);
- lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph();
-
- } else
- lastbuffer->Next()->ClearParagraph();
- }
-
- // restore the simple cut buffer
- simple_cut_buffer = simple_cut_clone;
- }
+ LyXParagraph * endpar;
+ LyXParagraph * actpar = cursor.par();
- RedoParagraphs(cursor, endpar);
+ int pos = cursor.pos();
+ cap.pasteSelection(&actpar, &endpar, pos, bview->buffer()->params.textclass);
- SetCursor(cursor.par, cursor.pos);
+ RedoParagraphs(bview, cursor, endpar);
+
+ SetCursor(bview, cursor.par(), cursor.pos());
ClearSelection();
sel_cursor = cursor;
- SetCursor(tmpcursor.par, tmpcursor.pos);
+ SetCursor(bview, actpar, pos);
SetSelection();
- UpdateCounters(cursor.row);
+ UpdateCounters(bview, cursor.row());
}
-#else ////////////////////////////////////////////////////////////////////
-
-void LyXText::PasteSelection()
-{
- CutAndPaste cap;
-
- // this does not make sense, if there is nothing to paste
- if (!cap.checkPastePossible(cursor.par, cursor.pos))
- return;
-
- SetUndo(Undo::INSERT,
- cursor.par->ParFromPos(cursor.pos)->previous,
- cursor.par->ParFromPos(cursor.pos)->next);
-
- LyXParagraph *endpar;
- LyXParagraph *actpar = cursor.par;
- int endpos = cursor.pos;
-
- cap.pasteSelection(&actpar, &endpar, endpos, buffer->params.textclass);
-
- RedoParagraphs(cursor, endpar);
-
- SetCursor(cursor.par, cursor.pos);
- ClearSelection();
-
- sel_cursor = cursor;
- SetCursor(actpar, endpos);
- SetSelection();
- UpdateCounters(cursor.row);
-}
-#endif
// returns a pointer to the very first LyXParagraph
LyXParagraph * LyXText::FirstParagraph() const
{
- return buffer->paragraph;
+ return OwnerParagraph();
}
// sets the selection over the number of characters of string, no check!!
-void LyXText::SetSelectionOverString(char const * string)
+void LyXText::SetSelectionOverString(BufferView * bview, char const * string)
{
sel_cursor = cursor;
for (int i = 0; string[i]; ++i)
- CursorRight();
+ CursorRight(bview);
SetSelection();
}
// simple replacing. The font of the first selected character is used
-void LyXText::ReplaceSelectionWithString(char const * str)
+void LyXText::ReplaceSelectionWithString(BufferView * bview, char const * str)
{
- SetCursorParUndo();
+ SetCursorParUndo(bview->buffer());
FreezeUndo();
if (!selection) { // create a dummy selection
}
// Get font setting before we cut
- LyXParagraph::size_type pos = sel_end_cursor.pos;
- LyXFont font = sel_start_cursor.par->GetFontSettings(sel_start_cursor.pos);
+ LyXParagraph::size_type pos = sel_end_cursor.pos();
+ LyXFont font = sel_start_cursor.par()->GetFontSettings(bview->buffer()->params,
+ sel_start_cursor.pos());
// Insert the new string
for (int i = 0; str[i]; ++i) {
- sel_end_cursor.par->InsertChar(pos, str[i]);
- sel_end_cursor.par->SetFont(pos, font);
+ sel_end_cursor.par()->InsertChar(pos, str[i], font);
++pos;
}
// Cut the selection
- CutSelection();
+ CutSelection(bview);
UnFreezeUndo();
}
// if the string can be found: return true and set the cursor to
// the new position
-bool LyXText::SearchForward(char const * str) const
+bool LyXText::SearchForward(BufferView * bview, char const * str) const
{
- LyXParagraph * par = cursor.par;
- LyXParagraph::size_type pos = cursor.pos;
+ LyXParagraph * par = cursor.par();
+ LyXParagraph::size_type pos = cursor.pos();
while (par && !IsStringInText(par, pos, str)) {
if (pos < par->Last() - 1)
++pos;
}
}
if (par) {
- SetCursor(par, pos);
+ SetCursor(bview, par, pos);
return true;
}
else
}
-bool LyXText::SearchBackward(char const * string) const
+bool LyXText::SearchBackward(BufferView * bview, char const * string) const
{
- LyXParagraph * par = cursor.par;
- int pos = cursor.pos;
+ LyXParagraph * par = cursor.par();
+ int pos = cursor.pos();
do {
if (pos > 0)
} while (par && !IsStringInText(par, pos, string));
if (par) {
- SetCursor(par, pos);
+ SetCursor(bview, par, pos);
return true;
} else
return false;
// needed to insert the selection
-void LyXText::InsertStringA(string const & str)
+void LyXText::InsertStringA(BufferView * bview, string const & str)
{
- LyXParagraph * par = cursor.par;
- LyXParagraph::size_type pos = cursor.pos;
+ LyXParagraph * par = cursor.par();
+ LyXParagraph::size_type pos = cursor.pos();
LyXParagraph::size_type a = 0;
int cell = 0;
- LyXParagraph * endpar = cursor.par->Next();
+ LyXParagraph * endpar = cursor.par()->Next();
- SetCursorParUndo();
+ SetCursorParUndo(bview->buffer());
bool flag =
- textclasslist.Style(buffer->params.textclass,
- cursor.par->GetLayout()).isEnvironment();
+ textclasslist.Style(bview->buffer()->params.textclass,
+ cursor.par()->GetLayout()).isEnvironment();
// only to be sure, should not be neccessary
ClearSelection();
if (str[i] == ' '
&& i + 1 < str.length() && str[i + 1] != ' '
&& pos && par->GetChar(pos - 1)!= ' ') {
- par->InsertChar(pos,' ');
- par->SetFont(pos, current_font);
+ par->InsertChar(pos, ' ', current_font);
++pos;
+#ifndef NEW_TABLAR
} else if (par->table) {
if (str[i] == '\t') {
while((pos < par->size()) &&
break;
} else if ((str[i] != 13) &&
((str[i] & 127) >= ' ')) {
- par->InsertChar(pos, str[i]);
- par->SetFont(pos, current_font);
+ par->InsertChar(pos, str[i],
+ current_font);
++pos;
}
+#endif
} else if (str[i] == ' ') {
InsetSpecialChar * new_inset =
new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR);
if (par->InsertInsetAllowed(new_inset)) {
- par->InsertChar(pos, LyXParagraph::META_INSET);
- par->SetFont(pos, current_font);
- par->InsertInset(pos, new_inset);
+ par->InsertInset(pos, new_inset,
+ current_font);
} else {
delete new_inset;
}
InsetSpecialChar * new_inset =
new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR);
if (par->InsertInsetAllowed(new_inset)) {
- par->InsertChar(pos, LyXParagraph::META_INSET);
- par->SetFont(pos, current_font);
- par->InsertInset(pos, new_inset);
+ par->InsertInset(pos, new_inset,
+ current_font);
} else {
delete new_inset;
}
} else if (str[i] != 13 &&
// Ignore unprintables
(str[i] & 127) >= ' ') {
- par->InsertChar(pos, str[i]);
- par->SetFont(pos, current_font);
+ par->InsertChar(pos, str[i], current_font);
++pos;
}
} else {
+#ifndef NEW_TABULAR
if (par->table) {
- if (i + 1 >= str.length()) {
- ++pos;
+ if ((i + 1) >= str.length()) {
+ if (pos < par->size())
+ ++pos;
break;
}
while((pos < par->size()) &&
// no more fields to fill skip the rest
break;
} else {
+#endif
if (!par->size()) { // par is empty
InsetSpecialChar * new_inset =
new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR);
if (par->InsertInsetAllowed(new_inset)) {
- par->InsertChar(pos, LyXParagraph::META_INSET);
- par->SetFont(pos, current_font);
- par->InsertInset(pos, new_inset);
+ par->InsertInset(pos,
+ new_inset,
+ current_font);
} else {
delete new_inset;
}
++pos;
}
- par->BreakParagraph(pos, flag);
+ par->BreakParagraph(bview->buffer()->params, pos, flag);
par = par->Next();
pos = 0;
+#ifndef NEW_TABULAR
}
+#endif
}
++i;
}
- RedoParagraphs(cursor, endpar);
- SetCursor(cursor.par, cursor.pos);
+ RedoParagraphs(bview, cursor, endpar);
+ SetCursor(bview, cursor.par(), cursor.pos());
sel_cursor = cursor;
- SetCursor(par, pos);
+ SetCursor(bview, par, pos);
SetSelection();
}
* that are ignored .Double spaces are also converted into one. Spaces at
* the beginning of a paragraph are forbidden. tabs are converted into one
* space. then InsertStringA is called */
-void LyXText::InsertStringB(string const & s)
+void LyXText::InsertStringB(BufferView * bview, string const & s)
{
string str(s);
- LyXParagraph * par = cursor.par;
+ LyXParagraph * par = cursor.par();
string::size_type i = 1;
while (i < str.length()) {
if (str[i] == '\t' && !par->table)
}
++i;
}
- InsertStringA(str);
+ InsertStringA(bview, str);
}
-bool LyXText::GotoNextError() const
+bool LyXText::GotoNextError(BufferView * bview) const
{
LyXCursor res = cursor;
do {
- if (res.pos < res.par->Last() - 1) {
- res.pos++;
- }
- else {
- res.par = res.par->Next();
- res.pos = 0;
+ if (res.pos() < res.par()->Last() - 1) {
+ res.pos(res.pos() + 1);
+ } else {
+ res.par(res.par()->Next());
+ res.pos(0);
}
- } while (res.par &&
- !(res.par->GetChar(res.pos) == LyXParagraph::META_INSET
- && res.par->GetInset(res.pos)->AutoDelete()));
+ } while (res.par() &&
+ !(res.par()->GetChar(res.pos()) == LyXParagraph::META_INSET
+ && res.par()->GetInset(res.pos())->AutoDelete()));
- if (res.par) {
- SetCursor(res.par, res.pos);
+ if (res.par()) {
+ SetCursor(bview, res.par(), res.pos());
return true;
}
return false;
}
-bool LyXText::GotoNextNote() const
+bool LyXText::GotoNextNote(BufferView * bview) const
{
LyXCursor res = cursor;
do {
- if (res.pos < res.par->Last() - 1) {
- res.pos++;
+ if (res.pos() < res.par()->Last() - 1) {
+ res.pos(res.pos() + 1);
} else {
- res.par = res.par->Next();
- res.pos = 0;
+ res.par(res.par()->Next());
+ res.pos(0);
}
- } while (res.par &&
- !(res.par->GetChar(res.pos) == LyXParagraph::META_INSET
- && res.par->GetInset(res.pos)->LyxCode() == Inset::IGNORE_CODE));
+ } while (res.par() &&
+ !(res.par()->GetChar(res.pos()) == LyXParagraph::META_INSET
+ && res.par()->GetInset(res.pos())->LyxCode() == Inset::IGNORE_CODE));
- if (res.par) {
- SetCursor(res.par, res.pos);
+ if (res.par()) {
+ SetCursor(bview, res.par(), res.pos());
return true;
}
return false;
}
-void LyXText::CheckParagraph(LyXParagraph * par,
+void LyXText::CheckParagraph(BufferView * bview, LyXParagraph * par,
LyXParagraph::size_type pos)
{
LyXCursor tmpcursor;
-
+#ifndef NEW_TABULAR
/* table stuff -- begin*/
if (par->table) {
- CheckParagraphInTable(par, pos);
+ CheckParagraphInTable(bview, par, pos);
}
else {
+#endif
/* table stuff -- end*/
long y = 0;
Row * row = GetRow(par, pos, y);
// is there a break one row above
- if (row->previous && row->previous->par == row->par) {
- z = NextBreakPoint(row->previous, paperwidth);
- if ( z >= row->pos) {
+ if (row->previous() && row->previous()->par() == row->par()) {
+ z = NextBreakPoint(bview, row->previous(), workWidth(bview));
+ if ( z >= row->pos()) {
// set the dimensions of the row above
- y -= row->previous->height;
+ y -= row->previous()->height();
refresh_y = y;
- refresh_row = row->previous;
+ refresh_row = row->previous();
status = LyXText::NEED_MORE_REFRESH;
- BreakAgain(row->previous);
+ BreakAgain(bview, row->previous());
// set the cursor again. Otherwise
// dangling pointers are possible
- SetCursor(cursor.par, cursor.pos);
+ SetCursor(bview, cursor.par(), cursor.pos());
sel_cursor = cursor;
return;
}
}
- int tmpheight = row->height;
+ int tmpheight = row->height();
LyXParagraph::size_type tmplast = RowLast(row);
refresh_y = y;
refresh_row = row;
- BreakAgain(row);
- if (row->height == tmpheight && RowLast(row) == tmplast)
+ BreakAgain(bview, row);
+ if (row->height() == tmpheight && RowLast(row) == tmplast)
status = LyXText::NEED_VERY_LITTLE_REFRESH;
else
status = LyXText::NEED_MORE_REFRESH;
// check the special right address boxes
- if (textclasslist.Style(buffer->params.textclass,
+ if (textclasslist.Style(bview->buffer()->params.textclass,
par->GetLayout()).margintype
== MARGIN_RIGHT_ADDRESS_BOX) {
- tmpcursor.par = par;
- tmpcursor.row = row;
- tmpcursor.y = y;
- tmpcursor.x = 0;
- tmpcursor.x_fix = 0;
- tmpcursor.pos = pos;
- RedoDrawingOfParagraph(tmpcursor);
+ tmpcursor.par(par);
+ tmpcursor.row(row);
+ tmpcursor.y(y);
+ tmpcursor.x(0);
+ tmpcursor.x_fix(0);
+ tmpcursor.pos(pos);
+ RedoDrawingOfParagraph(bview, tmpcursor);
}
-
+#ifndef NEW_TABULAR
}
+#endif
// set the cursor again. Otherwise dangling pointers are possible
// also set the selection
if (selection) {
tmpcursor = cursor;
- SetCursorIntern(sel_cursor.par, sel_cursor.pos);
+ SetCursorIntern(bview, sel_cursor.par(), sel_cursor.pos());
sel_cursor = cursor;
- SetCursorIntern(sel_start_cursor.par, sel_start_cursor.pos);
+ SetCursorIntern(bview, sel_start_cursor.par(),
+ sel_start_cursor.pos());
sel_start_cursor = cursor;
- SetCursorIntern(sel_end_cursor.par, sel_end_cursor.pos);
+ SetCursorIntern(bview, sel_end_cursor.par(),
+ sel_end_cursor.pos());
sel_end_cursor = cursor;
- SetCursorIntern(last_sel_cursor.par, last_sel_cursor.pos);
+ SetCursorIntern(bview, last_sel_cursor.par(),
+ last_sel_cursor.pos());
last_sel_cursor = cursor;
cursor = tmpcursor;
}
- SetCursorIntern(cursor.par, cursor.pos);
+ SetCursorIntern(bview, cursor.par(), cursor.pos());
}
-// returns 0 if inset wasn't found
-int LyXText::UpdateInset(Inset * inset)
+// returns false if inset wasn't found
+bool LyXText::UpdateInset(BufferView * bview, Inset * inset)
{
// first check the current paragraph
- int pos = cursor.par->GetPositionOfInset(inset);
+ int pos = cursor.par()->GetPositionOfInset(inset);
if (pos != -1){
- CheckParagraph(cursor.par, pos);
- return 1;
+ CheckParagraph(bview, cursor.par(), pos);
+ return true;
}
// check every paragraph
if (par->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE){
pos = par->GetPositionOfInset(inset);
if (pos != -1){
- CheckParagraph(par, pos);
- return 1;
+ CheckParagraph(bview, par, pos);
+ return true;
}
}
par = par->Next();
} while (par);
- return 0;
+ return false;
}
-void LyXText::SetCursor(LyXParagraph * par,
- LyXParagraph::size_type pos, bool setfont) const
+void LyXText::SetCursor(BufferView * bview, LyXParagraph * par,
+ LyXParagraph::size_type pos,
+ bool setfont, bool boundary) const
{
LyXCursor old_cursor = cursor;
- SetCursorIntern(par, pos, setfont);
- DeleteEmptyParagraphMechanism(old_cursor);
+ SetCursorIntern(bview, par, pos, setfont, boundary);
+ DeleteEmptyParagraphMechanism(bview, old_cursor);
}
-void LyXText::SetCursor(LyXCursor & cur, LyXParagraph * par,
- LyXParagraph::size_type pos) const
+void LyXText::SetCursor(BufferView *bview, LyXCursor & cur, LyXParagraph * par,
+ LyXParagraph::size_type pos, bool boundary) const
{
// correct the cursor position if impossible
if (pos > par->Last()){
pos = par->PositionInParFromPos(pos);
par = tmppar;
}
+#ifndef NEW_INSETS
if (par->IsDummy() && par->previous &&
par->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) {
while (par->previous &&
}
pos += par->size() + 1;
}
-
- cur.par = par;
- cur.pos = pos;
+#endif
+ cur.par(par);
+ cur.pos(pos);
+ cur.boundary(boundary);
/* get the cursor y position in text */
long y = 0;
Row * row = GetRow(par, pos, y);
/* y is now the beginning of the cursor row */
- y += row->baseline;
+ y += row->baseline();
/* y is now the cursor baseline */
- cur.y = y;
+ cur.y(y);
/* now get the cursors x position */
float x;
float fill_separator, fill_hfill, fill_label_hfill;
- PrepareToPrint(row, x, fill_separator, fill_hfill, fill_label_hfill);
- LyXParagraph::size_type cursor_vpos;
+ PrepareToPrint(bview, row, x, fill_separator, fill_hfill,
+ fill_label_hfill);
+ LyXParagraph::size_type cursor_vpos = 0;
LyXParagraph::size_type last = RowLastPrintable(row);
if (pos > last + 1) // This shouldn't happen.
- pos = last+1;
-
- if (last < row->pos)
- cursor_vpos = 0;
- else if ((pos > last) ||
- ((pos - 1 >= row->pos) &&
- (row->par->IsSeparator(pos) ||
- (row->par->table && row->par->IsNewline(pos)))))
- /// Place cursor after char at (logical) position pos-1
- cursor_vpos = !(bidi_level(pos-1) % 2)
- ? log2vis(pos-1) + 1 : log2vis(pos-1);
+ pos = last + 1;
+ else if (pos < row->pos())
+ pos = row->pos();
+
+ if (last < row->pos())
+ cursor_vpos = row->pos();
+ else if (pos > last && !boundary)
+ cursor_vpos = (row->par()->isRightToLeftPar(bview->buffer()->params))
+ ? row->pos() : last + 1;
+ else if (pos > row->pos() &&
+ (pos > last || boundary ||
+ (row->par()->table && row->par()->IsNewline(pos))))
+ /// Place cursor after char at (logical) position pos - 1
+ cursor_vpos = (bidi_level(pos - 1) % 2 == 0)
+ ? log2vis(pos - 1) + 1 : log2vis(pos - 1);
else
/// Place cursor before char at (logical) position pos
- cursor_vpos = !(bidi_level(pos) % 2)
+ cursor_vpos = (bidi_level(pos) % 2 == 0)
? log2vis(pos) : log2vis(pos) + 1;
+#ifndef NEW_TABULAR
/* table stuff -- begin*/
- if (row->par->table) {
- int cell = NumberOfCell(row->par, row->pos);
+ if (row->par()->table) {
+ int cell = NumberOfCell(row->par(), row->pos());
float x_old = x;
- x += row->par->table->GetBeginningOfTextInCell(cell);
- for (LyXParagraph::size_type vpos = row->pos;
+ x += row->par()->table->GetBeginningOfTextInCell(cell);
+ for (LyXParagraph::size_type vpos = row->pos();
vpos < cursor_vpos; ++vpos) {
pos = vis2log(vpos);
- if (row->par->IsNewline(pos)) {
- x = x_old + row->par->table->WidthOfColumn(cell);
+ if (row->par()->IsNewline(pos)) {
+ x = x_old + row->par()->table->WidthOfColumn(cell);
x_old = x;
++cell;
- x += row->par->table->GetBeginningOfTextInCell(cell);
+ x += row->par()->table->GetBeginningOfTextInCell(cell);
} else {
- x += SingleWidth(row->par, pos);
+ x += SingleWidth(bview, row->par(), pos);
}
}
} else {
/* table stuff -- end*/
+#endif
LyXParagraph::size_type main_body =
- BeginningOfMainBody(row->par);
+ BeginningOfMainBody(bview->buffer(), row->par());
if ((main_body > 0) &&
((main_body-1 > last) ||
- !row->par->IsLineSeparator(main_body-1)))
+ !row->par()->IsLineSeparator(main_body-1)))
main_body = 0;
- for (LyXParagraph::size_type vpos = row->pos;
+ for (LyXParagraph::size_type vpos = row->pos();
vpos < cursor_vpos; ++vpos) {
pos = vis2log(vpos);
if (main_body > 0 && pos == main_body-1) {
x += fill_label_hfill +
lyxfont::width(textclasslist.Style(
- buffer->params.textclass,
- row->par->GetLayout())
+ bview->buffer()->params.textclass,
+ row->par()->GetLayout())
.labelsep,
- GetFont(row->par, -2));
- if (row->par->IsLineSeparator(main_body-1))
- x -= SingleWidth(row->par,main_body-1);
+ GetFont(bview->buffer(), row->par(), -2));
+ if (row->par()->IsLineSeparator(main_body-1))
+ x -= SingleWidth(bview, row->par(),main_body-1);
}
- if (HfillExpansion(row, pos)) {
- x += SingleWidth(row->par, pos);
+ if (HfillExpansion(bview->buffer(), row, pos)) {
+ x += SingleWidth(bview, row->par(), pos);
if (pos >= main_body)
x += fill_hfill;
else
x += fill_label_hfill;
- } else if (row->par->IsSeparator(pos)) {
- x += SingleWidth(row->par, pos);
+ } else if (row->par()->IsSeparator(pos)) {
+ x += SingleWidth(bview, row->par(), pos);
if (pos >= main_body)
x += fill_separator;
} else
- x += SingleWidth(row->par, pos);
+ x += SingleWidth(bview, row->par(), pos);
}
+#ifndef NEW_TABULAR
}
+#endif
- cur.x = int(x);
- cur.x_fix = cur.x;
- cur.row = row;
+ cur.x(int(x));
+ cur.x_fix(cur.x());
+ cur.row(row);
}
-void LyXText::SetCursorIntern(LyXParagraph * par,
- LyXParagraph::size_type pos, bool setfont) const
+void LyXText::SetCursorIntern(BufferView * bview, LyXParagraph * par,
+ LyXParagraph::size_type pos,
+ bool setfont, bool boundary) const
{
- SetCursor(cursor, par, pos);
-#warning Remove this when verified working (Jug 20000413)
-#if 0
- // correct the cursor position if impossible
- if (pos > par->Last()){
- LyXParagraph * tmppar = par->ParFromPos(pos);
- pos = par->PositionInParFromPos(pos);
- par = tmppar;
- }
- if (par->IsDummy() && par->previous &&
- par->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) {
- while (par->previous &&
- ((par->previous->IsDummy() && par->previous->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) ||
- (par->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE))) {
- par = par->previous ;
- if (par->IsDummy() &&
- par->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE)
- pos += par->size() + 1;
- }
- if (par->previous) {
- par = par->previous;
- }
- pos += par->size() + 1;
- }
-
- cursor.par = par;
- cursor.pos = pos;
-
- /* get the cursor y position in text */
- long y = 0;
- Row * row = GetRow(par, pos, y);
- /* y is now the beginning of the cursor row */
- y += row->baseline;
- /* y is now the cursor baseline */
- cursor.y = y;
-
- /* now get the cursors x position */
- float x;
- float fill_separator, fill_hfill, fill_label_hfill;
- PrepareToPrint(row, x, fill_separator, fill_hfill, fill_label_hfill);
- LyXParagraph::size_type cursor_vpos;
- LyXParagraph::size_type last = RowLastPrintable(row);
-
- if (pos > last + 1) // This shouldn't happen.
- pos = last+1;
-
- if (last < row->pos)
- cursor_vpos = 0;
- else if (pos > last ||
- (pos - 1 >= row->pos &&
- (row->par->IsSeparator(pos) ||
- (row->par->table && row->par->IsNewline(pos))
- )))
- /// Place cursor after char at (logical) position pos-1
- cursor_vpos = (bidi_level(pos-1) % 2 == 0)
- ? log2vis(pos-1) + 1 : log2vis(pos-1);
- else
- /// Place cursor before char at (logical) position pos
- cursor_vpos = (bidi_level(pos) % 2 == 0)
- ? log2vis(pos) : log2vis(pos) + 1;
+ SetCursor(bview, cursor, par, pos, boundary);
+ if (setfont)
+ SetCurrentFont(bview);
+}
- /* table stuff -- begin*/
- if (row->par->table) {
- int cell = NumberOfCell(row->par, row->pos);
- float x_old = x;
- x += row->par->table->GetBeginningOfTextInCell(cell);
- for (LyXParagraph::size_type vpos = row->pos; vpos < cursor_vpos; ++vpos) {
- pos = vis2log(vpos);
- if (row->par->IsNewline(pos)) {
- x = x_old + row->par->table->WidthOfColumn(cell);
- x_old = x;
- ++cell;
- x += row->par->table->GetBeginningOfTextInCell(cell);
- } else {
- x += SingleWidth(row->par, pos);
- }
- }
- } else {
- /* table stuff -- end*/
- LyXParagraph::size_type main_body =
- BeginningOfMainBody(row->par);
- if (main_body > 0 &&
- (main_body-1 > last ||
- !row->par->IsLineSeparator(main_body-1)))
- main_body = 0;
+void LyXText::SetCurrentFont(BufferView * bview) const
+{
+ LyXParagraph::size_type pos = cursor.pos();
+ if (cursor.boundary() && pos > 0)
+ --pos;
- for (LyXParagraph::size_type vpos = row->pos; vpos < cursor_vpos; ++vpos) {
- pos = vis2log(vpos);
- if (main_body > 0 && pos == main_body-1) {
- x += fill_label_hfill +
- lyxfont::width(textclasslist
- .Style(buffer->params.textclass,
- row->par->GetLayout())
- .labelsep,
- GetFont(row->par, -2));
- if (row->par->IsLineSeparator(main_body-1))
- x -= SingleWidth(row->par, main_body-1);
- }
- if (HfillExpansion(row, pos)) {
- x += SingleWidth(row->par, pos);
- if (pos >= main_body)
- x += fill_hfill;
- else
- x += fill_label_hfill;
- }
- else if (row->par->IsSeparator(pos)) {
- x += SingleWidth(row->par, pos);
- if (pos >= main_body)
- x += fill_separator;
- } else
- x += SingleWidth(row->par, pos);
- }
- }
-
- cursor.x = int(x);
-
- cursor.x_fix = cursor.x;
- cursor.row = row;
-#endif
- if (setfont) {
- if (cursor.pos &&
- (cursor.pos == cursor.par->Last() || cursor.par->IsSeparator(cursor.pos)
- || (cursor.par->table && cursor.par->IsNewline(cursor.pos))
- )) {
- current_font = cursor.par->GetFontSettings(cursor.pos - 1);
- real_current_font = GetFont(cursor.par, cursor.pos - 1);
- } else {
- current_font = cursor.par->GetFontSettings(cursor.pos);
- real_current_font = GetFont(cursor.par, cursor.pos);
+ if (pos > 0) {
+ if (pos == cursor.par()->Last() ||
+ (cursor.par()->table && cursor.par()->IsNewline(pos)))
+ --pos;
+ else if (cursor.par()->IsSeparator(pos)) {
+ if (pos > cursor.row()->pos() &&
+ bidi_level(pos) % 2 ==
+ bidi_level(pos - 1) % 2)
+ --pos;
+ else if (pos + 1 < cursor.par()->Last())
+ ++pos;
}
}
+
+ current_font =
+ cursor.par()->GetFontSettings(bview->buffer()->params, pos);
+ real_current_font = GetFont(bview->buffer(), cursor.par(), pos);
}
-void LyXText::SetCursorFromCoordinates(int x, long y) const
+void LyXText::SetCursorFromCoordinates(BufferView * bview, int x, long y) const
{
LyXCursor old_cursor = cursor;
/* get the row first */
Row * row = GetRowNearY(y);
-
- cursor.par = row->par;
-
- int column = GetColumnNearX(row, x);
- cursor.pos = row->pos + column;
- cursor.x = x;
- cursor.y = y + row->baseline;
-
- cursor.row = row;
-
- if (cursor.pos &&
- (cursor.pos == cursor.par->Last()
- || cursor.par->IsSeparator(cursor.pos)
- || (cursor.pos && cursor.pos == BeginningOfMainBody(cursor.par)
- && !cursor.par->IsSeparator(cursor.pos))
- || (cursor.par->table && cursor.par->IsNewline(cursor.pos))
- )) {
- current_font = cursor.par->GetFontSettings(cursor.pos - 1);
- real_current_font = GetFont(cursor.par, cursor.pos - 1);
- } else {
- current_font = cursor.par->GetFontSettings(cursor.pos);
- real_current_font = GetFont(cursor.par, cursor.pos);
- }
- DeleteEmptyParagraphMechanism(old_cursor);
+ cursor.par(row->par());
+
+ bool bound = false;
+ int column = GetColumnNearX(bview, row, x, bound);
+ cursor.pos(row->pos() + column);
+ cursor.x(x);
+ cursor.y(y + row->baseline());
+ cursor.row(row);
+ cursor.boundary(bound);
+ SetCurrentFont(bview);
+ DeleteEmptyParagraphMechanism(bview, old_cursor);
}
-void LyXText::SetCursorFromCoordinates(LyXCursor & cur, int x, long y) const
+
+void LyXText::SetCursorFromCoordinates(BufferView * bview, LyXCursor & cur,
+ int x, long y) const
{
/* get the row first */
Row * row = GetRowNearY(y);
- int column = GetColumnNearX(row, x);
+ bool bound = false;
+ int column = GetColumnNearX(bview, row, x, bound);
- cur.par = row->par;
- cur.pos = row->pos + column;
- cur.x = x;
- cur.y = y + row->baseline;
- cur.row = row;
+ cur.par(row->par());
+ cur.pos(row->pos() + column);
+ cur.x(x);
+ cur.y(y + row->baseline());
+ cur.row(row);
+ cur.boundary(bound);
}
-void LyXText::CursorLeft() const
+void LyXText::CursorLeft(BufferView * bview, bool internal) const
{
- CursorLeftIntern();
- if (cursor.par->table) {
- int cell = NumberOfCell(cursor.par, cursor.pos);
- if (cursor.par->table->IsContRow(cell) &&
- cursor.par->table->CellHasContRow(cursor.par->table->GetCellAbove(cell)) < 0) {
- CursorUp();
+ CursorLeftIntern(bview, internal);
+#ifndef NEW_TABULAR
+ if (cursor.par()->table) {
+ int cell = NumberOfCell(cursor.par(), cursor.pos());
+ if (cursor.par()->table->IsContRow(cell)
+ && cursor.par()->table->CellHasContRow(cursor.par()->table->GetCellAbove(cell)) < 0) {
+ CursorUp(bview);
}
}
+#endif
}
-void LyXText::CursorLeftIntern() const
+void LyXText::CursorLeftIntern(BufferView * bview, bool internal) const
{
- if (cursor.pos > 0) {
- SetCursor(cursor.par, cursor.pos - 1);
- }
- else if (cursor.par->Previous()) { // steps into the above paragraph.
- SetCursor(cursor.par->Previous(), cursor.par->Previous()->Last());
+ if (cursor.pos() > 0) {
+ bool boundary = cursor.boundary();
+ SetCursor(bview, cursor.par(), cursor.pos() - 1, true, false);
+ if (!internal && !boundary &&
+ IsBoundary(bview->buffer(), cursor.par(), cursor.pos() + 1))
+ SetCursor(bview, cursor.par(), cursor.pos() + 1, true, true);
+ } else if (cursor.par()->Previous()) { // steps into the above paragraph.
+ LyXParagraph * par = cursor.par()->Previous();
+ LyXParagraph::size_type pos = par->Last();
+ SetCursor(bview, par, pos);
+ if (IsBoundary(bview->buffer(), par, pos))
+ SetCursor(bview, par, pos, false, true);
}
}
-void LyXText::CursorRight() const
+void LyXText::CursorRight(BufferView * bview, bool internal) const
{
- CursorRightIntern();
- if (cursor.par->table) {
- int cell = NumberOfCell(cursor.par, cursor.pos);
- if (cursor.par->table->IsContRow(cell) &&
- cursor.par->table->CellHasContRow(cursor.par->table->GetCellAbove(cell))<0) {
- CursorUp();
+ CursorRightIntern(bview, internal);
+#ifndef NEW_TABULAR
+ if (cursor.par()->table) {
+ int cell = NumberOfCell(cursor.par(), cursor.pos());
+ if (cursor.par()->table->IsContRow(cell) &&
+ cursor.par()->table->CellHasContRow(cursor.par()->table->GetCellAbove(cell))<0) {
+ CursorUp(bview);
}
}
+#endif
}
-void LyXText::CursorRightIntern() const
+void LyXText::CursorRightIntern(BufferView * bview, bool internal) const
{
- if (cursor.pos < cursor.par->Last()) {
- SetCursor(cursor.par, cursor.pos + 1);
- }
- else if (cursor.par->Next()) {
- SetCursor(cursor.par->Next(), 0);
- }
+ if (cursor.pos() < cursor.par()->Last()) {
+ if (!internal && cursor.boundary() &&
+ (!cursor.par()->table || !cursor.par()->IsNewline(cursor.pos())))
+ SetCursor(bview, cursor.par(), cursor.pos(), true, false);
+ else {
+ SetCursor(bview, cursor.par(), cursor.pos() + 1, true, false);
+ if (!internal && IsBoundary(bview->buffer(), cursor.par(), cursor.pos()))
+ SetCursor(bview, cursor.par(), cursor.pos(), true, true);
+ }
+ } else if (cursor.par()->Next())
+ SetCursor(bview, cursor.par()->Next(), 0);
}
-void LyXText::CursorUp() const
+void LyXText::CursorUp(BufferView * bview) const
{
- SetCursorFromCoordinates(cursor.x_fix,
- cursor.y - cursor.row->baseline - 1);
- if (cursor.par->table) {
- int cell = NumberOfCell(cursor.par, cursor.pos);
- if (cursor.par->table->IsContRow(cell) &&
- cursor.par->table->CellHasContRow(cursor.par->table->GetCellAbove(cell))<0) {
- CursorUp();
+ SetCursorFromCoordinates(bview, cursor.x_fix(),
+ cursor.y() - cursor.row()->baseline() - 1);
+#ifndef NEW_TABULAR
+ if (cursor.par()->table) {
+ int cell = NumberOfCell(cursor.par(), cursor.pos());
+ if (cursor.par()->table->IsContRow(cell) &&
+ cursor.par()->table->CellHasContRow(cursor.par()->table->GetCellAbove(cell))<0) {
+ CursorUp(bview);
}
}
+#endif
}
-void LyXText::CursorDown() const
+void LyXText::CursorDown(BufferView * bview) const
{
- if (cursor.par->table &&
- cursor.par->table->ShouldBeVeryLastRow(NumberOfCell(cursor.par, cursor.pos)) &&
- !cursor.par->next)
+#ifndef NEW_TABULAR
+ if (cursor.par()->table &&
+ cursor.par()->table->ShouldBeVeryLastRow(NumberOfCell(cursor.par(), cursor.pos())) &&
+ !cursor.par()->next)
return;
- SetCursorFromCoordinates(cursor.x_fix,
- cursor.y - cursor.row->baseline
- + cursor.row->height + 1);
- if (cursor.par->table) {
- int cell = NumberOfCell(cursor.par, cursor.pos);
- int cell_above = cursor.par->table->GetCellAbove(cell);
- while(cursor.par->table &&
- cursor.par->table->IsContRow(cell) &&
- (cursor.par->table->CellHasContRow(cell_above)<0)) {
- SetCursorFromCoordinates(cursor.x_fix,
- cursor.y - cursor.row->baseline
- + cursor.row->height + 1);
- if (cursor.par->table) {
- cell = NumberOfCell(cursor.par, cursor.pos);
- cell_above = cursor.par->table->GetCellAbove(cell);
+#endif
+
+ SetCursorFromCoordinates(bview, cursor.x_fix(),
+ cursor.y() - cursor.row()->baseline()
+ + cursor.row()->height() + 1);
+#ifndef NEW_TABULAR
+ if (cursor.par()->table) {
+ int cell = NumberOfCell(cursor.par(), cursor.pos());
+ int cell_above = cursor.par()->table->GetCellAbove(cell);
+ while(cursor.par()->table &&
+ cursor.par()->table->IsContRow(cell) &&
+ (cursor.par()->table->CellHasContRow(cell_above)<0)) {
+ SetCursorFromCoordinates(bview, cursor.x_fix(),
+ cursor.y() - cursor.row()->baseline()
+ + cursor.row()->height() + 1);
+ if (cursor.par()->table) {
+ cell = NumberOfCell(cursor.par(), cursor.pos());
+ cell_above = cursor.par()->table->GetCellAbove(cell);
}
}
}
+#endif
}
-void LyXText::CursorUpParagraph() const
+void LyXText::CursorUpParagraph(BufferView * bview) const
{
- if (cursor.pos > 0) {
- SetCursor(cursor.par, 0);
+ if (cursor.pos() > 0) {
+ SetCursor(bview, cursor.par(), 0);
}
- else if (cursor.par->Previous()) {
- SetCursor(cursor.par->Previous(), 0);
+ else if (cursor.par()->Previous()) {
+ SetCursor(bview, cursor.par()->Previous(), 0);
}
}
-void LyXText::CursorDownParagraph() const
+void LyXText::CursorDownParagraph(BufferView * bview) const
{
- if (cursor.par->Next()) {
- SetCursor(cursor.par->Next(), 0);
+ if (cursor.par()->Next()) {
+ SetCursor(bview, cursor.par()->Next(), 0);
} else {
- SetCursor(cursor.par, cursor.par->Last());
+ SetCursor(bview, cursor.par(), cursor.par()->Last());
}
}
-
-void LyXText::DeleteEmptyParagraphMechanism(LyXCursor const & old_cursor) const
+void LyXText::DeleteEmptyParagraphMechanism(BufferView * bview,
+ LyXCursor const & old_cursor) const
{
// Would be wrong to delete anything if we have a selection.
if (selection) return;
// We allow all kinds of "mumbo-jumbo" when freespacing.
- if (textclasslist.Style(buffer->params.textclass,
- old_cursor.par->GetLayout()).free_spacing)
+ if (textclasslist.Style(bview->buffer()->params.textclass,
+ old_cursor.par()->GetLayout()).free_spacing)
return;
bool deleted = false;
that I can get some feedback. (Lgb)
*/
- // If old_cursor.pos == 0 and old_cursor.pos(1) == LineSeparator
+ // If old_cursor.pos() == 0 and old_cursor.pos()(1) == LineSeparator
// delete the LineSeparator.
// MISSING
- // If old_cursor.pos == 1 and old_cursor.pos(0) == LineSeparator
+ // If old_cursor.pos() == 1 and old_cursor.pos()(0) == LineSeparator
// delete the LineSeparator.
// MISSING
// If the pos around the old_cursor were spaces, delete one of them.
- if (old_cursor.par != cursor.par || old_cursor.pos != cursor.pos) { // Only if the cursor has really moved
+ if (old_cursor.par() != cursor.par() || old_cursor.pos() != cursor.pos()) {
+ // Only if the cursor has really moved
- if (old_cursor.pos > 0
- && old_cursor.pos < old_cursor.par->Last()
- && old_cursor.par->IsLineSeparator(old_cursor.pos)
- && old_cursor.par->IsLineSeparator(old_cursor.pos - 1)) {
- old_cursor.par->Erase(old_cursor.pos - 1);
- RedoParagraphs(old_cursor, old_cursor.par->Next());
+ if (old_cursor.pos() > 0
+ && old_cursor.pos() < old_cursor.par()->Last()
+ && old_cursor.par()->IsLineSeparator(old_cursor.pos())
+ && old_cursor.par()->IsLineSeparator(old_cursor.pos() - 1)) {
+ old_cursor.par()->Erase(old_cursor.pos() - 1);
+ RedoParagraphs(bview, old_cursor, old_cursor.par()->Next());
// correct cursor
- if (old_cursor.par == cursor.par &&
- cursor.pos > old_cursor.pos) {
- SetCursorIntern(cursor.par, cursor.pos - 1);
+ if (old_cursor.par() == cursor.par() &&
+ cursor.pos() > old_cursor.pos()) {
+ SetCursorIntern(bview, cursor.par(),
+ cursor.pos() - 1);
} else
- SetCursorIntern(cursor.par, cursor.pos);
+ SetCursorIntern(bview, cursor.par(),
+ cursor.pos());
return;
}
}
// Do not delete empty paragraphs with keepempty set.
- if ((textclasslist.Style(buffer->params.textclass,
- old_cursor.par->GetLayout())).keepempty)
+ if ((textclasslist.Style(bview->buffer()->params.textclass,
+ old_cursor.par()->GetLayout())).keepempty)
return;
LyXCursor tmpcursor;
- if (old_cursor.par != cursor.par) {
- if ( (old_cursor.par->Last() == 0
- || (old_cursor.par->Last() == 1
- && old_cursor.par->IsLineSeparator(0)))
- && old_cursor.par->FirstPhysicalPar()
- == old_cursor.par->LastPhysicalPar()) {
+ if (old_cursor.par() != cursor.par()) {
+ if ( (old_cursor.par()->Last() == 0
+ || (old_cursor.par()->Last() == 1
+ && old_cursor.par()->IsLineSeparator(0)))
+ && old_cursor.par()->FirstPhysicalPar()
+ == old_cursor.par()->LastPhysicalPar()) {
// ok, we will delete anything
// make sure that you do not delete any environments
- if ((old_cursor.par->footnoteflag != LyXParagraph::OPEN_FOOTNOTE &&
- !(old_cursor.row->previous
- && old_cursor.row->previous->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
- && !(old_cursor.row->next
- && old_cursor.row->next->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE))
- || (old_cursor.par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
- && ((old_cursor.row->previous
- && old_cursor.row->previous->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
- || (old_cursor.row->next
- && old_cursor.row->next->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE))
+ if ((old_cursor.par()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE &&
+ !(old_cursor.row()->previous()
+ && old_cursor.row()->previous()->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
+ && !(old_cursor.row()->next()
+ && old_cursor.row()->next()->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE))
+ || (old_cursor.par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
+ && ((old_cursor.row()->previous()
+ && old_cursor.row()->previous()->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
+ || (old_cursor.row()->next()
+ && old_cursor.row()->next()->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE))
)) {
status = LyXText::NEED_MORE_REFRESH;
deleted = true;
- if (old_cursor.row->previous) {
- refresh_row = old_cursor.row->previous;
- refresh_y = old_cursor.y - old_cursor.row->baseline - refresh_row->height;
+ if (old_cursor.row()->previous()) {
+ refresh_row = old_cursor.row()->previous();
+ refresh_y = old_cursor.y() - old_cursor.row()->baseline() - refresh_row->height();
tmpcursor = cursor;
cursor = old_cursor; // that undo can restore the right cursor position
- LyXParagraph * endpar = old_cursor.par->next;
+ LyXParagraph * endpar = old_cursor.par()->next;
if (endpar && endpar->GetDepth()) {
while (endpar && endpar->GetDepth()) {
endpar = endpar->LastPhysicalPar()->Next();
}
}
- SetUndo(Undo::DELETE,
- old_cursor.par->previous,
+ SetUndo(bview->buffer(), Undo::DELETE,
+ old_cursor.par()->previous,
endpar);
cursor = tmpcursor;
// delete old row
- RemoveRow(old_cursor.row);
- if (buffer->paragraph == old_cursor.par) {
- buffer->paragraph = buffer->paragraph->next;
+ RemoveRow(old_cursor.row());
+ if (OwnerParagraph() == old_cursor.par()) {
+ OwnerParagraph(OwnerParagraph()->next);
}
// delete old par
- delete old_cursor.par;
+ delete old_cursor.par();
/* Breakagain the next par. Needed
* because of the parindent that
* can occur or dissappear. The
* next row can change its height,
* if there is another layout before */
- if (refresh_row->next) {
- BreakAgain(refresh_row->next);
- UpdateCounters(refresh_row);
+ if (refresh_row->next()) {
+ BreakAgain(bview, refresh_row->next());
+ UpdateCounters(bview, refresh_row);
}
- SetHeightOfRow(refresh_row);
+ SetHeightOfRow(bview, refresh_row);
} else {
- refresh_row = old_cursor.row->next;
- refresh_y = old_cursor.y - old_cursor.row->baseline;
+ refresh_row = old_cursor.row()->next();
+ refresh_y = old_cursor.y() - old_cursor.row()->baseline();
tmpcursor = cursor;
cursor = old_cursor; // that undo can restore the right cursor position
- LyXParagraph *endpar = old_cursor.par->next;
+ LyXParagraph * endpar = old_cursor.par()->next;
if (endpar && endpar->GetDepth()) {
while (endpar && endpar->GetDepth()) {
endpar = endpar->LastPhysicalPar()->Next();
}
}
- SetUndo(Undo::DELETE,
- old_cursor.par->previous,
+ SetUndo(bview->buffer(), Undo::DELETE,
+ old_cursor.par()->previous,
endpar);
cursor = tmpcursor;
// delete old row
- RemoveRow(old_cursor.row);
+ RemoveRow(old_cursor.row());
// delete old par
- if (buffer->paragraph == old_cursor.par) {
- buffer->paragraph = buffer->paragraph->next;
+ if (OwnerParagraph() == old_cursor.par()) {
+ OwnerParagraph(OwnerParagraph()->next);
}
- delete old_cursor.par;
+ delete old_cursor.par();
/* Breakagain the next par. Needed
because of the parindent that can
if there is another layout before
*/
if (refresh_row) {
- BreakAgain(refresh_row);
- UpdateCounters(refresh_row->previous);
+ BreakAgain(bview, refresh_row);
+ UpdateCounters(bview, refresh_row->previous());
}
}
// correct cursor y
- SetCursorIntern(cursor.par, cursor.pos);
+ SetCursorIntern(bview, cursor.par(), cursor.pos());
- if (sel_cursor.par == old_cursor.par
- && sel_cursor.pos == sel_cursor.pos) {
+ if (sel_cursor.par() == old_cursor.par()
+ && sel_cursor.pos() == sel_cursor.pos()) {
// correct selection
sel_cursor = cursor;
}
}
}
if (!deleted) {
- if (old_cursor.par->ClearParagraph()) {
- RedoParagraphs(old_cursor, old_cursor.par->Next());
+ if (old_cursor.par()->StripLeadingSpaces(bview->buffer()->params.textclass)) {
+ RedoParagraphs(bview, old_cursor, old_cursor.par()->Next());
// correct cursor y
- SetCursorIntern(cursor.par, cursor.pos);
+ SetCursorIntern(bview, cursor.par(), cursor.pos());
sel_cursor = cursor;
}
}
// undo functions
-bool LyXText::TextUndo()
+bool LyXText::TextUndo(BufferView * bview)
{
+ if (inset_owner)
+ return false;
// returns false if no undo possible
- Undo * undo = buffer->undostack.pop();
+ Undo * undo = bview->buffer()->undostack.pop();
if (undo) {
FinishUndo();
if (!undo_frozen)
- buffer->redostack
- .push(CreateUndo(undo->kind,
+ bview->buffer()->redostack
+ .push(CreateUndo(bview->buffer(), undo->kind,
GetParFromID(undo->number_of_before_par),
GetParFromID(undo->number_of_behind_par)));
}
- return TextHandleUndo(undo);
+ return TextHandleUndo(bview, undo);
}
-bool LyXText::TextRedo()
+bool LyXText::TextRedo(BufferView * bview)
{
+ if (inset_owner)
+ return false;
// returns false if no redo possible
- Undo * undo = buffer->redostack.pop();
+ Undo * undo = bview->buffer()->redostack.pop();
if (undo) {
FinishUndo();
if (!undo_frozen)
- buffer->undostack
- .push(CreateUndo(undo->kind,
+ bview->buffer()->undostack
+ .push(CreateUndo(bview->buffer(), undo->kind,
GetParFromID(undo->number_of_before_par),
GetParFromID(undo->number_of_behind_par)));
}
- return TextHandleUndo(undo);
+ return TextHandleUndo(bview, undo);
}
-bool LyXText::TextHandleUndo(Undo * undo)
+bool LyXText::TextHandleUndo(BufferView * bview, Undo * undo)
{
+ if (inset_owner)
+ return false;
// returns false if no undo possible
bool result = false;
if (undo) {
// if there's no before take the beginning
// of the document for redoing
if (!before)
- SetCursorIntern(FirstParagraph(), 0);
+ SetCursorIntern(bview, FirstParagraph(), 0);
// replace the paragraphs with the undo informations
if (before)
tmppar5 = before->next;
else
- tmppar5 = buffer->paragraph;
+ tmppar5 = OwnerParagraph();
tmppar2 = tmppar3;
while (tmppar5 && tmppar5 != behind){
tmppar = tmppar5;
if (before)
before->next = tmppar3;
else
- buffer->paragraph = tmppar3;
+ OwnerParagraph(tmppar3);
tmppar3->previous = before;
}
else {
if (!before)
- buffer->paragraph = behind;
+ OwnerParagraph(behind);
}
if (tmppar4) {
tmppar4->next = behind;
// Set the cursor for redoing
if (before) {
- SetCursorIntern(before->FirstSelfrowPar(), 0);
+ SetCursorIntern(bview, before->FirstSelfrowPar(), 0);
// check wether before points to a closed float and open it if necessary
if (before && before->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE
&& before->next && before->next->footnoteflag != LyXParagraph::NO_FOOTNOTE){
}
// calculate the endpar for redoing the paragraphs.
- if (behind){
+ if (behind) {
if (behind->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE)
endpar = behind->LastPhysicalPar()->Next();
else
endpar = behind->NextAfterFootnote()->LastPhysicalPar()->Next();
- }
- else
+ } else
endpar = behind;
tmppar = GetParFromID(undo->number_of_cursor_par);
- RedoParagraphs(cursor, endpar);
+ RedoParagraphs(bview, cursor, endpar);
if (tmppar){
- SetCursorIntern(tmppar, undo->cursor_pos);
- UpdateCounters(cursor.row);
+ SetCursorIntern(bview, tmppar, undo->cursor_pos);
+ UpdateCounters(bview, cursor.row());
}
result = true;
delete undo;
void LyXText::FinishUndo()
{
+ if (inset_owner)
+ return;
// makes sure the next operation will be stored
- undo_finished = True;
+ undo_finished = true;
}
void LyXText::FreezeUndo()
{
+ if (inset_owner)
+ return;
// this is dangerous and for internal use only
- undo_frozen = True;
+ undo_frozen = true;
}
void LyXText::UnFreezeUndo()
{
+ if (inset_owner)
+ return;
// this is dangerous and for internal use only
undo_frozen = false;
}
-void LyXText::SetUndo(Undo::undo_kind kind, LyXParagraph const * before,
+void LyXText::SetUndo(Buffer * buf, Undo::undo_kind kind,
+ LyXParagraph const * before,
LyXParagraph const * behind) const
{
+ if (inset_owner)
+ return;
if (!undo_frozen)
- buffer->undostack.push(CreateUndo(kind, before, behind));
- buffer->redostack.clear();
+ buf->undostack.push(CreateUndo(buf, kind, before, behind));
+ buf->redostack.clear();
}
-void LyXText::SetRedo(Undo::undo_kind kind, LyXParagraph const * before,
- LyXParagraph const * behind)
+void LyXText::SetRedo(Buffer * buf, Undo::undo_kind kind,
+ LyXParagraph const * before, LyXParagraph const * behind)
{
- buffer->redostack.push(CreateUndo(kind, before, behind));
+ if (inset_owner)
+ return;
+ buf->redostack.push(CreateUndo(buf, kind, before, behind));
}
-Undo * LyXText::CreateUndo(Undo::undo_kind kind, LyXParagraph const * before,
- LyXParagraph const * behind) const
+Undo * LyXText::CreateUndo(Buffer * buf, Undo::undo_kind kind,
+ LyXParagraph const * before,
+ LyXParagraph const * behind) const
{
+ if (inset_owner)
+ return 0;
+
int before_number = -1;
int behind_number = -1;
if (before)
// appear one by one when undoing.
// EDIT is special since only layout information, not the
// contents of a paragaph are stored.
- if (!undo_finished && kind != Undo::EDIT &&
- kind != Undo::FINISH){
+ if (!undo_finished && (kind != Undo::EDIT) && (kind != Undo::FINISH)){
// check wether storing is needed
- if (!buffer->undostack.empty() &&
- buffer->undostack.top()->kind == kind &&
- buffer->undostack.top()->number_of_before_par == before_number &&
- buffer->undostack.top()->number_of_behind_par == behind_number ){
+ if (!buf->undostack.empty() &&
+ buf->undostack.top()->kind == kind &&
+ buf->undostack.top()->number_of_before_par == before_number &&
+ buf->undostack.top()->number_of_behind_par == behind_number ){
// no undo needed
return 0;
}
} else
undopar = 0; // nothing to replace (undo of delete maybe)
- int cursor_par = cursor.par->ParFromPos(cursor.pos)->id();
- int cursor_pos = cursor.par->PositionInParFromPos(cursor.pos);
+ int cursor_par = cursor.par()->ParFromPos(cursor.pos())->id();
+ int cursor_pos = cursor.par()->PositionInParFromPos(cursor.pos());
Undo * undo = new Undo(kind,
before_number, behind_number,
}
-void LyXText::SetCursorParUndo()
+void LyXText::SetCursorParUndo(Buffer * buf)
{
- SetUndo(Undo::FINISH,
- cursor.par->ParFromPos(cursor.pos)->previous,
- cursor.par->ParFromPos(cursor.pos)->next);
+ if (inset_owner)
+ return;
+ SetUndo(buf, Undo::FINISH,
+ cursor.par()->ParFromPos(cursor.pos())->previous,
+ cursor.par()->ParFromPos(cursor.pos())->next);
}
-void LyXText::RemoveTableRow(LyXCursor * cur) const
+#ifndef NEW_TABULAR
+void LyXText::RemoveTableRow(LyXCursor & cur) const
{
int cell = -1;
int cell_org = 0;
int ocell = 0;
// move to the previous row
- int cell_act = NumberOfCell(cur->par, cur->pos);
+ int cell_act = NumberOfCell(cur.par(), cur.pos());
if (cell < 0)
cell = cell_act;
- while (cur->pos && !cur->par->IsNewline(cur->pos - 1))
- cur->pos--;
- while (cur->pos &&
- !cur->par->table->IsFirstCell(cell_act)) {
- cur->pos--;
- while (cur->pos && !cur->par->IsNewline(cur->pos - 1))
- cur->pos--;
+ while (cur.pos() && !cur.par()->IsNewline(cur.pos() - 1))
+ cur.pos(cur.pos() - 1);
+ while (cur.pos() &&
+ !cur.par()->table->IsFirstCell(cell_act)) {
+ cur.pos(cur.pos() - 1);
+ while (cur.pos() && !cur.par()->IsNewline(cur.pos() - 1))
+ cur.pos(cur.pos() - 1);
--cell;
--cell_act;
}
do {
ocell = cell;
// delete up to the next row
- while (cur->pos < cur->par->Last() &&
+ while (cur.pos() < cur.par()->Last() &&
(cell_act == ocell
- || !cur->par->table->IsFirstCell(cell_act))) {
- while (cur->pos < cur->par->Last() &&
- !cur->par->IsNewline(cur->pos))
- cur->par->Erase(cur->pos);
+ || !cur.par()->table->IsFirstCell(cell_act))) {
+ while (cur.pos() < cur.par()->Last() &&
+ !cur.par()->IsNewline(cur.pos()))
+ cur.par()->Erase(cur.pos());
++cell;
++cell_act;
- if (cur->pos < cur->par->Last())
- cur->par->Erase(cur->pos);
+ if (cur.pos() < cur.par()->Last())
+ cur.par()->Erase(cur.pos());
}
- if (cur->pos && cur->pos == cur->par->Last()) {
- cur->pos--;
- cur->par->Erase(cur->pos); // no newline at very end!
+ if (cur.pos() && cur.pos() == cur.par()->Last()) {
+ cur.pos(cur.pos() - 1);
+ cur.par()->Erase(cur.pos()); // no newline at very end!
}
- } while (((cell + 1) < cur->par->table->GetNumberOfCells()) &&
- !cur->par->table->IsContRow(cell_org) &&
- cur->par->table->IsContRow(cell));
- cur->par->table->DeleteRow(cell_org);
+ } while (((cell + 1) < cur.par()->table->GetNumberOfCells()) &&
+ !cur.par()->table->IsContRow(cell_org) &&
+ cur.par()->table->IsContRow(cell));
+ cur.par()->table->DeleteRow(cell_org);
return;
}
+#endif
+#ifndef NEW_TABULAR
bool LyXText::IsEmptyTableCell() const
{
- LyXParagraph::size_type pos = cursor.pos - 1;
- while (pos >= 0 && pos < cursor.par->Last()
- && !cursor.par->IsNewline(pos))
+ LyXParagraph::size_type pos = cursor.pos() - 1;
+ while (pos >= 0 && pos < cursor.par()->Last()
+ && !cursor.par()->IsNewline(pos))
--pos;
- return cursor.par->IsNewline(pos + 1);
+ return cursor.par()->IsNewline(pos + 1);
}
+#endif
-void LyXText::toggleAppendix(){
- LyXParagraph * par = cursor.par->FirstPhysicalPar();
+void LyXText::toggleAppendix(BufferView * bview)
+{
+ LyXParagraph * par = cursor.par()->FirstPhysicalPar();
bool start = !par->start_of_appendix;
// ensure that we have only one start_of_appendix in this document
status = LyXText::NEED_MORE_REFRESH;
refresh_y = 0;
refresh_row = 0; // not needed for full update
- UpdateCounters(0);
- SetCursor(cursor.par, cursor.pos);
+ UpdateCounters(bview, 0);
+ SetCursor(bview, cursor.par(), cursor.pos());
+}
+
+LyXParagraph * LyXText::OwnerParagraph() const
+{
+ if (inset_owner)
+ return inset_owner->par;
+
+ return bv_owner->buffer()->paragraph;
}
+
+LyXParagraph * LyXText::OwnerParagraph(LyXParagraph * p) const
+{
+ if (inset_owner)
+ inset_owner->par = p;
+ else
+ bv_owner->buffer()->paragraph = p;
+ return 0;
+}