* LyX, The Document Processor
*
* Copyright 1995 Matthias Ettrich
- * Copyright 1995-1999 The LyX Team.
+ * Copyright 1995-2000 The LyX Team.
*
* ====================================================== */
#include "LyXView.h"
#include "lyxrow.h"
#include "Painter.h"
+#include "tracer.h"
using std::max;
using std::min;
static const int LYX_PAPER_MARGIN = 20;
-extern LyXRC * lyxrc;
// ale070405
extern int bibitemMaxWidth(Painter &, LyXFont const &);
// The most common case is handled first (Asger)
if (IsPrintable(c)) {
- if (lyxrc->rtl_support && lyxrc->font_norm == "iso8859-6.8x")
+ if (lyxrc.rtl_support && lyxrc.font_norm == "iso8859-6.8x")
c = TransformChar(c, par, pos);
return font.width(c);
void LyXText::ComputeBidiTables(Row * row) const
{
- if (!lyxrc->rtl_support) {
+ if (!lyxrc.rtl_support) {
bidi_start = -1;
return;
}
} else {
if (level == 0 ||
(level == 1 && direction == LYX_DIR_RIGHT_TO_LEFT
- && row->par->getFont(lpos).direction() ==
- LyXFont::RTL_DIR
- && row->par->getFont(lpos).latex() ==
- LyXFont::ON ) ) {
+ && row->par->getFont(lpos).isRightToLeft()
+ && row->par->getFont(lpos).latex() == LyXFont::ON
+ ) ) {
// The last check is needed when the
// char is a space
stack[level++] = lpos;
// So IMHO we should go with the easier and clearer implementation.
// And even if 1024 is a large number here it might overflow, string
// will only overflow if the machine is out of memory...
- bool do_transform = (lyxrc->rtl_support && lyxrc->font_norm == "iso8859-6.8x");
+ bool do_transform = (lyxrc.rtl_support && lyxrc.font_norm == "iso8859-6.8x");
if (do_transform)
c = TransformChar(c, row->par, pos);
static string textstring;
if (cursor.par->table) {
int cell = NumberOfCell(cursor.par, cursor.pos);
if (cursor.par->table->ShouldBeVeryLastCell(cell))
- SetCursor(cursor.par, cursor.par->text.size());
+ SetCursor(cursor.par, cursor.par->size());
}
/* table stuff -- end */
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)->text.size());
+ cursor.pos + cursor.par->ParFromPos(cursor.pos)->size());
/* the cursor must be exactly before the footnote */
par = cursor.par->ParFromPos(cursor.pos);
/* insert the new cells */
int number = cursor.par->table->NumberOfCellsInRow(cell_org);
- for (int i = 0; i < number; ++i)
+ Language const * lang = cursor.par->getParLanguage();
+ LyXFont font(LyXFont::ALL_INHERIT,lang);
+ for (int i = 0; i < number; ++i) {
cursor.par->InsertChar(pos, LyXParagraph::META_NEWLINE);
+ cursor.par->SetFont(pos, font);
+ }
/* append the row into the table */
cursor.par->table->AppendRow(cell_org);
/* insert the new cells */
int number = cursor.par->table->NumberOfCellsInRow(cell_org);
- for (int i = 0; i < number; ++i)
+ Language const * lang = cursor.par->getParLanguage();
+ LyXFont font(LyXFont::ALL_INHERIT,lang);
+ for (int i = 0; i < number; ++i) {
cursor.par->InsertChar(pos, LyXParagraph::META_NEWLINE);
-
+ cursor.par->SetFont(pos, font);
+ }
+
/* append the row into the table */
cursor.par->table->AppendContRow(cell_org);
RedoParagraph();
LyXParagraph::size_type pos = 0;
int cell_org = actCell;
int cell = 0;
+ Language const * lang = cursor.par->getParLanguage();
+ LyXFont font(LyXFont::ALL_INHERIT,lang);
do{
if (pos && (cursor.par->IsNewline(pos-1))){
if (cursor.par->table->AppendCellAfterCell(cell_org, cell)) {
cursor.par->InsertChar(pos, LyXParagraph::META_NEWLINE);
+ cursor.par->SetFont(pos, font);
if (pos <= cursor.pos)
cursor.pos++;
++pos;
} while (pos <= cursor.par->Last());
/* remember that the very last cell doesn't end with a newline.
This saves one byte memory per table ;-) */
- if (cursor.par->table->AppendCellAfterCell(cell_org, cell))
- cursor.par->InsertChar(cursor.par->Last(), LyXParagraph::META_NEWLINE);
+ if (cursor.par->table->AppendCellAfterCell(cell_org, cell)) {
+ LyXParagraph::size_type last = cursor.par->Last();
+ cursor.par->InsertChar(last, LyXParagraph::META_NEWLINE);
+ cursor.par->SetFont(last, font);
+ }
/* append the column into the table */
cursor.par->table->AppendColumn(cell_org);
// dummy-paragraph !!
// not necessar anymore with UNDO :)
for (LyXParagraph::size_type i =
- cursor.par->text.size() - 1; i >= 0; --i)
+ cursor.par->size() - 1; i >= 0; --i)
cursor.par->Erase(i);
RedoParagraph();
return;
LyXParagraph::size_type tmppos =
cursor.par->PositionInParFromPos(cursor.pos);
while (tmppos < tmppar->size()) {
- unsigned char c = tmppar->text[tmppos];
+ //unsigned char c = tmppar->text[tmppos];
+ unsigned char c = tmppar->GetChar(tmppos);
if (IsKommaChar(c) || IsLineSeparatorChar(c))
break;
if (c != LyXParagraph::META_INSET) {
}
}
- tmppar->text[tmppos] = c;
+ //tmppar->text[tmppos] = c;
+ tmppar->SetChar(tmppos, c);
++tmppos;
}
CheckParagraph(tmppar, tmppos);
}
-void LyXText::Backspace()
+void LyXText::Backspace()
{
- LyXParagraph * tmppar;
- Row * tmprow, * row;
- long y;
- int tmpheight;
-
+ DebugTracer trc1("LyXText::Backspace");
+
/* table stuff -- begin */
if (cursor.par->table) {
BackspaceInTable();
LyXFont rawparfont = cursor.par->GetFontSettings(lastpos - 1);
if (cursor.pos == 0) {
+ DebugTracer trc("LyXText::Backspace cursor.pos == 0");
+
+ // The cursor is at the beginning of a paragraph, so the the backspace
+ // will collapse two paragraphs into one.
+
// we may paste some paragraphs
// is it an empty paragraph?
if ((lastpos == 0
|| (lastpos == 1 && cursor.par->IsSeparator(0)))
&& !(cursor.par->Next()
- && cursor.par->footnoteflag ==
- LyXParagraph::NO_FOOTNOTE
- && cursor.par->Next()->footnoteflag ==
- LyXParagraph::OPEN_FOOTNOTE)) {
+ && cursor.par->footnoteflag == LyXParagraph::NO_FOOTNOTE
+ && cursor.par->Next()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)) {
+ // This is an empty paragraph and we delete it just by moving the curosr one step
+ // left and let the DeleteEmptyParagraphMechanism handle the actual deleteion
+ // of the paragraph.
if (cursor.par->previous) {
- tmppar = cursor.par->previous->FirstPhysicalPar();
+ LyXParagraph * tmppar = cursor.par->previous->FirstPhysicalPar();
if (cursor.par->GetLayout() == tmppar->GetLayout()
&& cursor.par->footnoteflag == tmppar->footnoteflag
&& cursor.par->GetAlign() == tmppar->GetAlign()) {
-
+ // Inherit botom DTD from the paragraph below.
+ // (the one we are deleting)
tmppar->line_bottom = cursor.par->line_bottom;
tmppar->added_space_bottom = cursor.par->added_space_bottom;
tmppar->pagebreak_bottom = cursor.par->pagebreak_bottom;
CursorLeftIntern();
// the layout things can change the height of a row !
- tmpheight = cursor.row->height;
+ int tmpheight = cursor.row->height;
SetHeightOfRow(cursor.row);
if (cursor.row->height != tmpheight) {
refresh_y = cursor.y - cursor.row->baseline;
return;
}
}
+
if (cursor.par->ParFromPos(cursor.pos)->previous){
SetUndo(Undo::DELETE,
cursor.par->ParFromPos(cursor.pos)->previous->previous,
cursor.par->ParFromPos(cursor.pos)->next);
}
- tmppar = cursor.par;
- tmprow = cursor.row;
+
+ LyXParagraph * tmppar = cursor.par;
+ Row * tmprow = cursor.row;
CursorLeftIntern();
#warning See comment on top of text.C
/* Pasting is not allowed, if the paragraphs have different
*/
if (cursor.par != tmppar
&& (cursor.par->GetLayout() == tmppar->GetLayout()
- || !tmppar->GetLayout())
+ || tmppar->GetLayout() == 0 /*standard*/)
&& cursor.par->footnoteflag == tmppar->footnoteflag
/* table stuff -- begin*/
&& !cursor.par->table /* no pasting of tables */
/* table stuff -- end*/
&& cursor.par->GetAlign() == tmppar->GetAlign()) {
-
+
+ RemoveParagraph(tmprow);
+ RemoveRow(tmprow);
cursor.par->PasteParagraph();
- if (!(cursor.pos &&
- cursor.par->IsSeparator(cursor.pos - 1)))
- cursor.par->InsertChar(cursor.pos, ' ');
+ if (!cursor.pos || !cursor.par->IsSeparator(cursor.pos - 1))
+ ; //cursor.par->InsertChar(cursor.pos, ' ');
+ // strangely enough it seems that commenting out the line above removes
+ // most or all of the segfaults. I will however also try to move the
+ // two Remove... lines in front of the PasteParagraph too.
else
if (cursor.pos)
cursor.pos--;
refresh_y = cursor.y - cursor.row->baseline;
// remove the lost paragraph
- RemoveParagraph(tmprow);
- RemoveRow(tmprow);
+ // This one is not safe, since the paragraph that the tmprow and the
+ // following rows belong to has been deleted by the PasteParagraph
+ // above. The question is... could this be moved in front of the
+ // PasteParagraph?
+ //RemoveParagraph(tmprow);
+ //RemoveRow(tmprow);
- AppendParagraph(cursor.row);
+ AppendParagraph(cursor.row); // This rebuilds the rows.
UpdateCounters(cursor.row);
// the row may have changed, block, hfills etc.
SetCursor(cursor.par, cursor.pos);
}
} else {
+ DebugTracer trc("LyXText::Backspace normal backspace");
+
/* this is the code for a normal backspace, not pasting
* any paragraphs */
SetUndo(Undo::DELETE,
}
}
- row = cursor.row;
- y = cursor.y - row->baseline;
+ Row * row = cursor.row;
+ long y = cursor.y - row->baseline;
LyXParagraph::size_type z;
/* remember that a space at the end of a row doesnt count
* when calculating the fill */
if (cursor.pos && cursor.par->IsNewline(cursor.pos)) {
cursor.par->Erase(cursor.pos);
// refresh the positions
- tmprow = row;
+ Row * tmprow = row;
while (tmprow->next && tmprow->next->par == row->par) {
tmprow = tmprow->next;
tmprow->pos--;
cursor.par->Erase(cursor.pos);
// refresh the positions
- tmprow = row;
+ Row * tmprow = row;
while (tmprow->next && tmprow->next->par == row->par) {
tmprow = tmprow->next;
tmprow->pos--;
if ( z >= row->pos) {
row->pos = z + 1;
- tmprow = row->previous;
+ Row * tmprow = row->previous;
// maybe the current row is now empty
if (row->pos >= row->par->Last()) {
SetCursor(cursor.par, cursor.pos, false);
}
}
-
+ DebugTracer trc2("LyXText::Backspace wrap up");
+
// restore the current font
// That is what a user expects!
current_font = rawtmpfont;
vc = row->pos+1;
tmpx += fill_separator+SingleWidth(row->par, vis2log(row->pos));
}
-
if (row->pos > last) // Row is empty?
c = row->pos;
- else if (vc <= last) {
+ else if (vc > last ||
+ (row->par->table && vc > row->pos && row->par->IsNewline(vc)) ){
+ int pos = (vc > last+1) ? last : vc - 1;
+ c = vis2log(pos);
+ if (row->par->getLetterDirection(c) == LYX_DIR_LEFT_TO_RIGHT)
+ ++c;
+ } else {
c = vis2log(vc);
LyXDirection direction = row->par->getLetterDirection(c);
if (vc > row->pos && row->par->IsLineSeparator(c)
c = vis2log(vc-1);
if (direction == LYX_DIR_RIGHT_TO_LEFT)
++c;
- } else {
- c = vis2log(last)+1;
- if (row->par->getLetterDirection(c - 1) == LYX_DIR_RIGHT_TO_LEFT)
- --c;
}
if (!row->par->table && row->pos <= last && c > last