* LyX, The Document Processor
*
* Copyright 1995 Matthias Ettrich
- * Copyright 1995-1999 The LyX Team.
+ * Copyright 1995-2000 The LyX Team.
*
- * ======================================================*/
+ * ====================================================== */
#include <config.h>
-#include <cctype>
#include FORMS_H_LOCATION
+
#ifdef __GNUG__
#pragma implementation "lyxtext.h"
-#pragma implementation "undo.h"
#endif
#include "LString.h"
#include "lyxparagraph.h"
#include "insets/inseterror.h"
+#include "insets/insetbib.h"
+#include "insets/insetspecialchar.h"
#include "layout.h"
#include "LyXView.h"
#include "support/textutils.h"
-#include "lyx_cb.h"
#include "undo.h"
#include "minibuffer.h"
#include "buffer.h"
#include "lyx_gui_misc.h"
#include "lyxtext.h"
#include "gettext.h"
+#include "BufferView.h"
+#include "LyXView.h"
+#include "lyxrow.h"
+#include "CutAndPaste.h"
+#include "Painter.h"
+#include "font.h"
+#include "debug.h"
-extern MiniBuffer *minibuffer;
+//#define USE_OLD_CUT_AND_PASTE 1
-// Constructor
-LyXText::LyXText(int pw, Buffer *p)
+using std::copy;
+using std::endl;
+using std::pair;
+
+LyXText::LyXText(BufferView * bv, int pw, Buffer * p)
{
+ owner_ = bv;
firstrow = 0;
lastrow = 0;
- currentrow = 0;
- currentrow_y = 0;
paperwidth = pw;
- parameters = &p->params;
- params = p;
+ buffer = p;
number_of_rows = 0;
- refresh_y= 0;
+ refresh_y = 0;
status = LyXText::UNCHANGED;
- LyXParagraph *par = p->paragraph;
+ LyXParagraph * par = p->paragraph;
current_font = GetFont(par, 0);
height = 0;
-
+
while (par) {
InsertParagraph(par, lastrow);
par = par->Next();
}
- /* set cursor at the very top position */
- selection = true; /* these setting is necessary
- * because of the delete-empty-
- * paragraph mechanism in
- * SetCursor */
+
+ // 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);
sel_cursor = cursor;
selection = false;
mark_set = false;
- /* no rebreak necessary */
+ // no rebreak necessary
need_break_row = 0;
undo_finished = true;
// Default layouttype for copy environment type
copylayouttype = 0;
+
+#if 0
+ // Dump all rowinformation:
+ Row * tmprow = firstrow;
+ 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
}
-// Destructor
LyXText::~LyXText()
{
// Delete all rows, this does not touch the paragraphs!
- Row *tmprow = firstrow;
+ Row * tmprow = firstrow;
while (firstrow) {
tmprow = firstrow->next;
delete firstrow;
}
+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, int pos)
+LyXFont LyXText::GetFont(LyXParagraph * par,
+ LyXParagraph::size_type pos) const
{
- LyXLayout *layout =
- lyxstyle.Style(parameters->textclass, par->GetLayout());
+ LyXLayout const & layout =
+ textclasslist.Style(buffer->params.textclass,
+ par->GetLayout());
char par_depth = par->GetDepth();
// We specialize the 95% common case:
if (par->footnoteflag == LyXParagraph::NO_FOOTNOTE && !par_depth) {
if (pos >= 0){
// 95% goes here
- if (layout->labeltype == LABEL_MANUAL
+ if (layout.labeltype == LABEL_MANUAL
&& pos < BeginningOfMainBody(par)) {
// 1% goes here
return par->GetFontSettings(pos).
- realize(layout->reslabelfont);
+ realize(layout.reslabelfont);
} else
return par->GetFontSettings(pos).
- realize(layout->resfont);
+ realize(layout.resfont);
} else {
// 5% goes here.
// process layoutfont for pos == -1 and labelfont for pos < -1
if (pos == -1)
- return layout->resfont;
+ return layout.resfont;
else
- return layout->reslabelfont;
+ return layout.reslabelfont;
}
}
// 95% goes here
if (pos < BeginningOfMainBody(par)) {
// 1% goes here
- layoutfont = layout->labelfont;
+ layoutfont = layout.labelfont;
} else {
// 99% goes here
- layoutfont = layout->font;
+ layoutfont = layout.font;
}
tmpfont = par->GetFontSettings(pos);
tmpfont.realize(layoutfont);
- } else{
+ } else {
// 5% goes here.
// process layoutfont for pos == -1 and labelfont for pos < -1
if (pos == -1)
- tmpfont = layout->font;
+ tmpfont = layout.font;
else
- tmpfont = layout->labelfont;
+ tmpfont = layout.labelfont;
}
// Resolve against environment font information
- //if (par->GetDepth()){ // already in while condition
- while (par && par_depth && !tmpfont.resolved()) {
- par = par->DepthHook(par_depth - 1);
- if (par) {
- tmpfont.realize(lyxstyle.
- Style(parameters->textclass,
- par->GetLayout())->font);
- par_depth = par->GetDepth();
- }
+ while (par && par_depth && !tmpfont.resolved()) {
+ par = par->DepthHook(par_depth - 1);
+ if (par) {
+ tmpfont.realize(textclasslist.
+ Style(buffer->params.textclass,
+ par->GetLayout()).font);
+ par_depth = par->GetDepth();
}
- //}
+ }
- tmpfont.realize(lyxstyle.TextClass(parameters->textclass)->defaultfont);
+ tmpfont.realize(textclasslist.TextClass(buffer->params.textclass).defaultfont());
// Cosmetic improvement: If this is an open footnote, make the font
// smaller.
}
-void LyXText::SetCharFont(LyXParagraph *par, int pos, LyXFont font)
+void LyXText::SetCharFont(LyXParagraph * par,
+ LyXParagraph::size_type pos,
+ LyXFont const & fnt)
{
- /* let the insets convert their font */
- if (par->GetChar(pos) == LYX_META_INSET) {
+ LyXFont font(fnt);
+ // Let the insets convert their font
+ if (par->GetChar(pos) == LyXParagraph::META_INSET) {
if (par->GetInset(pos))
font = par->GetInset(pos)->ConvertFont(font);
}
- LyXLayout *layout = lyxstyle.Style(parameters->textclass,
- par->GetLayout());
+ LyXLayout const & layout =
+ textclasslist.Style(buffer->params.textclass,
+ par->GetLayout());
// Get concrete layout font to reduce against
LyXFont layoutfont;
if (pos < BeginningOfMainBody(par))
- layoutfont = layout->labelfont;
+ layoutfont = layout.labelfont;
else
- layoutfont = layout->font;
+ layoutfont = layout.font;
// Realize against environment font information
if (par->GetDepth()){
while (!layoutfont.resolved() && tp && tp->GetDepth()) {
tp = tp->DepthHook(tp->GetDepth()-1);
if (tp)
- layoutfont.realize(lyxstyle.
- Style(parameters->textclass,
- tp->GetLayout())->font);
+ layoutfont.realize(textclasslist.
+ Style(buffer->params.textclass,
+ tp->GetLayout()).font);
}
}
- layoutfont.realize(lyxstyle.TextClass(parameters->textclass)->defaultfont);
+ layoutfont.realize(textclasslist.TextClass(buffer->params.textclass).defaultfont());
if (par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
&& par->footnotekind == LyXParagraph::FOOTNOTE) {
/* inserts a new row behind the specified row, increments
* the touched counters */
-void LyXText::InsertRow(Row *row, LyXParagraph *par, int pos)
+void LyXText::InsertRow(Row * row, LyXParagraph * par,
+ LyXParagraph::size_type pos) const
{
- Row *tmprow = new Row;
+ Row * tmprow = new Row;
if (!row) {
tmprow->previous = 0;
tmprow->next = firstrow;
firstrow = tmprow;
- }
- else {
+ } else {
tmprow->previous = row;
tmprow->next = row->next;
row->next = tmprow;
tmprow->par = par;
tmprow->pos = pos;
-
+
if (row == lastrow)
lastrow = tmprow;
- number_of_rows++; /* one more row */
+ ++number_of_rows; // one more row
}
-/* removes the row and reset the touched counters */
-void LyXText::RemoveRow(Row *row)
+// removes the row and reset the touched counters
+void LyXText::RemoveRow(Row * row) const
{
/* this must not happen before the currentrow for clear reasons.
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);
- currentrow = currentrow->previous;
- if (currentrow)
- currentrow_y -= currentrow->height;
- else
- currentrow_y = 0;
if (row->next)
row->next->previous = row->previous;
if (!row->previous) {
firstrow = row->next;
- }
- else {
+ } else {
row->previous->next = row->next;
}
if (row == lastrow)
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 */
+ --number_of_rows; // one row less
}
-/* remove all following rows of the paragraph of the specified row. */
-void LyXText::RemoveParagraph(Row *row)
-{
- LyXParagraph *tmppar;
- Row *tmprow;
- tmppar = row->par;
+// remove all following rows of the paragraph of the specified row.
+void LyXText::RemoveParagraph(Row * row) const
+{
+ LyXParagraph * tmppar = row->par;
row = row->next;
+ Row * tmprow;
while (row && row->par == tmppar) {
tmprow = row->next;
RemoveRow(row);
}
}
-
-/* insert the specified paragraph behind the specified row */
-void LyXText::InsertParagraph(LyXParagraph *par, Row *row)
+
+// insert the specified paragraph behind the specified row
+void LyXText::InsertParagraph(LyXParagraph * par, Row * row) const
{
InsertRow(row, par, 0); /* insert a new row, starting
* at postition 0 */
- SetCounter(par); /* set the counters */
+ SetCounter(par); // set the counters
- /* and now append the whole paragraph behind the new row */
+ // and now append the whole paragraph behind the new row
if (!row) {
firstrow->height = 0;
AppendParagraph(firstrow);
- }
- else {
+ } else {
row->next->height = 0;
AppendParagraph(row->next);
}
void LyXText::ToggleFootnote()
{
- LyXParagraph *par;
-
- par = cursor.par->ParFromPos(cursor.pos);
- if (par->next && par->next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE){
+ LyXParagraph * par = cursor.par->ParFromPos(cursor.pos);
+ if (par->next
+ && par->next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) {
OpenFootnote();
- minibuffer->Set(_("Opened float"));
- }
- else {
- minibuffer->Set(_("Closed float"));
+ owner_->owner()->getMiniBuffer()->Set(_("Opened float"));
+ } else {
+ owner_->owner()->getMiniBuffer()->Set(_("Closed float"));
CloseFootnote();
}
}
void LyXText::OpenStuff()
{
if (cursor.pos == 0 && cursor.par->bibkey){
- cursor.par->bibkey->Edit(0,0);
+ cursor.par->bibkey->Edit(owner_, 0, 0, 0);
}
else if (cursor.pos < cursor.par->Last()
- && cursor.par->GetChar(cursor.pos) == LYX_META_INSET
+ && cursor.par->GetChar(cursor.pos) == LyXParagraph::META_INSET
&& cursor.par->GetInset(cursor.pos)->Editable()) {
- minibuffer->Set(cursor.par->GetInset(cursor.pos)->EditMessage());
- if (cursor.par->GetInset(cursor.pos)->Editable() != 2)
+ 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(0,0);
- }
- else {
+ cursor.par->GetInset(cursor.pos)->Edit(owner_, 0, 0, 0);
+ } else {
ToggleFootnote();
}
}
void LyXText::CloseFootnote()
{
- LyXParagraph *par, *endpar,*tmppar;
- Row *row;
+ LyXParagraph * tmppar;
+ LyXParagraph * par = cursor.par->ParFromPos(cursor.pos);
- 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 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 (!par->next
- || par->next->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
- minibuffer->Set(_("Nothing to do"));
+ if (!par->next ||
+ par->next->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
+ owner_->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++);
- /* now the cursor is at the beginning of the physical par */
- SetCursor(cursor.par, cursor.pos + cursor.par->ParFromPos(cursor.pos)->last);
- }
- else {
+ // 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++)
+ {}
+
+ // now the cursor is at the beginning of the physical par
+ SetCursor(cursor.par,
+ cursor.pos +
+ cursor.par->ParFromPos(cursor.pos)->size());
+ } else {
/* we are in a footnote, so let us move at the beginning */
- /* while (cursor.par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
- cursor.par = cursor.par->Previous();
-
- SetCursor(cursor.par, cursor.par->Last()); */
/* this is just faster than using just CursorLeft() */
tmppar = cursor.par;
while (tmppar->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
- /* just a little bit faster than movin the cursor */
+ // just a little bit faster than movin the cursor
tmppar = tmppar->Previous();
}
SetCursor(tmppar, tmppar->Last());
}
- /* the cursor must be exactly before the footnote */
+ // the cursor must be exactly before the footnote
par = cursor.par->ParFromPos(cursor.pos);
status = LyXText::NEED_MORE_REFRESH;
refresh_y = cursor.y - cursor.row->baseline;
tmppar = cursor.par;
- endpar = par->NextAfterFootnote()->Next();
- row = cursor.row;
+ LyXParagraph * endpar = par->NextAfterFootnote()->Next();
+ Row * row = cursor.row;
tmppar->CloseFootnote(cursor.pos);
- /* set the dimensions of the cursor row */
- /* row->fill = Fill(row, paperwidth);
- SetHeightOfRow(row); */
-
while (tmppar != endpar) {
RemoveRow(row->next);
if (row->next)
SetCursor(cursor.par, cursor.pos);
sel_cursor = cursor;
- /* just necessary */
+ // just necessary
if (cursor.row->next)
SetHeightOfRow(cursor.row->next);
}
/* used in setlayout */
// Asger is not sure we want to do this...
-void LyXText::MakeFontEntriesLayoutSpecific(LyXParagraph *par)
+void LyXText::MakeFontEntriesLayoutSpecific(LyXParagraph * par)
{
- LyXFont layoutfont, tmpfont;
-
- int pos;
- LyXLayout* layout = lyxstyle.Style(parameters->textclass, par->GetLayout());
-
- for (pos = 0; pos < par->Last(); pos++) {
+ LyXLayout const & layout =
+ textclasslist.Style(buffer->params.textclass,
+ par->GetLayout());
+
+ LyXFont layoutfont, tmpfont;
+ for (LyXParagraph::size_type pos = 0;
+ pos < par->Last(); ++pos) {
if (pos < BeginningOfMainBody(par))
- layoutfont = layout->labelfont;
+ layoutfont = layout.labelfont;
else
- layoutfont = layout->font;
+ layoutfont = layout.font;
tmpfont = par->GetFontSettings(pos);
tmpfont.reduce(layoutfont);
}
}
+LyXParagraph * LyXText::SetLayout(LyXCursor & cur, LyXCursor & sstart_cur,
+ LyXCursor & send_cur,
+ LyXTextClass::size_type layout)
+{
+ LyXParagraph * endpar = send_cur.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::EDIT,
+ sstart_cur.par->ParFromPos(sstart_cur.pos)->previous,
+ undoendpar);
+
+ /* ok we have a selection. This is always between sstart_cur
+ * and sel_end cursor */
+ cur = sstart_cur;
+
+ LyXLayout const & lyxlayout =
+ textclasslist.Style(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();
+ 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());
+ if (lyxlayout.labeltype != LABEL_BIBLIO
+ && fppar->bibkey) {
+ delete fppar->bibkey;
+ fppar->bibkey = 0;
+ }
+ }
+ 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();
+ 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());
+ if (lyxlayout.labeltype != LABEL_BIBLIO
+ && fppar->bibkey) {
+ delete fppar->bibkey;
+ fppar->bibkey = 0;
+ }
+ }
+ return endpar;
+}
-/* set layout over selection and make a total rebreak of those paragraphs */
-void LyXText::SetLayout(char layout)
+// set layout over selection and make a total rebreak of those paragraphs
+void LyXText::SetLayout(LyXTextClass::size_type layout)
{
- LyXCursor tmpcursor;
+ LyXCursor
+ tmpcursor = cursor; /* store the current cursor */
- /* if there is no selection just set the layout of the current paragraph */
+#ifdef USE_OLD_SET_LAYOUT
+ // if there is no selection just set the layout
+ // of the current paragraph */
if (!selection) {
- sel_start_cursor = cursor; /* dummy selection */
+ sel_start_cursor = cursor; // dummy selection
sel_end_cursor = cursor;
}
- LyXParagraph *endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
- LyXParagraph *undoendpar = endpar;
+ LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+ LyXParagraph * undoendpar = endpar;
if (endpar && endpar->GetDepth()) {
while (endpar && endpar->GetDepth()) {
- //endpar->depth = 0;
endpar = endpar->LastPhysicalPar()->Next();
undoendpar = endpar;
}
}
else if (endpar) {
- endpar = endpar->Next(); /* because of parindents etc. */
+ endpar = endpar->Next(); // because of parindents etc.
}
SetUndo(Undo::EDIT,
sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous,
undoendpar);
- tmpcursor = cursor; /* store the current cursor */
-
/* ok we have a selection. This is always between sel_start_cursor
* and sel_end cursor */
cursor = sel_start_cursor;
- LyXLayout * lyxlayout = lyxstyle.Style(parameters->textclass, layout);
+ LyXLayout const & lyxlayout =
+ textclasslist.Style(buffer->params.textclass, layout);
while (cursor.par != sel_end_cursor.par) {
if (cursor.par->footnoteflag ==
cursor.par->SetLayout(layout);
MakeFontEntriesLayoutSpecific(cursor.par);
LyXParagraph* fppar = cursor.par->FirstPhysicalPar();
- fppar->added_space_top = lyxlayout->fill_top ?
+ fppar->added_space_top = lyxlayout.fill_top ?
VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
- fppar->added_space_bottom = lyxlayout->fill_bottom ?
+ fppar->added_space_bottom = lyxlayout.fill_bottom ?
VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
- if (lyxlayout->margintype == MARGIN_MANUAL)
- cursor.par->SetLabelWidthString(lyxlayout->labelstring);
- if (lyxlayout->labeltype != LABEL_BIBLIO
+ if (lyxlayout.margintype == MARGIN_MANUAL)
+ cursor.par->SetLabelWidthString(lyxlayout.labelstring());
+ if (lyxlayout.labeltype != LABEL_BIBLIO
&& fppar->bibkey) {
delete fppar->bibkey;
fppar->bibkey = 0;
cursor.par->SetLayout(layout);
MakeFontEntriesLayoutSpecific(cursor.par);
LyXParagraph* fppar = cursor.par->FirstPhysicalPar();
- fppar->added_space_top = lyxlayout->fill_top ?
+ fppar->added_space_top = lyxlayout.fill_top ?
VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
- fppar->added_space_bottom = lyxlayout->fill_bottom ?
+ fppar->added_space_bottom = lyxlayout.fill_bottom ?
VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
- if (lyxlayout->margintype == MARGIN_MANUAL)
- cursor.par->SetLabelWidthString(lyxlayout->labelstring);
- if (lyxlayout->labeltype != LABEL_BIBLIO
+ if (lyxlayout.margintype == MARGIN_MANUAL)
+ cursor.par->SetLabelWidthString(lyxlayout.labelstring());
+ if (lyxlayout.labeltype != LABEL_BIBLIO
&& fppar->bibkey) {
delete fppar->bibkey;
fppar->bibkey = 0;
}
}
-
+#else
+ // if there is no selection just set the layout
+ // of the current paragraph */
+ if (!selection) {
+ sel_start_cursor = cursor; // dummy selection
+ sel_end_cursor = cursor;
+ }
+ LyXParagraph *
+ endpar = SetLayout(cursor, sel_start_cursor, sel_end_cursor, layout);
+#endif
RedoParagraphs(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);
+ // we have to reset the selection, because the
+ // geometry could have changed */
+ SetCursor(sel_start_cursor.par, sel_start_cursor.pos, false);
sel_cursor = cursor;
- SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
+ SetCursor(sel_end_cursor.par, sel_end_cursor.pos, false);
UpdateCounters(cursor.row);
ClearSelection();
SetSelection();
- SetCursor(tmpcursor.par, tmpcursor.pos);
+ SetCursor(tmpcursor.par, tmpcursor.pos, true);
}
-/* increment depth over selection and
- * make a total rebreak of those paragraphs */
+// increment depth over selection and
+// make a total rebreak of those paragraphs
void LyXText::IncDepth()
{
// If there is no selection, just use the current paragraph
if (!selection) {
- sel_start_cursor = cursor; /* dummy selection */
+ sel_start_cursor = cursor; // dummy selection
sel_end_cursor = cursor;
}
// We end at the next paragraph with depth 0
- LyXParagraph *endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
- LyXParagraph *undoendpar = endpar;
+ LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+ LyXParagraph * undoendpar = endpar;
if (endpar && endpar->GetDepth()) {
while (endpar && endpar->GetDepth()) {
}
}
else if (endpar) {
- endpar = endpar->Next(); /* because of parindents etc. */
+ endpar = endpar->Next(); // because of parindents etc.
}
SetUndo(Undo::EDIT,
- sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous,
+ sel_start_cursor
+ .par->ParFromPos(sel_start_cursor.pos)->previous,
undoendpar);
- LyXCursor tmpcursor = cursor; /* store the current cursor */
+ LyXCursor tmpcursor = cursor; // store the current cursor
- /* ok we have a selection. This is always between sel_start_cursor
- * and sel_end cursor */
+ // ok we have a selection. This is always between sel_start_cursor
+ // and sel_end cursor
cursor = sel_start_cursor;
bool anything_changed = false;
// NOTE: you can't change the depth of a bibliography entry
if (cursor.par->footnoteflag ==
sel_start_cursor.par->footnoteflag
- && lyxstyle.Style(parameters->textclass,
+ && textclasslist.Style(buffer->params.textclass,
cursor.par->GetLayout()
- )->labeltype != LABEL_BIBLIO) {
- LyXParagraph * prev = cursor.par->FirstPhysicalPar()->Previous();
+ ).labeltype != LABEL_BIBLIO) {
+ LyXParagraph * prev =
+ cursor.par->FirstPhysicalPar()->Previous();
if (prev
&& (prev->GetDepth() - cursor.par->GetDepth() > 0
|| (prev->GetDepth() == cursor.par->GetDepth()
- && lyxstyle.Style(parameters->textclass,
- prev->GetLayout())->isEnvironment()))) {
+ && textclasslist.Style(buffer->params.textclass,
+ prev->GetLayout()).isEnvironment()))) {
cursor.par->FirstPhysicalPar()->depth++;
anything_changed = true;
}
cursor.par = cursor.par->Next();
}
- /* if nothing changed set all depth to 0 */
+ // if nothing changed set all depth to 0
if (!anything_changed) {
cursor = sel_start_cursor;
while (cursor.par != sel_end_cursor.par) {
RedoParagraphs(sel_start_cursor, endpar);
- /* we have to reset the selection, because the
- * geometry could have changed */
+ // we have to reset the selection, because the
+ // geometry could have changed
SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
sel_cursor = cursor;
SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
}
-/* decrement depth over selection and
- * make a total rebreak of those paragraphs */
+// decrement depth over selection and
+// make a total rebreak of those paragraphs
void LyXText::DecDepth()
{
- /* if there is no selection just set the layout of the current paragraph */
+ // if there is no selection just set the layout
+ // of the current paragraph
if (!selection) {
- sel_start_cursor = cursor; /* dummy selection */
+ sel_start_cursor = cursor; // dummy selection
sel_end_cursor = cursor;
}
- LyXParagraph *endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
- LyXParagraph *undoendpar = endpar;
+ LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+ LyXParagraph * undoendpar = endpar;
if (endpar && endpar->GetDepth()) {
while (endpar && endpar->GetDepth()) {
}
}
else if (endpar) {
- endpar = endpar->Next(); /* because of parindents etc. */
+ endpar = endpar->Next(); // because of parindents etc.
}
SetUndo(Undo::EDIT,
- sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous,
+ sel_start_cursor
+ .par->ParFromPos(sel_start_cursor.pos)->previous,
undoendpar);
- LyXCursor tmpcursor = cursor; /* store the current cursor */
+ LyXCursor tmpcursor = cursor; // store the current cursor
- /* ok we have a selection. This is always between sel_start_cursor
- * and sel_end cursor */
+ // ok we have a selection. This is always between sel_start_cursor
+ // and sel_end cursor
cursor = sel_start_cursor;
while (true) {
RedoParagraphs(sel_start_cursor, endpar);
- /* we have to reset the selection, because the
- * geometry could have changed */
+ // we have to reset the selection, because the
+ // geometry could have changed
SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
sel_cursor = cursor;
SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
}
-/* set font over selection and make a total rebreak of those paragraphs */
-void LyXText::SetFont(LyXFont font, bool toggleall)
+// set font over selection and make a total rebreak of those paragraphs
+void LyXText::SetFont(LyXFont const & font, bool toggleall)
{
- /* if there is no selection just set the current_font */
+ // if there is no selection just set the current_font
if (!selection) {
// Determine basis font
LyXFont layoutfont;
layoutfont = GetFont(cursor.par, -2);
else
layoutfont = GetFont(cursor.par, -1);
-
// Update current font
- real_current_font.update(font,toggleall);
+ real_current_font.update(font,
+ buffer->params.language_info,
+ toggleall);
// Reduce to implicit settings
current_font = real_current_font;
return;
}
- LyXCursor tmpcursor = cursor; /* store the current cursor */
+ LyXCursor tmpcursor = cursor; // store the current cursor
- /* ok we have a selection. This is always between sel_start_cursor
- * and sel_end cursor */
+ // 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,
{
if (cursor.pos < cursor.par->Last()
&& cursor.par->footnoteflag
- == sel_start_cursor.par->footnoteflag) { /* an open footnote
- * should behave
- * like a closed */
- LyXFont newfont = GetFont(cursor.par,cursor.pos);
- newfont.update(font,toggleall);
+ == sel_start_cursor.par->footnoteflag) {
+ // an open footnote should behave
+ // like a closed one
+ LyXFont newfont = GetFont(cursor.par, cursor.pos);
+ newfont.update(font,
+ buffer->params.language_info,
+ toggleall);
SetCharFont(cursor.par, cursor.pos, newfont);
cursor.pos++;
} else {
RedoParagraphs(sel_start_cursor, sel_end_cursor.par->Next());
- /* we have to reset the selection, because the
- * geometry could have changed */
+ // we have to reset the selection, because the
+ // geometry could have changed
SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
sel_cursor = cursor;
SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
}
-void LyXText::RedoHeightOfParagraph(LyXCursor cursor)
+void LyXText::RedoHeightOfParagraph(LyXCursor const & cur)
{
- Row *tmprow;
- LyXParagraph *first_phys_par;
- long y;
-
- tmprow = cursor.row;
-
- y = cursor.y - tmprow->baseline;
+ Row * tmprow = cur.row;
+ long y = cur.y - tmprow->baseline;
+
SetHeightOfRow(tmprow);
- first_phys_par = tmprow->par->FirstPhysicalPar();
- /* find the first row of the paragraph */
+ 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) {
+ 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) {
+ while (tmprow->previous && tmprow->previous->par == first_phys_par) {
tmprow = tmprow->previous;
y -= tmprow->height;
SetHeightOfRow(tmprow);
}
-
- /* we can set the refreshing parameters now */
+
+ // we can set the refreshing parameters now
status = LyXText::NEED_MORE_REFRESH;
refresh_y = y;
refresh_row = tmprow;
- SetCursor(cursor.par, cursor.pos);
+ SetCursor(cur.par, cur.pos);
}
-void LyXText::RedoDrawingOfParagraph(LyXCursor cursor)
+void LyXText::RedoDrawingOfParagraph(LyXCursor const & cur)
{
- Row *tmprow;
- LyXParagraph *first_phys_par;
- long y;
+ Row * tmprow = cur.row;
- tmprow = cursor.row;
-
- y = cursor.y - tmprow->baseline;
+ long y = cur.y - tmprow->baseline;
SetHeightOfRow(tmprow);
- first_phys_par = tmprow->par->FirstPhysicalPar();
- /* find the first row of the paragraph */
+ 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;
while (tmprow->previous && tmprow->previous->par == first_phys_par) {
tmprow = tmprow->previous;
y -= tmprow->height;
-
}
- /* we can set the refreshing parameters now */
+ // we can set the refreshing parameters now
if (status == LyXText::UNCHANGED || y < refresh_y) {
refresh_y = y;
refresh_row = tmprow;
}
status = LyXText::NEED_MORE_REFRESH;
- SetCursor(cursor.par, cursor.pos);
+ SetCursor(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 cursor, LyXParagraph *endpar)
+void LyXText::RedoParagraphs(LyXCursor const & cur,
+ LyXParagraph const * endpar) const
{
- Row *tmprow, *tmprow2;
- LyXParagraph *tmppar, *first_phys_par;
- long y;
+ Row * tmprow2;
+ LyXParagraph * tmppar, * first_phys_par;
- tmprow = cursor.row;
+ Row * tmprow = cur.row;
- y = cursor.y - tmprow->baseline;
+ long y = cur.y - tmprow->baseline;
if (!tmprow->previous){
first_phys_par = FirstParagraph(); // a trick/hack for UNDO
- }
- else {
+ } else {
first_phys_par = tmprow->par->FirstPhysicalPar();
- /* find the first row of the paragraph */
+ // find the first row of the paragraph
if (first_phys_par != tmprow->par)
- while (tmprow->previous && tmprow->previous->par != first_phys_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) {
+ while (tmprow->previous
+ && tmprow->previous->par == first_phys_par) {
tmprow = tmprow->previous;
y -= tmprow->height;
}
}
- /* we can set the refreshing parameters now */
+ // we can set the refreshing parameters now
status = LyXText::NEED_MORE_REFRESH;
refresh_y = y;
- refresh_row = tmprow->previous; /* the real refresh row will
- * be deleted, so I store
- * the previous here */
- /* remove it */
+ 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;
else
tmppar = 0;
}
- /* remove the first one */
- tmprow2 = tmprow; /* this is because tmprow->previous
- * can be 0 */
+ // remove the first one
+ tmprow2 = tmprow; /* this is because tmprow->previous
+ can be 0 */
tmprow = tmprow->previous;
RemoveRow(tmprow2);
while (tmprow->next && tmprow->next->par == tmppar)
tmprow = tmprow->next;
tmppar = tmppar->Next();
-
}
- }
- while (tmppar != endpar);
+ } while (tmppar != endpar);
- /* this is because of layout changes */
+ // this is because of layout changes
if (refresh_row) {
refresh_y -= refresh_row->height;
SetHeightOfRow(refresh_row);
- }
- else {
+ } else {
refresh_row = firstrow;
refresh_y = 0;
SetHeightOfRow(refresh_row);
if (tmprow && tmprow->next)
SetHeightOfRow(tmprow->next);
-
- /* restore the correct refresh row */
-/* if (refresh_row)
- refresh_row = refresh_row->next;
- else
- refresh_row = firstrow;*/
}
-int LyXText::FullRebreak()
+bool LyXText::FullRebreak()
{
if (need_break_row) {
BreakAgain(need_break_row);
need_break_row = 0;
- return 1;
+ return true;
}
- return 0;
+ return false;
}
* realize, that you left an empty paragraph, they will delete it.
* They also delet the corresponding row */
-/* need the selection cursor: */
+// need the selection cursor:
void LyXText::SetSelection()
{
if (!selection) {
sel_end_cursor = sel_cursor;
}
- selection = True;
+ selection = true;
- /* first the toggling area */
+ // first the toggling area
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;
last_sel_cursor = cursor;
- /* and now the whole selection */
-
- if (sel_cursor.y < cursor.y ||
+ // and now the whole selection
+
+ 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)) {
sel_end_cursor = cursor;
sel_start_cursor = sel_cursor;
sel_start_cursor = cursor;
}
- /* a selection with no contents is not a selection */
+ // 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)
selection = false;
}
-void LyXText::ClearSelection()
+void LyXText::ClearSelection() const
{
selection = false;
mark_set = false;
}
-void LyXText::CursorHome()
+void LyXText::CursorHome() const
{
SetCursor(cursor.par, cursor.row->pos);
}
-void LyXText::CursorEnd()
+void LyXText::CursorEnd() const
{
if (!cursor.row->next || cursor.row->next->par != cursor.row->par)
SetCursor(cursor.par, RowLast(cursor.row) + 1);
}
-void LyXText::CursorTop()
+void LyXText::CursorTop() const
{
while (cursor.par->Previous())
cursor.par = cursor.par->Previous();
}
-void LyXText::CursorBottom()
+void LyXText::CursorBottom() const
{
while (cursor.par->Next())
cursor.par = cursor.par->Next();
/* returns a pointer to the row near the specified y-coordinate
* (relative to the whole text). y is set to the real beginning
-* of this row */
-Row* LyXText::GetRowNearY(long& y)
+* of this row */
+Row * LyXText::GetRowNearY(long & y) const
{
- Row* tmprow;
- long tmpy;
-
- if (currentrow){
- tmprow = currentrow;
- tmpy = currentrow_y;
- }
- else {
- tmprow = firstrow;
- tmpy = 0;
- }
-
- if (tmpy<=y)
- while (tmprow->next && tmpy + tmprow->height <= y) {
- tmpy += tmprow->height;
- tmprow = tmprow->next;
- }
- else
- while (tmprow->previous && tmpy > y) {
- tmprow = tmprow->previous;
- tmpy -= tmprow->height;
- }
+ Row * tmprow = firstrow;
+ long tmpy = 0;
- currentrow = tmprow;
- currentrow_y = tmpy;
+ while (tmprow->next && tmpy + tmprow->height <= y) {
+ tmpy += tmprow->height;
+ tmprow = tmprow->next;
+ }
- y = tmpy; /* return the real y */
+ y = tmpy; // return the real y
return tmprow;
}
-
-void LyXText::ToggleFree(LyXFont font, bool toggleall)
+
+void LyXText::ToggleFree(LyXFont const & font, bool toggleall)
{
// If the mask is completely neutral, tell user
- if (font == LyXFont(LyXFont::ALL_IGNORE)){
+ if (font == LyXFont(LyXFont::ALL_IGNORE)) {
// Could only happen with user style
- minibuffer->Set(_("No font change defined. Use Character under"
+ owner_->owner()->getMiniBuffer()
+ ->Set(_("No font change defined. Use Character under"
" the Layout menu to define font change."));
return;
}
// Try implicit word selection
+ // If there is a change in the language the implicit word selection
+ // is disabled.
LyXCursor resetCursor = cursor;
- int implicitSelection = SelectWordWhenUnderCursor();
+ bool implicitSelection = (font.language() == ignore_language)
+ ? SelectWordWhenUnderCursor() : false;
// Set font
- SetFont(font,toggleall);
- //minibuffer->Set(_("Font style changed"));
+ SetFont(font, toggleall);
/* Implicit selections are cleared afterwards and cursor is set to the
original position. */
}
-int LyXText::BeginningOfMainBody(LyXParagraph *par)
+LyXParagraph::size_type LyXText::BeginningOfMainBody(LyXParagraph * par) const
{
- if (lyxstyle.Style(parameters->textclass, par->GetLayout())->labeltype != LABEL_MANUAL)
+ if (textclasslist.Style(buffer->params.textclass,
+ par->GetLayout()).labeltype != LABEL_MANUAL)
return 0;
else
return par->BeginningOfMainBody();
* in the selection, otherwise just the environment you are in */
void LyXText::MeltFootnoteEnvironment()
{
- LyXParagraph *tmppar, *firsttmppar;
+ LyXParagraph * tmppar, * firsttmppar;
ClearSelection();
firsttmppar = cursor.par->ParFromPos(cursor.pos);
tmppar = firsttmppar;
/* tmppar is now the paragraph right before the footnote */
+
+ bool first_footnote_par_is_not_empty = tmppar->next->size();
- char first_footnote_par_is_not_empty = tmppar->next->last;
-
- while (tmppar->next && tmppar->next->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
- tmppar = tmppar->next; /* I use next instead of Next(),
- * because there cannot be any
- * footnotes in a footnote
- * environment */
+ while (tmppar->next
+ && tmppar->next->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
+ tmppar = tmppar->next; /* I use next instead of Next(),
+ * because there cannot be any
+ * footnotes in a footnote
+ * environment */
tmppar->footnoteflag = LyXParagraph::NO_FOOTNOTE;
/* remember the captions and empty paragraphs */
- if ((lyxstyle.Style(parameters->textclass,
- tmppar->GetLayout())->labeltype == LABEL_SENSITIVE)
+ if ((textclasslist.Style(buffer->params.textclass,
+ tmppar->GetLayout())
+ .labeltype == LABEL_SENSITIVE)
|| !tmppar->Last())
tmppar->SetLayout(0);
}
- /* now we will paste the ex-footnote, if the layouts allow it */
- /* first restore the layout of the paragraph right behind the footnote*/
+ // 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);
- /* first the end */
+ // first the end
if ((!tmppar->GetLayout() && !tmppar->table)
- || (tmppar->Next() && (!tmppar->Next()->Last()
- || tmppar->Next()->HasSameLayout(tmppar)))) {
- if (tmppar->Next()->Last() && tmppar->Next()->IsLineSeparator(0))
+ || (tmppar->Next()
+ && (!tmppar->Next()->Last()
+ || tmppar->Next()->HasSameLayout(tmppar)))) {
+ if (tmppar->Next()->Last()
+ && tmppar->Next()->IsLineSeparator(0))
tmppar->Next()->Erase(0);
tmppar->PasteParagraph();
}
- tmppar = tmppar->Next(); /* make shure tmppar cannot be touched
- * by the pasting of the beginning */
+ tmppar = tmppar->Next(); /* make sure tmppar cannot be touched
+ * by the pasting of the beginning */
/* then the beginning */
/* if there is no space between the text and the footnote, so we insert
* (only if the previous par and the footnotepar are not empty!) */
if ((!firsttmppar->next->GetLayout() && !firsttmppar->next->table)
|| firsttmppar->HasSameLayout(firsttmppar->next)) {
- if (firsttmppar->last
- && !firsttmppar->IsSeparator(firsttmppar->last - 1)
+ if (firsttmppar->size()
+ && !firsttmppar->IsSeparator(firsttmppar->size() - 1)
&& first_footnote_par_is_not_empty) {
firsttmppar->next->InsertChar(0, ' ');
}
SetCursor(cursor.par, cursor.pos);
/* sometimes it can happen, that there is a counter change */
- Row *row = cursor.row;
+ Row * row = cursor.row;
while (row->next && row->par != tmppar && row->next->par != tmppar)
row = row->next;
UpdateCounters(row);
void LyXText::SetParagraph(bool line_top, bool line_bottom,
bool pagebreak_top, bool pagebreak_bottom,
- VSpace space_top, VSpace space_bottom,
- char align,
+ VSpace const & space_top,
+ VSpace const & space_bottom,
+ LyXAlignment align,
string labelwidthstring,
bool noindent)
{
- LyXCursor tmpcursor;
- tmpcursor = cursor;
- LyXParagraph *tmppar;
+ LyXCursor tmpcursor = cursor;
if (!selection) {
sel_start_cursor = cursor;
sel_end_cursor = cursor;
}
// make sure that the depth behind the selection are restored, too
- LyXParagraph *endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
- LyXParagraph *undoendpar = endpar;
+ LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+ LyXParagraph * undoendpar = endpar;
if (endpar && endpar->GetDepth()) {
while (endpar && endpar->GetDepth()) {
}
}
else if (endpar) {
- endpar = endpar->Next(); /* because of parindents etc. */
+ endpar = endpar->Next(); // because of parindents etc.
}
SetUndo(Undo::EDIT,
- sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous,
+ sel_start_cursor
+ .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);
- 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;
- /* does the layout allow the new alignment? */
- if (align == LYX_ALIGN_LAYOUT)
- align = lyxstyle.Style(parameters->textclass, cursor.par->GetLayout())->align;
- if (align & lyxstyle.Style(parameters->textclass, cursor.par->GetLayout())->alignpossible) {
- if (align == lyxstyle.Style(parameters->textclass, cursor.par->GetLayout())->align)
- cursor.par->align = LYX_ALIGN_LAYOUT;
- else
- cursor.par->align = align;
- }
- cursor.par->SetLabelWidthString(labelwidthstring);
- cursor.par->noindent = noindent;
+ LyXParagraph * tmppar = sel_end_cursor.par;
+ while (tmppar != sel_start_cursor.par->FirstPhysicalPar()->Previous()) {
+ SetCursor(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;
+ // does the layout allow the new alignment?
+ if (align == LYX_ALIGN_LAYOUT)
+ align = textclasslist
+ .Style(buffer->params.textclass,
+ cursor.par->GetLayout()).align;
+ if (align & textclasslist
+ .Style(buffer->params.textclass,
+ cursor.par->GetLayout()).alignpossible) {
+ if (align == textclasslist
+ .Style(buffer->params.textclass,
+ cursor.par->GetLayout()).align)
+ cursor.par->align = LYX_ALIGN_LAYOUT;
+ else
+ cursor.par->align = align;
}
-
- /*
- tmprow = cursor.row;
- while (tmprow->next && tmprow->next->par->previous != cursor.par->LastPhysicalPar())
- tmprow = tmprow->next;
- SetHeightOfRow(tmprow);
- SetHeightOfRow(cursor.row); */
- tmppar = cursor.par->FirstPhysicalPar()->Previous();
+ cursor.par->SetLabelWidthString(labelwidthstring);
+ cursor.par->noindent = noindent;
}
+
+ tmppar = cursor.par->FirstPhysicalPar()->Previous();
+ }
RedoParagraphs(sel_start_cursor, endpar);
void LyXText::SetParagraphExtraOpt(int type,
- const char *width,
- const char *widthp,
+ char const * width,
+ char const * widthp,
int alignment, bool hfill,
bool start_minipage)
{
- LyXCursor tmpcursor;
- tmpcursor = cursor;
- LyXParagraph *tmppar;
+ LyXCursor tmpcursor = cursor;
+ LyXParagraph * tmppar;
if (!selection) {
sel_start_cursor = cursor;
sel_end_cursor = cursor;
}
// make sure that the depth behind the selection are restored, too
- LyXParagraph *endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
- LyXParagraph *undoendpar = endpar;
+ LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+ LyXParagraph * undoendpar = endpar;
if (endpar && endpar->GetDepth()) {
while (endpar && endpar->GetDepth()) {
}
}
else if (endpar) {
- endpar = endpar->Next(); /* because of parindents etc. */
+ endpar = endpar->Next(); // because of parindents etc.
}
SetUndo(Undo::EDIT,
- sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous,
+ sel_start_cursor
+ .par->ParFromPos(sel_start_cursor.pos)->previous,
undoendpar);
tmppar = sel_end_cursor.par;
refresh_y = cursor.y - cursor.row->baseline;
if (cursor.par->footnoteflag ==
sel_start_cursor.par->footnoteflag) {
- if (type == PEXTRA_NONE) {
- if (cursor.par->pextra_type != PEXTRA_NONE) {
+ if (type == LyXParagraph::PEXTRA_NONE) {
+ if (cursor.par->pextra_type != LyXParagraph::PEXTRA_NONE) {
cursor.par->UnsetPExtraType();
- cursor.par->pextra_type=PEXTRA_NONE;
+ cursor.par->pextra_type = LyXParagraph::PEXTRA_NONE;
}
} else {
- cursor.par->SetPExtraType(type,width,widthp);
+ cursor.par->SetPExtraType(type, width, widthp);
cursor.par->pextra_hfill = hfill;
cursor.par->pextra_start_minipage = start_minipage;
cursor.par->pextra_alignment = alignment;
}
-static char* alphaCounter(int n){
- static char result[2];
- result[1] = 0;
- if (n == 0)
- return "";
- else {
- result[0] = 64+n;
- if (n > 26)
- return "??";
- }
- return result;
+char loweralphaCounter(int n)
+{
+ if (n < 1 || n > 26)
+ return '?';
+ else
+ return 'a' + n - 1;
}
+char alphaCounter(int n)
+{
+ if (n < 1 || n > 26)
+ return '?';
+ else
+ return 'A' + n - 1;
+}
-/* set the counter of a paragraph. This includes the labels */
-void LyXText::SetCounter(LyXParagraph *par)
+char hebrewCounter(int n)
{
- int i;
-
- /* this is only relevant for the beginning of paragraph */
+ static const char hebrew[22] = {
+ 'à ', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è',
+ 'é', 'ë', 'ì', 'î', 'ð', 'ñ', 'ò', 'ô', 'ö',
+ '÷', 'ø', 'ù', 'ú'
+ };
+ if (n < 1 || n > 22)
+ return '?';
+ else
+ return hebrew[n-1];
+}
+
+static char const * romanCounter(int n)
+{
+ static char const * roman[20] = {
+ "i", "ii", "iii", "iv", "v",
+ "vi", "vii", "viii", "ix", "x",
+ "xi", "xii", "xiii", "xiv", "xv",
+ "xvi", "xvii", "xviii", "xix", "xx"
+ };
+ if (n < 1 || n > 20)
+ return "??";
+ else
+ return roman[n-1];
+}
+
+// set the counter of a paragraph. This includes the labels
+void LyXText::SetCounter(LyXParagraph * par) const
+{
+ // this is only relevant for the beginning of paragraph
par = par->FirstPhysicalPar();
- LyXLayout* layout = lyxstyle.Style(parameters->textclass,
- par->GetLayout());
+ LyXLayout const & layout =
+ textclasslist.Style(buffer->params.textclass,
+ par->GetLayout());
- LyXTextClass *textclass = lyxstyle.TextClass(parameters->textclass);
+ LyXTextClass const & textclass =
+ textclasslist.TextClass(buffer->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)
- && !(lyxstyle.Style(parameters->textclass,
+ && !(textclasslist.Style(buffer->params.textclass,
par->Previous()->GetLayout()
- )->labeltype != LABEL_BIBLIO
- && layout->labeltype == LABEL_BIBLIO)) {
- for (i=0; i<10; i++) {
+ ).labeltype != LABEL_BIBLIO
+ && layout.labeltype == LABEL_BIBLIO)) {
+ for (int i = 0; i < 10; ++i) {
par->setCounter(i, par->Previous()->GetFirstCounter(i));
}
par->appendix = par->Previous()->FirstPhysicalPar()->appendix;
if (!par->appendix && par->start_of_appendix){
par->appendix = true;
- for (i=0; i<10; i++) {
+ for (int i = 0; i < 10; ++i) {
par->setCounter(i, 0);
}
}
par->itemdepth = par->Previous()->FirstPhysicalPar()->itemdepth;
}
else {
- for (i=0; i<10; i++) {
+ for (int i = 0; i < 10; ++i) {
par->setCounter(i, 0);
}
par->appendix = par->start_of_appendix;
&& par->Previous()
&& par->Previous()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE
&& (par->PreviousBeforeFootnote()
- && lyxstyle.Style(parameters->textclass,
+ && textclasslist.Style(buffer->params.textclass,
par->PreviousBeforeFootnote()->GetLayout()
- )->labeltype >= LABEL_COUNTER_ENUMI)) {
+ ).labeltype >= LABEL_COUNTER_ENUMI)) {
// Any itemize or enumerate environment in a marginnote
// that is embedded in an itemize or enumerate
// paragraph is seen by LaTeX as being at a deeper
*/
if (par->Previous()
&& par->Previous()->GetDepth() < par->GetDepth()
- && lyxstyle.Style(parameters->textclass,
+ && textclasslist.Style(buffer->params.textclass,
par->Previous()->GetLayout()
- )->labeltype == LABEL_COUNTER_ENUMI
+ ).labeltype == LABEL_COUNTER_ENUMI
&& par->enumdepth < 3
&& !(par->Previous()->footnoteflag == LyXParagraph::NO_FOOTNOTE
&& par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
&& par->footnotekind == LyXParagraph::FOOTNOTE)
- && layout->labeltype != LABEL_BIBLIO) {
+ && layout.labeltype != LABEL_BIBLIO) {
par->enumdepth++;
}
&& !(par->Previous()->footnoteflag == LyXParagraph::NO_FOOTNOTE
&& par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
&& par->footnotekind == LyXParagraph::FOOTNOTE)
- && layout->labeltype != LABEL_BIBLIO) {
+ && layout.labeltype != LABEL_BIBLIO) {
par->enumdepth = par->DepthHook(par->GetDepth())->enumdepth;
par->setCounter(6 + par->enumdepth,
par->DepthHook(par->GetDepth())->getCounter(6 + par->enumdepth));
/* reset the counters.
* A depth change is like a breaking layout
*/
- for (i=6 + par->enumdepth + 1; i<10;i++)
+ for (int i = 6 + par->enumdepth + 1; i < 10; ++i)
par->setCounter(i, 0);
}
if (!par->labelstring.empty()) {
- par->labelstring.clear();
+ par->labelstring.erase();
}
- if (layout->margintype == MARGIN_MANUAL) {
+ if (layout.margintype == MARGIN_MANUAL) {
if (par->labelwidthstring.empty()) {
- par->SetLabelWidthString(layout->labelstring);
+ par->SetLabelWidthString(layout.labelstring());
}
- }
- else {
+ } else {
par->SetLabelWidthString(string());
}
/* is it a layout that has an automatic label ? */
- if (layout->labeltype >= LABEL_FIRST_COUNTER) {
+ if (layout.labeltype >= LABEL_FIRST_COUNTER) {
- i = layout->labeltype - LABEL_FIRST_COUNTER;
- if (i>=0 && i<=parameters->secnumdepth) {
+ int i = layout.labeltype - LABEL_FIRST_COUNTER;
+ if (i >= 0 && i<= buffer->params.secnumdepth) {
par->incCounter(i); // increment the counter
- char * s = new char[50];
-
// Is there a label? Useful for Chapter layout
if (!par->appendix){
- if (!layout->labelstring.empty())
- par->labelstring = layout->labelstring;
+ if (!layout.labelstring().empty())
+ par->labelstring = layout.labelstring();
else
- par->labelstring.clear();
- }
- else {
- if (!layout->labelstring_appendix.empty())
- par->labelstring = layout->labelstring_appendix;
+ par->labelstring.erase();
+ } else {
+ if (!layout.labelstring_appendix().empty())
+ par->labelstring = layout.labelstring_appendix();
else
- par->labelstring.clear();
+ par->labelstring.erase();
}
-
- if (!par->appendix){
+
+#ifdef HAVE_SSTREAM
+ std::ostringstream s;
+#else
+ ostrstream s;
+#endif
+ if (!par->appendix) {
switch (2 * LABEL_FIRST_COUNTER -
- textclass->maxcounter + i) {
+ textclass.maxcounter() + i) {
case LABEL_COUNTER_CHAPTER:
- sprintf(s, "%d",
- par->getCounter(i));
+ s << par->getCounter(i);
break;
case LABEL_COUNTER_SECTION:
- sprintf(s, "%d.%d",
- par->getCounter(i - 1),
- par->getCounter(i));
+ s << par->getCounter(i - 1) << '.'
+ << par->getCounter(i);
break;
case LABEL_COUNTER_SUBSECTION:
- sprintf(s, "%d.%d.%d",
- par->getCounter(i-2),
- par->getCounter(i-1),
- par->getCounter(i));
+ s << par->getCounter(i - 2) << '.'
+ << par->getCounter(i - 1) << '.'
+ << par->getCounter(i);
break;
case LABEL_COUNTER_SUBSUBSECTION:
- sprintf(s, "%d.%d.%d.%d",
- par->getCounter(i-3),
- par->getCounter(i-2),
- par->getCounter(i-1),
- par->getCounter(i));
+ s << par->getCounter(i - 3) << '.'
+ << par->getCounter(i - 2) << '.'
+ << par->getCounter(i - 1) << '.'
+ << par->getCounter(i);
+
break;
case LABEL_COUNTER_PARAGRAPH:
- sprintf(s, "%d.%d.%d.%d.%d",
- par->getCounter(i-4),
- par->getCounter(i-3),
- par->getCounter(i-2),
- par->getCounter(i-1),
- par->getCounter(i));
+ s << par->getCounter(i - 4) << '.'
+ << par->getCounter(i - 3) << '.'
+ << par->getCounter(i - 2) << '.'
+ << par->getCounter(i - 1) << '.'
+ << par->getCounter(i);
break;
case LABEL_COUNTER_SUBPARAGRAPH:
- sprintf(s, "%d.%d.%d.%d.%d.%d",
- par->getCounter(i-5),
- par->getCounter(i-4),
- par->getCounter(i-3),
- par->getCounter(i-2),
- par->getCounter(i-1),
- par->getCounter(i));
+ s << par->getCounter(i - 5) << '.'
+ << par->getCounter(i - 4) << '.'
+ << par->getCounter(i - 3) << '.'
+ << par->getCounter(i - 2) << '.'
+ << par->getCounter(i - 1) << '.'
+ << par->getCounter(i);
+
break;
default:
- sprintf(s, "%d.", par->getCounter(i));
+ s << par->getCounter(i) << '.';
break;
}
- }
- else {
- switch (2 * LABEL_FIRST_COUNTER - textclass->maxcounter+ i) {
+ } else { // appendix
+ switch (2 * LABEL_FIRST_COUNTER - textclass.maxcounter() + i) {
case LABEL_COUNTER_CHAPTER:
- sprintf(s, "%s",
- alphaCounter(par->getCounter(i)));
+ if (par->isRightToLeftPar())
+ s << hebrewCounter(par->getCounter(i));
+ else
+ s << alphaCounter(par->getCounter(i));
break;
case LABEL_COUNTER_SECTION:
- sprintf(s, "%s.%d",
- alphaCounter(par->getCounter(i - 1)),
- par->getCounter(i));
+ if (par->isRightToLeftPar())
+ s << hebrewCounter(par->getCounter(i - 1));
+ else
+ s << alphaCounter(par->getCounter(i - 1));
+
+ s << '.'
+ << par->getCounter(i);
+
break;
case LABEL_COUNTER_SUBSECTION:
- sprintf(s, "%s.%d.%d",
- alphaCounter(par->getCounter(i-2)),
- par->getCounter(i-1),
- par->getCounter(i));
+ if (par->isRightToLeftPar())
+ s << hebrewCounter(par->getCounter(i - 2));
+ else
+ s << alphaCounter(par->getCounter(i - 2));
+
+ s << '.'
+ << par->getCounter(i-1) << '.'
+ << par->getCounter(i);
+
break;
case LABEL_COUNTER_SUBSUBSECTION:
- sprintf(s, "%s.%d.%d.%d",
- alphaCounter(par->getCounter(i-3)),
- par->getCounter(i-2),
- par->getCounter(i-1),
- par->getCounter(i));
+ if (par->isRightToLeftPar())
+ s << hebrewCounter(par->getCounter(i-3));
+ else
+ s << alphaCounter(par->getCounter(i-3));
+
+ s << '.'
+ << par->getCounter(i-2) << '.'
+ << par->getCounter(i-1) << '.'
+ << par->getCounter(i);
+
break;
case LABEL_COUNTER_PARAGRAPH:
- sprintf(s, "%s.%d.%d.%d.%d",
- alphaCounter(par->getCounter(i-4)),
- par->getCounter(i-3),
- par->getCounter(i-2),
- par->getCounter(i-1),
- par->getCounter(i));
+ if (par->isRightToLeftPar())
+ s << hebrewCounter(par->getCounter(i-4));
+ else
+ s << alphaCounter(par->getCounter(i-4));
+
+ s << '.'
+ << par->getCounter(i-3) << '.'
+ << par->getCounter(i-2) << '.'
+ << par->getCounter(i-1) << '.'
+ << par->getCounter(i);
+
break;
case LABEL_COUNTER_SUBPARAGRAPH:
- sprintf(s, "%s.%d.%d.%d.%d.%d",
- alphaCounter(par->getCounter(i-5)),
- par->getCounter(i-4),
- par->getCounter(i-3),
- par->getCounter(i-2),
- par->getCounter(i-1),
- par->getCounter(i));
+ if (par->isRightToLeftPar())
+ s << hebrewCounter(par->getCounter(i-5));
+ else
+ s << alphaCounter(par->getCounter(i-5));
+
+ s << '.'
+ << par->getCounter(i-4) << '.'
+ << par->getCounter(i-3) << '.'
+ << par->getCounter(i-2) << '.'
+ << par->getCounter(i-1) << '.'
+ << par->getCounter(i);
+
break;
default:
- sprintf(s, "%c.", par->getCounter(i));
+ // Can this ever be reached? And in the
+ // case it is, how can this be correct?
+ // (Lgb)
+ s << static_cast<unsigned char>(par->getCounter(i)) << '.';
+
break;
}
}
-
- par->labelstring += s;
- delete[] s;
-
- for (i++; i<10; i++) {
- /* reset the following counters */
+#ifdef HAVE_SSTREAM
+ par->labelstring += s.str().c_str();
+ // We really want to remove the c_str as soon as
+ // possible...
+#else
+ s << '\0';
+ char * tmps = s.str();
+ par->labelstring += tmps;
+ delete [] tmps;
+#endif
+
+ for (i++; i < 10; ++i) {
+ // reset the following counters
par->setCounter(i, 0);
}
- } else if (layout->labeltype < LABEL_COUNTER_ENUMI) {
- for (i++; i<10; i++) {
- /* reset the following counters */
+ } else if (layout.labeltype < LABEL_COUNTER_ENUMI) {
+ for (i++; i < 10; ++i) {
+ // reset the following counters
par->setCounter(i, 0);
}
- } else if (layout->labeltype == LABEL_COUNTER_ENUMI) {
+ } else if (layout.labeltype == LABEL_COUNTER_ENUMI) {
par->incCounter(i + par->enumdepth);
- char * s = new char[25];
int number = par->getCounter(i + par->enumdepth);
+
+#ifdef HAVE_SSTREAM
+ std::ostringstream s;
+#else
+ ostrstream s;
+#endif
switch (par->enumdepth) {
case 1:
- sprintf(s, "(%c)", (number % 27) + 'a' - 1);
+ if (par->isRightToLeftPar())
+ s << '('
+ << hebrewCounter(number)
+ << ')';
+ else
+ s << '('
+ << loweralphaCounter(number)
+ << ')';
break;
case 2:
- switch (number) {
- case 1: sprintf(s, "i."); break;
- case 2: sprintf(s, "ii."); break;
- case 3: sprintf(s, "iii."); break;
- case 4: sprintf(s, "iv."); break;
- case 5: sprintf(s, "v."); break;
- case 6: sprintf(s, "vi."); break;
- case 7: sprintf(s, "vii."); break;
- case 8: sprintf(s, "viii."); break;
- case 9: sprintf(s, "ix."); break;
- case 10: sprintf(s, "x."); break;
- case 11: sprintf(s, "xi."); break;
- case 12: sprintf(s, "xii."); break;
- case 13: sprintf(s, "xiii."); break;
- default:
- sprintf(s, "\\roman{%d}.", number);
- break;
- }
+ if (par->isRightToLeftPar())
+ s << '.' << romanCounter(number);
+ else
+ s << romanCounter(number) << '.';
break;
case 3:
- sprintf(s, "%c.", (number % 27) + 'A' - 1);
+ if (par->isRightToLeftPar())
+ s << '.'
+ << alphaCounter(number);
+ else
+ s << alphaCounter(number)
+ << '.';
break;
default:
- sprintf(s, "%d.", number);
+ if (par->isRightToLeftPar())
+ s << '.' << number;
+ else
+ s << number << '.';
break;
}
- par->labelstring = s;
- delete[] s;
+#ifdef HAVE_SSTREAM
+ par->labelstring = s.str().c_str();
+ // we really want to get rid of that c_str()
+#else
+ s << '\0';
+ char * tmps = s.str();
+ par->labelstring = tmps;
+ delete [] tmps;
+#endif
- for (i += par->enumdepth + 1;i<10;i++)
+ for (i += par->enumdepth + 1; i < 10; ++i)
par->setCounter(i, 0); /* reset the following counters */
}
- } else if (layout->labeltype == LABEL_BIBLIO) {// ale970302
- i = LABEL_COUNTER_ENUMI - LABEL_FIRST_COUNTER + par->enumdepth;
- par->incCounter(i);
- int number = par->getCounter(i);
- if (!par->bibkey)
- par->bibkey = new InsetBibKey();
- par->bibkey->setCounter(number);
- par->labelstring = layout->labelstring;
-
- // In biblio should't be following counters but...
- }
- else {
- string s = layout->labelstring;
-
- /* the caption hack: */
+ } else if (layout.labeltype == LABEL_BIBLIO) {// ale970302
+ int i = LABEL_COUNTER_ENUMI - LABEL_FIRST_COUNTER + par->enumdepth;
+ par->incCounter(i);
+ int number = par->getCounter(i);
+ if (!par->bibkey)
+ par->bibkey = new InsetBibKey();
+ par->bibkey->setCounter(number);
+ par->labelstring = layout.labelstring();
+
+ // In biblio should't be following counters but...
+ } else {
+ string s = layout.labelstring();
+
+ // the caption hack:
- if (layout->labeltype == LABEL_SENSITIVE) {
+ if (layout.labeltype == LABEL_SENSITIVE) {
if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE
&& (par->footnotekind == LyXParagraph::FIG
- || par->footnotekind == LyXParagraph::WIDE_FIG))
- s = "Figure:";
+ || par->footnotekind == LyXParagraph::WIDE_FIG))
+ s = (par->getParLanguage()->lang == "hebrew")
+ ? ":øåéà " : "Figure:";
else if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE
&& (par->footnotekind == LyXParagraph::TAB
- || par->footnotekind == LyXParagraph::WIDE_TAB))
- s = "Table:";
+ || par->footnotekind == LyXParagraph::WIDE_TAB))
+ s = (par->getParLanguage()->lang == "hebrew")
+ ? ":äìáè" : "Table:";
else if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE
&& par->footnotekind == LyXParagraph::ALGORITHM)
- s = "Algorithm:";
+ s = (par->getParLanguage()->lang == "hebrew")
+ ? ":Ãúéøåâìà " : "Algorithm:";
else {
/* par->SetLayout(0);
s = layout->labelstring; */
- s = "Senseless: ";
-
+ s = (par->getParLanguage()->lang == "hebrew")
+ ? " :úåòîùî øñç" : "Senseless: ";
}
}
par->labelstring = s;
-
+
/* reset the enumeration counter. They are always resetted
* when there is any other layout between */
- for (i=6 + par->enumdepth; i<10;i++)
+ for (int i = 6 + par->enumdepth; i < 10; ++i)
par->setCounter(i, 0);
}
}
/* Updates all counters BEHIND the row. Changed paragraphs
* with a dynamic left margin will be rebroken. */
-void LyXText::UpdateCounters(Row *row)
+void LyXText::UpdateCounters(Row * row) const
{
- LyXParagraph *par;
+ LyXParagraph * par;
if (!row) {
row = firstrow;
par = row->par;
}
else {
- if (row->par->next && row->par->next->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
+ if (row->par->next
+ && row->par->next->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
par = row->par->LastPhysicalPar()->Next();
} else {
par = row->par->next;
while (par) {
while (row->par != par)
row = row->next;
-
+
SetCounter(par);
-
+
/* now check for the headline layouts. remember that they
* have a dynamic left margin */
if (!par->IsDummy()
- && ( lyxstyle.Style(parameters->textclass, par->layout)->margintype == MARGIN_DYNAMIC
- || lyxstyle.Style(parameters->textclass, par->layout)->labeltype == LABEL_SENSITIVE)
- ){
+ && ( textclasslist.Style(buffer->params.textclass,
+ par->layout).margintype == MARGIN_DYNAMIC
+ || textclasslist.Style(buffer->params.textclass,
+ par->layout).labeltype == LABEL_SENSITIVE)
+ ) {
/* Rebreak the paragraph */
RemoveParagraph(row);
/* insets an inset. */
void LyXText::InsertInset(Inset *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, LYX_META_INSET);
+ cursor.par->InsertChar(cursor.pos, LyXParagraph::META_INSET);
cursor.par->InsertInset(cursor.pos, inset);
- InsertChar(LYX_META_INSET); /* just to rebreak and refresh correctly.
+ InsertChar(LyXParagraph::META_INSET); /* just to rebreak and refresh correctly.
* The character will not be inserted a
* second time */
}
-/* this is for the simple cut and paste mechanism */
-static LyXParagraph *simple_cut_buffer = 0;
+#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;
+ LyXParagraph * tmppar;
while (simple_cut_buffer) {
tmppar = simple_cut_buffer;
}
simple_cut_buffer = 0;
}
-
+#endif
void LyXText::copyEnvironmentType()
{
SetLayout(copylayouttype);
}
-
+#ifdef USE_OLD_CUT_AND_PASTE
void LyXText::CutSelection(bool doclear)
{
- /* This doesn't make sense, if there is no selection */
- if (!selection) {
+ // 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;
- int i;
+ // 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 */
+ // 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){
+ || 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."));
+ 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."));
+ /* 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*/
+ /* 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;
+ 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. */
+ } else if (endpar) {
+ endpar = endpar->Next(); // because of parindents etc.
}
SetUndo(Undo::DELETE,
- sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous,
+ sel_start_cursor
+ .par->ParFromPos(sel_start_cursor.pos)->previous,
undoendpar);
- /* delete the simple_cut_buffer */
+ // clear the simple_cut_buffer
DeleteSimpleCutBuffer();
- /* set the textclass */
- simple_cut_buffer_textclass = parameters->textclass;
+ // 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.
-*/
+ /*
+ 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.".
- char space_wrapped =
- sel_end_cursor.par->IsLineSeparator(sel_end_cursor.pos);
- if (sel_end_cursor.pos > 0
- && sel_end_cursor.par->IsLineSeparator(sel_end_cursor.pos - 1)) {
- sel_end_cursor.pos--; /* please break before a space at
- * the end */
- space_wrapped = True;
- }
+ (Lgb)
+ */
- // cut 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: cut only within one paragraph or
- * more than one paragraph */
+ // 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 */
- simple_cut_buffer = new LyXParagraph();
- for (i=sel_start_cursor.pos; i< sel_end_cursor.pos; i++){
- /* table stuff -- begin*/
+ // 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->IsNewline(sel_start_cursor.pos)) {
sel_start_cursor.par->CopyIntoMinibuffer(sel_start_cursor.pos);
sel_start_cursor.pos++;
} else {
- /* table stuff -- end*/
+ /* 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());
}
- /* check for double spaces */
- if (sel_start_cursor.pos &&
- sel_start_cursor.par->Last()>sel_start_cursor.pos &&
- sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos - 1) &&
- sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos)){
- sel_start_cursor.par->Erase(sel_start_cursor.pos);
- }
- if (space_wrapped)
- simple_cut_buffer->InsertChar(i - sel_start_cursor.pos, ' ');
endpar = sel_end_cursor.par->Next();
- }
- else {
- /* cut more than one paragraph */
-
- sel_end_cursor.par->BreakParagraphConservative(sel_end_cursor.pos);
- /* insert a space at the end if there was one */
- if (space_wrapped)
- sel_end_cursor.par->InsertChar(sel_end_cursor.par->Last(), ' ');
+ } 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;
-
- /* please break behind a space, if there is one. The space should
- * be copied too */
- if (sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos))
- sel_start_cursor.pos++;
-
- sel_start_cursor.par->BreakParagraphConservative(sel_start_cursor.pos);
- if (!sel_start_cursor.pos
- || sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos - 1)
- || sel_start_cursor.par->IsNewline(sel_start_cursor.pos - 1)) {
- sel_start_cursor.par->Next()->InsertChar(0, ' ');
- }
-
- /* 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;
+
+ 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 */
+ // 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 */
+ // care about footnotes
if (simple_cut_buffer->footnoteflag) {
- LyXParagraph *tmppar = simple_cut_buffer;
+ LyXParagraph * tmppar = simple_cut_buffer;
while (tmppar){
tmppar->footnoteflag = LyXParagraph::NO_FOOTNOTE;
tmppar = tmppar->next;
}
}
- /* the cut selection should begin with standard layout */
+ // the cut selection should begin with standard layout
simple_cut_buffer->Clear();
- /* paste the paragraphs again, if possible */
+ // 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();
+ }
-
- /* maybe a forgotten blank */
- if (sel_start_cursor.pos
- && sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos)
- && sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos - 1)) {
- sel_start_cursor.par->Erase(sel_start_cursor.pos);
- }
- }
-
-
- /* sometimes necessary */
+ // sometimes necessary
if (doclear)
sel_start_cursor.par->ClearParagraph();
UpdateCounters(cursor.row);
}
-
-void LyXText::CopySelection()
+#else ///////////////////////////////////////////////////////////////////
+
+void LyXText::CutSelection(bool doclear)
{
- int i=0;
+ // This doesn't make sense, if there is no selection
+ if (!selection)
+ return;
- /* this doesnt make sense, if there is no selection */
- if (!selection) {
+ // 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 = sel_end_cursor.par->Next();
- /* ok we have a selection. This is always between sel_start_cursor
- * and sel_end cursor */
- LyXParagraph *tmppar;
+ // 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;
+
+ // 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){
+ || 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."));
+ 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*/
+ /* 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."));
+ WriteAlert(_("Impossible operation"),
+ _("Don't know what to do with half tables."),
+ _("sorry."));
return;
}
}
- /* table stuff -- end*/
+ /* table stuff -- end */
- /* delete the simple_cut_buffer */
+ // delete the simple_cut_buffer
DeleteSimpleCutBuffer();
- /* set the textclass */
- simple_cut_buffer_textclass = parameters->textclass;
+ // 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.pos < sel_end_cursor.pos))
sel_start_cursor.pos++;
- /* there are two cases: copy only within one paragraph or more than one paragraph */
+ // 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();
- for (i=sel_start_cursor.pos; i< sel_end_cursor.pos; i++){
+ // 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);
+ } 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;
tmppar = tmppar->next;
tmppar2->next = tmppar->Clone();
tmppar2->next->previous = tmppar2;
- tmppar2=tmppar2->next;
+ tmppar2 = tmppar2->next;
}
tmppar2->next = 0;
- /* care about footnotes */
+ // care about footnotes
if (simple_cut_buffer->footnoteflag) {
tmppar = simple_cut_buffer;
while (tmppar){
- tmppar->footnoteflag = LyXParagraph::NO_FOOTNOTE;
+ tmppar->footnoteflag =
+ LyXParagraph::NO_FOOTNOTE;
tmppar = tmppar->next;
}
}
-
- /* the simple_cut_buffer paragraph is too big */
- int tmpi2;
-
- tmpi2 = sel_start_cursor.par->PositionInParFromPos(sel_start_cursor.pos);
- for (;tmpi2;tmpi2--)
+
+ // 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 */
+
+ // 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->last > tmpi2) {
- tmppar2->Erase(tmppar2->last-1);
+ 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;
+
+ /* 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();
+ }
+ }
+
+ /* 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 */
+
+ // 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++;
+
+ CutAndPaste cap;
+
+ cap.copySelection(sel_start_cursor.par, sel_end_cursor.par,
+ sel_start_cursor.pos, sel_end_cursor.pos,
+ buffer->params.textclass);
}
-
+#endif
+#ifdef USE_OLD_CUT_AND_PASTE
void LyXText::PasteSelection()
{
- /* this does not make sense, if there is nothing to paste */
+ // this does not make sense, if there is nothing to paste
if (!simple_cut_buffer)
return;
- LyXParagraph *tmppar;
- LyXParagraph *endpar;
+ LyXParagraph * tmppar;
+ LyXParagraph * endpar;
LyXCursor tmpcursor;
- /* be carefull with footnotes in footnotes */
+ // be carefull with footnotes in footnotes
if (cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
- /* check whether the cut_buffer includes a footnote */
+ // check whether the cut_buffer includes a footnote
tmppar = simple_cut_buffer;
- while (tmppar && tmppar->footnoteflag == LyXParagraph::NO_FOOTNOTE)
+ while (tmppar
+ && tmppar->footnoteflag == LyXParagraph::NO_FOOTNOTE)
tmppar = tmppar->next;
if (tmppar) {
WriteAlert(_("Impossible operation"),
- _("Can't paste float into float!"), _("Sorry."));
+ _("Can't paste float into float!"),
+ _("Sorry."));
return;
}
}
- /* table stuff -- begin*/
- if (cursor.par->table){
- if (simple_cut_buffer->next){
+ /* 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*/
+ /* table stuff -- end */
SetUndo(Undo::INSERT,
cursor.par->ParFromPos(cursor.pos)->previous,
tmpcursor = cursor;
- /* There are two cases: cutbuffer only one paragraph or many */
+ // There are two cases: cutbuffer only one paragraph or many
if (!simple_cut_buffer->next) {
- /* only within a paragraph */
-
- /* please break behind a space, if there is one */
- while (tmpcursor.par->Last() > tmpcursor.pos
- && tmpcursor.par->IsLineSeparator(tmpcursor.pos))
- tmpcursor.pos++;
+ // only within a paragraph
tmppar = simple_cut_buffer->Clone();
- /* table stuff -- begin*/
+ /* table stuff -- begin */
bool table_too_small = false;
if (tmpcursor.par->table) {
- while (simple_cut_buffer->last && !table_too_small){
+ 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++;
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.pos++;
}
}
- } else {
- /* table stuff -- end*/
- while (simple_cut_buffer->last){
- 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 */
+ // many paragraphs
+ CutAndPaste cap;
- /* make a copy of the simple cut_buffer */
+ // make a copy of the simple cut_buffer
tmppar = simple_cut_buffer;
- LyXParagraph *simple_cut_clone = tmppar->Clone();
- LyXParagraph *tmppar2 = simple_cut_clone;
+ 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;
tmppar = tmppar->next;
tmppar2->next = tmppar->Clone();
tmppar2->next->previous = tmppar2;
- tmppar2=tmppar2->next;
+ tmppar2 = tmppar2->next;
if (cursor.par->footnoteflag){
tmppar->footnoteflag = cursor.par->footnoteflag;
tmppar->footnotekind = cursor.par->footnotekind;
}
}
- /* make sure there is no class difference */
- SwitchLayoutsBetweenClasses(simple_cut_buffer_textclass,
- parameters->textclass,
- simple_cut_buffer);
+ // 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 */
+ // 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;
+ // find the end of the buffer
+ LyXParagraph * lastbuffer = simple_cut_buffer;
while (lastbuffer->Next())
- lastbuffer=lastbuffer->Next();
-
- /* find the physical end of the buffer */
- lastbuffer = simple_cut_buffer;
- while (lastbuffer->Next())
- lastbuffer=lastbuffer->Next();
-
- /* please break behind a space, if there is one. The space
- * should be copied too */
- if (cursor.par->Last() > cursor.pos && cursor.par->IsLineSeparator(cursor.pos))
- cursor.pos++;
+ lastbuffer = lastbuffer->Next();
bool paste_the_end = false;
- /* open the paragraph for inserting the simple_cut_buffer
- if necessary */
+ // 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;
}
-
- /* be careful with double spaces */
- if ((!cursor.par->Last()
- || cursor.par->IsLineSeparator(cursor.pos - 1)
- || cursor.par->IsNewline(cursor.pos - 1))
- && simple_cut_buffer->last
- && simple_cut_buffer->IsLineSeparator(0))
- simple_cut_buffer->Erase(0);
-
- /* set the end for redoing later */
+
+ // 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());
+ // 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);
+ 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 */
+ // store the new cursor position
tmpcursor.par = lastbuffer;
tmpcursor.pos = lastbuffer->Last();
- /* maybe some pasting */
+ // maybe some pasting
if (lastbuffer->Next() && paste_the_end) {
if (lastbuffer->Next()->HasSameLayout(lastbuffer)) {
-
- /* be careful witth double spaces */
- if ((!lastbuffer->Last()
- || lastbuffer->IsLineSeparator(lastbuffer->Last() - 1)
- || lastbuffer->IsNewline(lastbuffer->Last() - 1))
- && lastbuffer->Next()->Last()
- && lastbuffer->Next()->IsLineSeparator(0))
- lastbuffer->Next()->Erase(0);
-
lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph();
- }
- else if (!lastbuffer->Next()->Last()) {
+ } else if (!lastbuffer->Next()->Last()) {
lastbuffer->Next()->MakeSameLayout(lastbuffer);
-
- /* be careful witth double spaces */
- if ((!lastbuffer->Last()
- || lastbuffer->IsLineSeparator(lastbuffer->Last() - 1)
- || lastbuffer->IsNewline(lastbuffer->Last() - 1))
- && lastbuffer->Next()->Last()
- && lastbuffer->Next()->IsLineSeparator(0))
- lastbuffer->Next()->Erase(0);
-
lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph();
- }
- else if (!lastbuffer->Last()) {
+ } else if (!lastbuffer->Last()) {
lastbuffer->MakeSameLayout(lastbuffer->next);
-
- /* be careful witth double spaces */
- if ((!lastbuffer->Last()
- || lastbuffer->IsLineSeparator(lastbuffer->Last() - 1)
- || lastbuffer->IsNewline(lastbuffer->Last() - 1))
- && lastbuffer->Next()->Last()
- && lastbuffer->Next()->IsLineSeparator(0))
- lastbuffer->Next()->Erase(0);
-
lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph();
- }
- else lastbuffer->Next()->ClearParagraph();
+ } else
+ lastbuffer->Next()->ClearParagraph();
}
- /* restore the simple cut buffer */
+ // restore the simple cut buffer
simple_cut_buffer = simple_cut_clone;
}
SetSelection();
UpdateCounters(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()
+// returns a pointer to the very first LyXParagraph
+LyXParagraph * LyXText::FirstParagraph() const
{
- return params->paragraph;
+ return buffer->paragraph;
}
-/* returns true if the specified string is at the specified position */
-bool LyXText::IsStringInText(LyXParagraph *par, int pos, char const* string)
+// returns true if the specified string is at the specified position
+bool LyXText::IsStringInText(LyXParagraph * par,
+ LyXParagraph::size_type pos,
+ char const * str) const
{
if (par) {
int i = 0;
- while (pos+i < par->Last() && string[i] &&
- string[i]==par->GetChar(pos+i))
- {
- i++;
+ while (pos + i < par->Last() && str[i] &&
+ str[i] == par->GetChar(pos + i)) {
+ ++i;
}
-
- if (!string[i])
+ if (!str[i])
return true;
}
return false;
}
-/* sets the selection over the number of characters of string, no check!! */
-void LyXText::SetSelectionOverString(char const* string)
+// sets the selection over the number of characters of string, no check!!
+void LyXText::SetSelectionOverString(char const * string)
{
sel_cursor = cursor;
- int i;
- for (i=0; string[i]; i++)
+ for (int i = 0; string[i]; ++i)
CursorRight();
SetSelection();
}
-/* simple replacing. The font of the first selected character is used */
-void LyXText::ReplaceSelectionWithString(char const* string)
+// simple replacing. The font of the first selected character is used
+void LyXText::ReplaceSelectionWithString(char const * str)
{
SetCursorParUndo();
FreezeUndo();
- if (!selection) { /* create a dummy selection */
+ if (!selection) { // create a dummy selection
sel_end_cursor = cursor;
sel_start_cursor = cursor;
}
// Get font setting before we cut
- int pos = sel_end_cursor.pos;
+ LyXParagraph::size_type pos = sel_end_cursor.pos;
LyXFont font = sel_start_cursor.par->GetFontSettings(sel_start_cursor.pos);
// Insert the new string
- for (int i=0; string[i];i++) {
- sel_end_cursor.par->InsertChar(pos, string[i]);
+ for (int i = 0; str[i]; ++i) {
+ sel_end_cursor.par->InsertChar(pos, str[i]);
sel_end_cursor.par->SetFont(pos, font);
- pos++;
+ ++pos;
}
// Cut the selection
}
-/* if the string can be found: return true and set the cursor to
- * the new position */
-bool LyXText::SearchForward(char const* string)
+// if the string can be found: return true and set the cursor to
+// the new position
+bool LyXText::SearchForward(char const * str) const
{
- LyXParagraph *par = cursor.par;
- int pos = cursor.pos;
-
- while (par && !IsStringInText(par,pos,string)) {
- if (pos<par->Last()-1)
- pos++;
+ LyXParagraph * par = cursor.par;
+ LyXParagraph::size_type pos = cursor.pos;
+ while (par && !IsStringInText(par, pos, str)) {
+ if (pos < par->Last() - 1)
+ ++pos;
else {
pos = 0;
par = par->Next();
}
}
if (par) {
- SetCursor(par,pos);
+ SetCursor(par, pos);
return true;
}
else
}
-bool LyXText::SearchBackward(char const* string)
+bool LyXText::SearchBackward(char const * string) const
{
- LyXParagraph *par = cursor.par;
+ LyXParagraph * par = cursor.par;
int pos = cursor.pos;
do {
- if (pos>0)
- pos--;
+ if (pos > 0)
+ --pos;
else {
// We skip empty paragraphs (Asger)
do {
par = par->Previous();
if (par)
- pos = par->Last()-1;
- } while (par && pos<0);
+ pos = par->Last() - 1;
+ } while (par && pos < 0);
}
- } while (par && !IsStringInText(par,pos,string));
+ } while (par && !IsStringInText(par, pos, string));
if (par) {
- SetCursor(par,pos);
+ SetCursor(par, pos);
return true;
- }
- else
+ } else
return false;
}
-/* needed to insert the selection */
-void LyXText::InsertStringA(char* string)
+// needed to insert the selection
+void LyXText::InsertStringA(string const & str)
{
- LyXParagraph *par = cursor.par;
- int pos = cursor.pos;
- int a = 0;
+ 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();
-
- char flag = lyxstyle.Style(parameters->textclass,
- cursor.par->GetLayout())->isEnvironment();
- /* only to be sure, should not be neccessary */
+
+ bool flag =
+ textclasslist.Style(buffer->params.textclass,
+ cursor.par->GetLayout()).isEnvironment();
+ // only to be sure, should not be neccessary
ClearSelection();
-
- /* insert the string, don't insert doublespace */
- int i=0;
- int i2 = 0;
-
- for (i2=i;string[i2]&&string[i2]!='\n';i2++);
- par->Enlarge(pos, i2 - i);
- while (string[i]) {
- if (string[i]!='\n') {
- if (string[i]==' ' && (string[i+1]!=' ')
- && pos && par->GetChar(pos-1)!=' ') {
+
+ // insert the string, don't insert doublespace
+ string::size_type i = 0;
+ while (i < str.length()) {
+ if (str[i] != '\n') {
+ if (str[i] == ' '
+ && i + 1 < str.length() && str[i + 1] != ' '
+ && pos && par->GetChar(pos - 1)!= ' ') {
par->InsertChar(pos,' ');
- pos++;
- }
- else if (par->table) {
- if (string[i] == '\t') {
- while((pos < par->last) &&
- (par->GetChar(pos) != LYX_META_NEWLINE))
- pos++;
- if (pos < par->last)
- pos++;
- else // no more fields to fill skip the rest
- break;
- } else if ((string[i] != 13) &&
- (((unsigned char) string[i] & 127) >= ' ')) {
- par->InsertChar(pos,string[i]);
- pos++;
- }
- }
- else if (string[i]==' ') {
- par->InsertChar(pos,LYX_META_PROTECTED_SEPARATOR);
- pos++;
- }
- else if (string[i]=='\t') {
- for (a=pos; a<(pos/8+1)*8 ; a++) {
- par->InsertChar(a,LYX_META_PROTECTED_SEPARATOR);
+ par->SetFont(pos, current_font);
+ ++pos;
+ } else if (par->table) {
+ if (str[i] == '\t') {
+ while((pos < par->size()) &&
+ (par->GetChar(pos) != LyXParagraph::META_NEWLINE))
+ ++pos;
+ if (pos < par->size())
+ ++pos;
+ else // no more fields to fill skip the rest
+ break;
+ } else if ((str[i] != 13) &&
+ ((str[i] & 127) >= ' ')) {
+ par->InsertChar(pos, str[i]);
+ par->SetFont(pos, current_font);
+ ++pos;
+ }
+ } 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);
+ } else {
+ delete new_inset;
+ }
+ ++pos;
+ } else if (str[i] == '\t') {
+ for (a = pos; a < (pos / 8 + 1) * 8 ; ++a) {
+ 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);
+ } else {
+ delete new_inset;
+ }
}
pos = a;
- }
- else if (string[i]!=13 &&
- // Ignore unprintables
- ((unsigned char) string[i] & 127) >= ' ') {
- par->InsertChar(pos,string[i]);
- pos++;
+ } else if (str[i] != 13 &&
+ // Ignore unprintables
+ (str[i] & 127) >= ' ') {
+ par->InsertChar(pos, str[i]);
+ par->SetFont(pos, current_font);
+ ++pos;
}
} else {
if (par->table) {
- if (!string[i+1]) {
- pos++;
+ if (i + 1 >= str.length()) {
+ ++pos;
break;
}
- while((pos < par->last) &&
- (par->GetChar(pos) != LYX_META_NEWLINE))
- pos++;
- pos++;
- cell=NumberOfCell(par,pos);
- while((pos < par->last) &&
+ while((pos < par->size()) &&
+ (par->GetChar(pos) != LyXParagraph::META_NEWLINE))
+ ++pos;
+ ++pos;
+ cell = NumberOfCell(par, pos);
+ while((pos < par->size()) &&
!(par->table->IsFirstCell(cell))) {
- while((pos < par->last) &&
- (par->GetChar(pos) != LYX_META_NEWLINE))
- pos++;
- pos++;
- cell=NumberOfCell(par,pos);
+
+ while((pos < par->size()) &&
+ (par->GetChar(pos) != LyXParagraph::META_NEWLINE))
+ ++pos;
+ ++pos;
+ cell = NumberOfCell(par, pos);
}
- if (pos >= par->last)
+ if (pos >= par->size())
// no more fields to fill skip the rest
break;
} else {
- if (!par->last) {
- par->InsertChar(pos,LYX_META_PROTECTED_SEPARATOR);
- pos++;
+ 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);
+ } else {
+ delete new_inset;
+ }
+ ++pos;
}
par->BreakParagraph(pos, flag);
par = par->Next();
pos = 0;
}
- for (i2=i;string[i2]&&string[i2]!='\n';i2++);
- par->Enlarge(pos, i2 - i);
}
-
- i++;
+ ++i;
}
-
- RedoParagraphs(cursor,endpar);
+
+ RedoParagraphs(cursor, endpar);
SetCursor(cursor.par, cursor.pos);
sel_cursor = cursor;
SetCursor(par, pos);
SetSelection();
}
+
/* turns double-CR to single CR, others where converted into one blank and 13s
* 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(char* string)
-{
- LyXParagraph *par = cursor.par;
- int i=1;
- while (string[i]) {
- if (string[i]=='\t' && !par->table)
- string[i] = ' ';
- if (string[i]==' ' && string[i+1]==' ')
- string[i] = 13;
- if (string[i]=='\n' && string[i+1] && !par->table){
- if (string[i+1]!='\n') {
- if (string[i-1]!=' ')
- string[i]=' ';
+void LyXText::InsertStringB(string const & s)
+{
+ string str(s);
+ LyXParagraph * par = cursor.par;
+ string::size_type i = 1;
+ while (i < str.length()) {
+ if (str[i] == '\t' && !par->table)
+ str[i] = ' ';
+ if (str[i] == ' ' && i + 1 < str.length() && str[i + 1] == ' ')
+ str[i] = 13;
+ if (str[i] == '\n' && i + 1 < str.length() && !par->table){
+ if (str[i + 1] != '\n') {
+ if (str[i - 1] != ' ')
+ str[i] = ' ';
else
- string[i]= 13;
+ str[i] = 13;
}
- while (string[i+1] && (string[i+1]==' '
- || string[i+1]=='\t'
- || string[i+1]=='\n'
- || string[i+1]==13)) {
- string[i+1]=13;
- i++;
+ while (i + 1 < str.length()
+ && (str[i + 1] == ' '
+ || str[i + 1] == '\t'
+ || str[i + 1] == '\n'
+ || str[i + 1] == 13)) {
+ str[i + 1] = 13;
+ ++i;
}
}
- i++;
+ ++i;
}
- InsertStringA(string);
+ InsertStringA(str);
}
-bool LyXText::GotoNextError()
+bool LyXText::GotoNextError() const
{
- LyXCursor res=cursor;
+ LyXCursor res = cursor;
do {
- if (res.pos < res.par->Last()-1) {
+ if (res.pos < res.par->Last() - 1) {
res.pos++;
}
else {
- res.par=res.par->Next();
+ res.par = res.par->Next();
res.pos = 0;
}
} while (res.par &&
- !(res.par->GetChar(res.pos)==LYX_META_INSET
+ !(res.par->GetChar(res.pos) == LyXParagraph::META_INSET
&& res.par->GetInset(res.pos)->AutoDelete()));
if (res.par) {
SetCursor(res.par, res.pos);
return true;
}
-
return false;
}
-bool LyXText::GotoNextNote()
+bool LyXText::GotoNextNote() const
{
- LyXCursor res=cursor;
+ LyXCursor res = cursor;
do {
- if (res.pos < res.par->Last()-1) {
+ if (res.pos < res.par->Last() - 1) {
res.pos++;
- }
- else {
- res.par=res.par->Next();
+ } else {
+ res.par = res.par->Next();
res.pos = 0;
}
} while (res.par &&
- !(res.par->GetChar(res.pos)==LYX_META_INSET
- && res.par->GetInset(res.pos)->LyxCode()==Inset::IGNORE_CODE));
+ !(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);
return true;
}
-
return false;
}
-int LyXText::SwitchLayoutsBetweenClasses(char class1, char class2,
- LyXParagraph *par)
+void LyXText::CheckParagraph(LyXParagraph * par,
+ LyXParagraph::size_type pos)
{
- InsetError * new_inset = 0;
- int ret = 0;
- if (!par || class1 == class2)
- return ret;
- par = par->FirstPhysicalPar();
- while (par) {
- string name = lyxstyle.NameOfLayout(class1, par->layout);
- int lay = lyxstyle.NumberOfLayout(class2, name);
- if (lay == -1) // layout not found
- // use default layout "Stadard" (0)
- lay = 0;
- par->layout = lay;
-
- if (name != lyxstyle.NameOfLayout(class2, par->layout)) {
- ret++;
- string s= "Layout had to be changed from\n"
- + name + " to " + lyxstyle.NameOfLayout(class2, par->layout)
- + "\nbecause of class conversion from\n"
- + lyxstyle.NameOfClass(class1) + " to "
- + lyxstyle.NameOfClass(class2);
- new_inset = new InsetError(s);
- par->InsertChar(0, LYX_META_INSET);
- par->InsertInset(0, new_inset);
- }
-
- par = par->next;
- }
- return ret;
-}
-
+ LyXCursor tmpcursor;
-void LyXText::CheckParagraph(LyXParagraph* par, int pos)
-{
-
- LyXCursor tmpcursor;
/* table stuff -- begin*/
/* table stuff -- end*/
long y = 0;
- int z;
+ LyXParagraph::size_type z;
+ Row * row = GetRow(par, pos, y);
- Row* row = GetRow(par, pos, y);
-
- /* is there a break one row above */
+ // is there a break one row above
if (row->previous && row->previous->par == row->par) {
z = NextBreakPoint(row->previous, paperwidth);
if ( z >= row->pos) {
- /* set the dimensions of the row above */
+ // set the dimensions of the row above
y -= row->previous->height;
refresh_y = y;
refresh_row = row->previous;
BreakAgain(row->previous);
- /* set the cursor again. Otherwise dungling pointers are possible */
+ // set the cursor again. Otherwise
+ // dangling pointers are possible
SetCursor(cursor.par, cursor.pos);
sel_cursor = cursor;
return;
}
int tmpheight = row->height;
- int tmplast = RowLast(row);
+ LyXParagraph::size_type tmplast = RowLast(row);
refresh_y = y;
refresh_row = row;
else
status = LyXText::NEED_MORE_REFRESH;
- /* check the special right address boxes */
- if (lyxstyle.Style(parameters->textclass, par->GetLayout())->margintype == MARGIN_RIGHT_ADDRESS_BOX) {
+ // check the special right address boxes
+ if (textclasslist.Style(buffer->params.textclass,
+ par->GetLayout()).margintype
+ == MARGIN_RIGHT_ADDRESS_BOX) {
tmpcursor.par = par;
tmpcursor.row = row;
tmpcursor.y = y;
}
- /* set the cursor again. Otherwise dangling pointers are possible */
+ // set the cursor again. Otherwise dangling pointers are possible
// also set the selection
- if (selection){
+ if (selection) {
tmpcursor = cursor;
SetCursorIntern(sel_cursor.par, sel_cursor.pos);
sel_cursor = cursor;
}
-/* returns 0 if inset wasn't found */
-int LyXText::UpdateInset(Inset* inset)
+// returns 0 if inset wasn't found
+int LyXText::UpdateInset(Inset * inset)
{
- int pos;
- LyXParagraph *par;
-
- /* first check the current paragraph */
- pos = cursor.par->GetPositionOfInset(inset);
+ // first check the current paragraph
+ int pos = cursor.par->GetPositionOfInset(inset);
if (pos != -1){
CheckParagraph(cursor.par, pos);
return 1;
}
- /* check every paragraph */
+ // check every paragraph
- par = FirstParagraph();
+ LyXParagraph * par = FirstParagraph();
do {
- /* make sure the paragraph is open */
+ // make sure the paragraph is open
if (par->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE){
pos = par->GetPositionOfInset(inset);
if (pos != -1){
}
-void LyXText::SetCursor(LyXParagraph *par, int pos)
+void LyXText::SetCursor(LyXParagraph * par,
+ LyXParagraph::size_type pos, bool setfont) const
{
LyXCursor old_cursor = cursor;
- SetCursorIntern(par, pos);
+ SetCursorIntern(par, pos, setfont);
DeleteEmptyParagraphMechanism(old_cursor);
}
-void LyXText::SetCursorIntern(LyXParagraph *par, int pos)
+void LyXText::SetCursor(LyXCursor & cur, LyXParagraph * par,
+ LyXParagraph::size_type pos) const
{
- long y;
- Row *row;
- int left_margin;
- LyXParagraph *tmppar;
+ // 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;
+ }
+
+ cur.par = par;
+ cur.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 */
+ 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;
+ 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);
+ else
+ /// Place cursor before char at (logical) position pos
+ cursor_vpos = !(bidi_level(pos) % 2)
+ ? log2vis(pos) : log2vis(pos) + 1;
+
+ /* 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;
+
+ 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);
+ }
+ }
- /* correct the cursor position if impossible */
+ cur.x = int(x);
+ cur.x_fix = cur.x;
+ cur.row = row;
+}
+
+
+void LyXText::SetCursorIntern(LyXParagraph * par,
+ LyXParagraph::size_type pos, bool setfont) 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()){
- tmppar = par->ParFromPos(pos);
+ LyXParagraph * tmppar = par->ParFromPos(pos);
pos = par->PositionInParFromPos(pos);
par = tmppar;
}
par = par->previous ;
if (par->IsDummy() &&
par->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE)
- pos += par->last + 1;
+ pos += par->size() + 1;
}
if (par->previous) {
par = par->previous;
}
- pos += par->last + 1;
+ pos += par->size() + 1;
}
cursor.par = par;
cursor.pos = pos;
/* get the cursor y position in text */
- row = GetRow(par, pos, y);
+ 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;
- left_margin = LabelEnd(row);
PrepareToPrint(row, x, fill_separator, fill_hfill, fill_label_hfill);
- int main_body = BeginningOfMainBody(row->par);
-
+ 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;
+
/* 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 (pos = row->pos; pos < cursor.pos; pos++) {
+ 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++;
+ ++cell;
x += row->par->table->GetBeginningOfTextInCell(cell);
} else {
x += SingleWidth(row->par, pos);
}
}
- } else
+ } else {
/* table stuff -- end*/
-
- for (pos = row->pos; pos < cursor.pos; pos++) {
- if (pos && pos == main_body
- && !row->par->IsLineSeparator(pos - 1)) {
- x += GetFont(row->par, -2).stringWidth(
- lyxstyle.Style(parameters->textclass, row->par->GetLayout())->labelsep);
- if (x < left_margin)
- x = left_margin;
+ 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;
+
+ 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);
}
-
- x += SingleWidth(row->par, pos);
if (HfillExpansion(row, pos)) {
+ x += SingleWidth(row->par, pos);
if (pos >= main_body)
x += fill_hfill;
else
x += fill_label_hfill;
}
- else if (pos >= main_body && row->par->IsSeparator(pos)) {
- x+= fill_separator;
- }
-
- if (pos + 1 == main_body
- && row->par->IsLineSeparator(pos)) {
- x += GetFont(row->par, -2).stringWidth(
- lyxstyle.Style(parameters->textclass, row->par->GetLayout())->labelsep);
- if (row->par->IsLineSeparator(pos))
- x-= SingleWidth(row->par, pos);
- if (x < left_margin)
- x = left_margin;
- }
+ 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;
-
- 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))
- )) {
- 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);
+#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);
+ }
}
}
-void LyXText::SetCursorFromCoordinates(int x, long y)
+void LyXText::SetCursorFromCoordinates(int x, long y) const
{
- Row *row;
- int column;
-
- LyXCursor old_cursor;
-
- old_cursor = cursor;
+ LyXCursor old_cursor = cursor;
/* get the row first */
- row = GetRowNearY(y);
+ Row * row = GetRowNearY(y);
cursor.par = row->par;
- column = GetColumnNearX(row, x);
+ int column = GetColumnNearX(row, x);
cursor.pos = row->pos + column;
cursor.x = x;
cursor.y = y + row->baseline;
|| 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);
DeleteEmptyParagraphMechanism(old_cursor);
}
+void LyXText::SetCursorFromCoordinates(LyXCursor & cur, int x, long y) const
+{
+ /* get the row first */
+
+ Row * row = GetRowNearY(y);
+ int column = GetColumnNearX(row, x);
+
+ cur.par = row->par;
+ cur.pos = row->pos + column;
+ cur.x = x;
+ cur.y = y + row->baseline;
+ cur.row = row;
+}
+
-void LyXText::CursorLeft()
+void LyXText::CursorLeft() 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) {
+ cursor.par->table->CellHasContRow(cursor.par->table->GetCellAbove(cell)) < 0) {
CursorUp();
}
}
}
-void LyXText::CursorLeftIntern()
+void LyXText::CursorLeftIntern() const
{
if (cursor.pos > 0) {
SetCursor(cursor.par, cursor.pos - 1);
}
- else if (cursor.par->Previous()) {
+ else if (cursor.par->Previous()) { // steps into the above paragraph.
SetCursor(cursor.par->Previous(), cursor.par->Previous()->Last());
}
}
-void LyXText::CursorRight()
+void LyXText::CursorRight() const
{
CursorRightIntern();
if (cursor.par->table) {
}
-void LyXText::CursorRightIntern()
+void LyXText::CursorRightIntern() const
{
if (cursor.pos < cursor.par->Last()) {
SetCursor(cursor.par, cursor.pos + 1);
}
-void LyXText::CursorUp()
+void LyXText::CursorUp() const
{
SetCursorFromCoordinates(cursor.x_fix,
cursor.y - cursor.row->baseline - 1);
}
-void LyXText::CursorDown()
+void LyXText::CursorDown() const
{
if (cursor.par->table &&
cursor.par->table->ShouldBeVeryLastRow(NumberOfCell(cursor.par, cursor.pos)) &&
}
-void LyXText::CursorUpParagraph()
+void LyXText::CursorUpParagraph() const
{
if (cursor.pos > 0) {
SetCursor(cursor.par, 0);
}
-void LyXText::CursorDownParagraph()
+void LyXText::CursorDownParagraph() const
{
if (cursor.par->Next()) {
SetCursor(cursor.par->Next(), 0);
} else {
- SetCursor(cursor.par,cursor.par->Last());
+ SetCursor(cursor.par, cursor.par->Last());
}
}
-void LyXText::DeleteEmptyParagraphMechanism(LyXCursor old_cursor)
+void LyXText::DeleteEmptyParagraphMechanism(LyXCursor const & old_cursor) const
{
- bool deleted = false;
+ // 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)
+ return;
+
+ bool deleted = false;
- /* this is the delete-empty-paragraph-mechanism. */
- if (selection)
- return;
-
- // Paragraph should not be deleted if empty
- if ((lyxstyle.Style(parameters->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()
- //&& (
- // impossible to insert your own \caption with
- // this set. made it impossible to use the
- // optional argument...
- // also empty pars in fig or tab never was removed(?)(Lgb)
- //lyxstyle.Style(parameters->textclass,
-// old_cursor.par->GetLayout())->labeltype!=LABEL_SENSITIVE ||
- // (old_cursor.par->footnoteflag == LyXParagraph::NO_FOOTNOTE
- //|| (old_cursor.par->footnotekind != LyXParagraph::FIG
- // && old_cursor.par->footnotekind != LyXParagraph::TAB)))
- ) {
-
- /* ok, we will delete anything */
+ /* Ok I'll put some comments here about what is missing.
+ I have fixed BackSpace (and thus Delete) to not delete
+ double-spaces automagically. I have also changed Cut,
+ Copy and Paste to hopefully do some sensible things.
+ There are still some small problems that can lead to
+ double spaces stored in the document file or space at
+ the beginning of paragraphs. This happens if you have
+ the cursor betwenn to spaces and then save. Or if you
+ cut and paste and the selection have a space at the
+ beginning and then save right after the paste. I am
+ sure none of these are very hard to fix, but I will
+ put out 1.1.4pre2 with FIX_DOUBLE_SPACE defined so
+ that I can get some feedback. (Lgb)
+ */
+
+ // 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
+ // 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.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());
+ // correct cursor
+ if (old_cursor.par == cursor.par &&
+ cursor.pos > old_cursor.pos) {
+ SetCursorIntern(cursor.par, cursor.pos - 1);
+ } else
+ SetCursorIntern(cursor.par, cursor.pos);
+ return;
+ }
+ }
+
+ // Do not delete empty paragraphs with keepempty set.
+ if ((textclasslist.Style(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()) {
+ // 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))
- )){
- status = LyXText::NEED_MORE_REFRESH;
- deleted = true;
+ // 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))
+ )) {
+ 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;
- tmpcursor = cursor;
- cursor = old_cursor; // that undo can restore the right cursor position
- 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,
- endpar);
- cursor = tmpcursor;
-
- /* delete old row */
- RemoveRow(old_cursor.row);
- if (params->paragraph == old_cursor.par) {
- params->paragraph = params->paragraph->next;
- }
- /* delete old par */
- delete old_cursor.par;
+ 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;
+ if (endpar && endpar->GetDepth()) {
+ while (endpar && endpar->GetDepth()) {
+ endpar = endpar->LastPhysicalPar()->Next();
+ }
+ }
+ SetUndo(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;
+ }
+ // delete old 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);
- }
- SetHeightOfRow(refresh_row);
- }
- else {
- refresh_row = old_cursor.row->next;
- refresh_y = old_cursor.y - old_cursor.row->baseline;
+ /* 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);
+ }
+ SetHeightOfRow(refresh_row);
+ } else {
+ 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;
- if (endpar && endpar->GetDepth()) {
- while (endpar && endpar->GetDepth()) {
- endpar = endpar->LastPhysicalPar()->Next();
- }
- }
- SetUndo(Undo::DELETE,
- old_cursor.par->previous,
- endpar);
- cursor = tmpcursor;
-
- /* delete old row */
- RemoveRow(old_cursor.row);
- /* delete old par */
- if (params->paragraph == old_cursor.par) {
- params->paragraph = params->paragraph->next;
- }
- delete old_cursor.par;
+ tmpcursor = cursor;
+ cursor = old_cursor; // that undo can restore the right cursor position
+ 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,
+ endpar);
+ cursor = tmpcursor;
+
+ // delete old row
+ RemoveRow(old_cursor.row);
+ // delete old par
+ if (buffer->paragraph == old_cursor.par) {
+ buffer->paragraph = buffer->paragraph->next;
+ }
+ 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) {
- BreakAgain(refresh_row);
- UpdateCounters(refresh_row->previous);
- }
- }
+ /* 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) {
+ BreakAgain(refresh_row);
+ UpdateCounters(refresh_row->previous);
+ }
+ }
- /* correct cursor y */
- SetCursor(cursor.par, cursor.pos);
-
- /* if (cursor.y > old_cursor.y)
- cursor.y -= old_cursor.row->height; */
-
- 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());
- /* correct cursor y */
- SetCursor(cursor.par, cursor.pos);
- sel_cursor = cursor;
- }
- }
- } else if (cursor.par->table && (cursor.row != old_cursor.row)) {
- int cell = NumberOfCell(old_cursor.par, old_cursor.pos);
- if (old_cursor.par->table->IsContRow(cell) &&
- IsEmptyTableRow(&old_cursor)) {
- RemoveTableRow(&old_cursor);
- RedoParagraph();
- }
- }
+ // correct cursor y
+
+ SetCursorIntern(cursor.par, 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());
+ // correct cursor y
+ SetCursorIntern(cursor.par, cursor.pos);
+ sel_cursor = cursor;
+ }
+ }
+ }
}
-LyXParagraph* LyXText::GetParFromID(int id)
+LyXParagraph * LyXText::GetParFromID(int id)
{
- LyXParagraph* result = FirstParagraph();
- while (result && result->GetID() != id)
+ LyXParagraph * result = FirstParagraph();
+ while (result && result->id() != id)
result = result->next;
return result;
}
// undo functions
-bool LyXText::TextUndo()
-{ // returns false if no undo possible
- Undo *undo = params->undostack.Pop();
- if (undo){
+bool LyXText::TextUndo()
+{
+ // returns false if no undo possible
+ Undo * undo = buffer->undostack.pop();
+ if (undo) {
FinishUndo();
if (!undo_frozen)
- params->redostack.Push(CreateUndo(undo->kind,
- GetParFromID(undo->number_of_before_par),
- GetParFromID(undo->number_of_behind_par)));
+ buffer->redostack
+ .push(CreateUndo(undo->kind,
+ GetParFromID(undo->number_of_before_par),
+ GetParFromID(undo->number_of_behind_par)));
}
return TextHandleUndo(undo);
}
bool LyXText::TextRedo()
-{ // returns false if no redo possible
- Undo *undo = params->redostack.Pop();
- if (undo){
+{
+ // returns false if no redo possible
+ Undo * undo = buffer->redostack.pop();
+ if (undo) {
FinishUndo();
if (!undo_frozen)
- params->undostack.Push(CreateUndo(undo->kind,
- GetParFromID(undo->number_of_before_par),
- GetParFromID(undo->number_of_behind_par)));
+ buffer->undostack
+ .push(CreateUndo(undo->kind,
+ GetParFromID(undo->number_of_before_par),
+ GetParFromID(undo->number_of_behind_par)));
}
return TextHandleUndo(undo);
}
-bool LyXText::TextHandleUndo(Undo* undo){ // returns false if no undo possible
+bool LyXText::TextHandleUndo(Undo * undo)
+{
+ // returns false if no undo possible
bool result = false;
- if (undo){
- LyXParagraph* before = GetParFromID(undo->number_of_before_par);
- LyXParagraph* behind = GetParFromID(undo->number_of_behind_par);
- LyXParagraph* tmppar;
- LyXParagraph* tmppar2;
- LyXParagraph* tmppar3;
- LyXParagraph* tmppar4;
- LyXParagraph* endpar;
- LyXParagraph* tmppar5;
+ if (undo) {
+ LyXParagraph * before =
+ GetParFromID(undo->number_of_before_par);
+ LyXParagraph * behind =
+ GetParFromID(undo->number_of_behind_par);
+ LyXParagraph * tmppar;
+ LyXParagraph * tmppar2;
+ LyXParagraph * endpar;
+ LyXParagraph * tmppar5;
- /*
- if (before){
- before->text[before->last] = 0;
- printf("before: %s\n", before->text);
- }
- if (behind){
- behind->text[behind->last] = 0;
- printf("behind: %s\n", behind->text);
- }
- */
-
- // if there's no before take the beginning of the document for redoing
+ // if there's no before take the beginning
+ // of the document for redoing
if (!before)
SetCursorIntern(FirstParagraph(), 0);
// replace the paragraphs with the undo informations
- tmppar3 = undo->par;
+ LyXParagraph * tmppar3 = undo->par;
undo->par = 0; // otherwise the undo destructor would delete the paragraph
- tmppar4 = tmppar3;
+ LyXParagraph * tmppar4 = tmppar3;
if (tmppar4){
while (tmppar4->next)
tmppar4 = tmppar4->next;
if (before)
tmppar5 = before->next;
else
- tmppar5 = params->paragraph;
+ tmppar5 = buffer->paragraph;
tmppar2 = tmppar3;
while (tmppar5 && tmppar5 != behind){
tmppar = tmppar5;
tmppar5 = tmppar5->next;
// a memory optimization for edit: Only layout information
// is stored in the undo. So restore the text informations.
- if (undo->kind == Undo::EDIT){
- tmppar2->text = tmppar->text;
- tmppar->text = 0;
+ if (undo->kind == Undo::EDIT) {
+ tmppar2->setContentsFromPar(tmppar);
+ tmppar->clearContents();
tmppar2 = tmppar2->next;
}
- if ( currentrow && currentrow->par == tmppar )
- currentrow = currentrow -> previous;
- delete tmppar;
}
}
if (before)
before->next = tmppar3;
else
- params->paragraph = tmppar3;
+ buffer->paragraph = tmppar3;
tmppar3->previous = before;
}
else {
if (!before)
- params->paragraph = behind;
+ buffer->paragraph = behind;
}
if (tmppar4) {
tmppar4->next = behind;
// Set the cursor for redoing
- if (before){
+ if (before) {
SetCursorIntern(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){
- tmppar4 =before;
+ tmppar4 = before;
while (tmppar4->previous &&
tmppar4->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE)
tmppar4 = tmppar4->previous;
void LyXText::FinishUndo()
-{ // makes sure the next operation will be stored
+{
+ // makes sure the next operation will be stored
undo_finished = True;
}
void LyXText::FreezeUndo()
-{ // this is dangerous and for internal use only
+{
+ // this is dangerous and for internal use only
undo_frozen = True;
}
void LyXText::UnFreezeUndo()
-{ // this is dangerous and for internal use only
+{
+ // this is dangerous and for internal use only
undo_frozen = false;
}
-void LyXText::SetUndo(Undo::undo_kind kind, LyXParagraph *before, LyXParagraph *behind)
+void LyXText::SetUndo(Undo::undo_kind kind, LyXParagraph const * before,
+ LyXParagraph const * behind) const
{
if (!undo_frozen)
- params->undostack.Push(CreateUndo(kind, before, behind));
- params->redostack.Clear();
+ buffer->undostack.push(CreateUndo(kind, before, behind));
+ buffer->redostack.clear();
}
-void LyXText::SetRedo(Undo::undo_kind kind, LyXParagraph *before, LyXParagraph *behind)
+void LyXText::SetRedo(Undo::undo_kind kind, LyXParagraph const * before,
+ LyXParagraph const * behind)
{
- params->redostack.Push(CreateUndo(kind, before, behind));
+ buffer->redostack.push(CreateUndo(kind, before, behind));
}
-Undo* LyXText::CreateUndo(Undo::undo_kind kind, LyXParagraph *before,
- LyXParagraph *behind)
+Undo * LyXText::CreateUndo(Undo::undo_kind kind, LyXParagraph const * before,
+ LyXParagraph const * behind) const
{
int before_number = -1;
int behind_number = -1;
if (before)
- before_number = before->GetID();
+ before_number = before->id();
if (behind)
- behind_number = behind->GetID();
+ behind_number = behind->id();
// Undo::EDIT and Undo::FINISH are
// always finished. (no overlapping there)
// overlapping only with insert and delete inside one paragraph:
if (!undo_finished && kind != Undo::EDIT &&
kind != Undo::FINISH){
// check wether storing is needed
- if (params->undostack.Top() &&
- params->undostack.Top()->kind == kind &&
- params->undostack.Top()->number_of_before_par == before_number &&
- params->undostack.Top()->number_of_behind_par == behind_number ){
+ 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 ){
// no undo needed
return 0;
}
}
// create a new Undo
- LyXParagraph* undopar;
- LyXParagraph* tmppar;
- LyXParagraph *tmppar2;
+ LyXParagraph * undopar;
+ LyXParagraph * tmppar;
+ LyXParagraph * tmppar2;
- LyXParagraph* start = 0;
- LyXParagraph* end = 0;
+ LyXParagraph * start = 0;
+ LyXParagraph * end = 0;
if (before)
start = before->next;
end = end->next;
}
- if (start && end && start != end->next && (before != behind || (!before && !behind))) {
+ if (start && end
+ && start != end->next
+ && (before != behind || (!before && !behind))) {
tmppar = start;
tmppar2 = tmppar->Clone();
- tmppar2->SetID(tmppar->GetID());
+ tmppar2->id(tmppar->id());
- // a memory optimization: Just store the layout information when only edit
+ // a memory optimization: Just store the layout information
+ // when only edit
if (kind == Undo::EDIT){
- if (tmppar2->text)
- delete[] tmppar2->text;
- tmppar2->text = 0;
+ //tmppar2->text.clear();
+ tmppar2->clearContents();
}
undopar = tmppar2;
while (tmppar != end && tmppar->next) {
tmppar = tmppar->next;
tmppar2->next = tmppar->Clone();
- tmppar2->next->SetID(tmppar->GetID());
- // a memory optimization: Just store the layout information when only edit
+ tmppar2->next->id(tmppar->id());
+ // a memory optimization: Just store the layout
+ // information when only edit
if (kind == Undo::EDIT){
- if (tmppar2->next->text)
- delete[] tmppar2->next->text;
- tmppar2->next->text = 0;
+ //tmppar2->next->text.clear();
+ tmppar2->clearContents();
}
tmppar2->next->previous = tmppar2;
- tmppar2=tmppar2->next;
+ tmppar2 = tmppar2->next;
}
tmppar2->next = 0;
- }
- else
+ } else
undopar = 0; // nothing to replace (undo of delete maybe)
- int cursor_par = cursor.par->ParFromPos(cursor.pos)->GetID();
+ 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,
- cursor_par, cursor_pos,
- undopar);
+ Undo * undo = new Undo(kind,
+ before_number, behind_number,
+ cursor_par, cursor_pos,
+ undopar);
undo_finished = false;
return undo;
cursor.par->ParFromPos(cursor.pos)->next);
}
-void LyXText::RemoveTableRow(LyXCursor *cursor)
-{
- int
- cell_act,
- cell = -1,
- cell_org = 0,
- ocell = 0;
-
- /* move to the previous row */
- cell_act = NumberOfCell(cursor->par, cursor->pos);
- if (cell < 0)
- cell = cell_act;
- while (cursor->pos && !cursor->par->IsNewline(cursor->pos-1))
- cursor->pos--;
- while (cursor->pos &&
- !cursor->par->table->IsFirstCell(cell_act)){
- cursor->pos--;
- while (cursor->pos && !cursor->par->IsNewline(cursor->pos-1))
- cursor->pos--;
- cell--;
- cell_act--;
- }
- /* now we have to pay attention if the actual table is the
- main row of TableContRows and if yes to delete all of them */
- if (!cell_org)
- cell_org = cell;
- do {
- ocell = cell;
- /* delete up to the next row */
- while (cursor->pos < cursor->par->Last() &&
- (cell_act == ocell
- || !cursor->par->table->IsFirstCell(cell_act))){
- while (cursor->pos < cursor->par->Last() &&
- !cursor->par->IsNewline(cursor->pos))
- cursor->par->Erase(cursor->pos);
- cell++;
- cell_act++;
- if (cursor->pos < cursor->par->Last())
- cursor->par-> Erase(cursor->pos);
- }
- if (cursor->pos && cursor->pos == cursor->par->Last()){
- cursor->pos--;
- cursor->par->Erase(cursor->pos); // no newline at the very end!
- }
- } while (((cell+1) < cursor->par->table->GetNumberOfCells()) &&
- !cursor->par->table->IsContRow(cell_org) &&
- cursor->par->table->IsContRow(cell));
- cursor->par->table->DeleteRow(cell_org);
- return;
-}
-bool LyXText::IsEmptyTableRow(LyXCursor *old_cursor)
+void LyXText::RemoveTableRow(LyXCursor * cur) const
{
- if (!old_cursor->par->table)
- return false;
-#ifdef I_DONT_KNOW_IF_I_SHOULD_DO_THIS
- int
- pos = old_cursor->pos,
- cell = NumberOfCell(old_cursor->par, pos);
-
- // search first charater of this table row
- while (pos && !old_cursor->par->table->IsFirstCell(cell)) {
- pos--;
- while (pos && !old_cursor->par->IsNewline(pos-1))
- pos--;
- cell--;
- }
- if (!old_cursor->par->IsNewline(pos))
- return false;
- cell++;
- pos++;
- while ((pos < old_cursor->par->Last()) &&
- !old_cursor->par->table->IsFirstCell(cell)) {
- if (!old_cursor->par->IsNewline(pos))
- return false;
- pos++;
- cell++;
- }
- return true;
-#endif
- return false;
+ int cell = -1;
+ int cell_org = 0;
+ int ocell = 0;
+
+ // move to the previous row
+ 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--;
+ --cell;
+ --cell_act;
+ }
+ // now we have to pay attention if the actual table is the
+ // main row of TableContRows and if yes to delete all of them
+ if (!cell_org)
+ cell_org = cell;
+ do {
+ ocell = cell;
+ // delete up to the next row
+ 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);
+ ++cell;
+ ++cell_act;
+ 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!
+ }
+ } 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;
}
-bool LyXText::IsEmptyTableCell()
+bool LyXText::IsEmptyTableCell() const
{
- int pos = cursor.pos - 1;
-
- while ((pos>=0) && (pos < cursor.par->Last()) &&
- !cursor.par->IsNewline(pos))
- pos--;
- return cursor.par->IsNewline(pos+1);
+ 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);
}
+
void LyXText::toggleAppendix(){
- LyXParagraph* par = cursor.par->FirstPhysicalPar();
- bool start = !par->start_of_appendix;
-
- /* ensure that we have only one start_of_appendix in this document */
- LyXParagraph* tmp = FirstParagraph();
- for (;tmp;tmp=tmp->next)
- tmp->start_of_appendix = 0;
- par->start_of_appendix = start;
-
- /* we can set the refreshing parameters now */
- status = LyXText::NEED_MORE_REFRESH;
- refresh_y = 0;
- refresh_row = 0; // not needed for full update
- UpdateCounters(0);
- SetCursor(cursor.par, cursor.pos);
+ LyXParagraph * par = cursor.par->FirstPhysicalPar();
+ bool start = !par->start_of_appendix;
+
+ // ensure that we have only one start_of_appendix in this document
+ LyXParagraph * tmp = FirstParagraph();
+ for (; tmp; tmp = tmp->next)
+ tmp->start_of_appendix = 0;
+ par->start_of_appendix = start;
+
+ // we can set the refreshing parameters now
+ status = LyXText::NEED_MORE_REFRESH;
+ refresh_y = 0;
+ refresh_row = 0; // not needed for full update
+ UpdateCounters(0);
+ SetCursor(cursor.par, cursor.pos);
}