#include "font.h"
#include "debug.h"
-#define FIX_DOUBLE_SPACE 1
//#define USE_OLD_CUT_AND_PASTE 1
using std::copy;
owner_ = bv;
firstrow = 0;
lastrow = 0;
- currentrow = 0;
- currentrow_y = 0;
paperwidth = pw;
- //bparams = &p->params;
buffer = p;
number_of_rows = 0;
refresh_y = 0;
// 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
}
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;
}
}
+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(LyXTextClass::size_type layout)
{
- LyXCursor tmpcursor;
+ LyXCursor
+ tmpcursor = cursor; /* store the current cursor */
+#ifdef USE_OLD_SET_LAYOUT
// if there is no selection just set the layout
// of the current paragraph */
if (!selection) {
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;
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
}
-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;
}
/* 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 */
+* 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
return tmprow;
}
-
+
void LyXText::ToggleFree(LyXFont const & font, bool toggleall)
{
}
// 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);
}
if (!par->labelstring.empty()) {
- par->labelstring.clear();
+ par->labelstring.erase();
}
if (layout.margintype == MARGIN_MANUAL) {
if (!layout.labelstring().empty())
par->labelstring = layout.labelstring();
else
- par->labelstring.clear();
+ par->labelstring.erase();
} else {
if (!layout.labelstring_appendix().empty())
par->labelstring = layout.labelstring_appendix();
else
- par->labelstring.clear();
+ par->labelstring.erase();
}
#ifdef HAVE_SSTREAM
(Lgb)
*/
-#ifndef FIX_DOUBLE_SPACE
- bool 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)) {
- // please break before a space at the end
- sel_end_cursor.pos--;
- space_wrapped = true;
- }
- // 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++;
-#endif
// there are two cases: cut only within one paragraph or
// more than one paragraph
}
simple_cut_buffer->InsertFromMinibuffer(simple_cut_buffer->Last());
}
-#ifndef FIX_DOUBLE_SPACE
- // 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,
- ' ');
-#endif
endpar = sel_end_cursor.par->Next();
} else {
// cut more than one paragraph
sel_end_cursor.par
->BreakParagraphConservative(sel_end_cursor.pos);
-#ifndef FIX_DOUBLE_SPACE
- // insert a space at the end if there was one
- if (space_wrapped)
- sel_end_cursor.par
- ->InsertChar(sel_end_cursor.par->Last(), ' ');
-#endif
sel_end_cursor.par = sel_end_cursor.par->Next();
sel_end_cursor.pos = 0;
cursor = sel_end_cursor;
-#ifndef FIX_DOUBLE_SPACE
- // 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++;
-#endif
sel_start_cursor.par
->BreakParagraphConservative(sel_start_cursor.pos);
-#ifndef FIX_DOUBLE_SPACE
- 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, ' ');
- }
-#endif
// store the endparagraph for redoing later
endpar = sel_end_cursor.par->Next(); /* needed because
the sel_end_
||
!sel_start_cursor.par->Next()->Last())
sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->PasteParagraph();
-
-#ifndef FIX_DOUBLE_SPACE
- // 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);
- }
-#endif
}
// sometimes necessary
DeleteSimpleCutBuffer();
// set the textclass
- simple_cut_buffer_textclass = buffer->params->textclass;
+ simple_cut_buffer_textclass = buffer->params.textclass;
-#ifdef FIX_DOUBLE_SPACE
// 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++;
-#endif
+
// there are two cases: copy only within one paragraph
// or more than one paragraph
if (sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)
}
/* table stuff -- end */
-#ifdef FIX_DOUBLE_SPACE
// 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++;
-#endif
CutAndPaste cap;
if (!simple_cut_buffer->next) {
// only within a paragraph
-#ifndef FIX_DOUBLE_SPACE
- // please break behind a space, if there is one
- while (tmpcursor.par->Last() > tmpcursor.pos
- && tmpcursor.par->IsLineSeparator(tmpcursor.pos))
- tmpcursor.pos++;
-#endif
tmppar = simple_cut_buffer->Clone();
/* table stuff -- begin */
bool table_too_small = false;
else
table_too_small = true;
} else {
-#ifdef FIX_DOUBLE_SPACE
// This is an attempt to fix the
// "never insert a space at the
// beginning of a paragraph" problem.
tmpcursor.par->InsertFromMinibuffer(tmpcursor.pos);
tmpcursor.pos++;
}
-#else
- simple_cut_buffer->CutIntoMinibuffer(0);
- simple_cut_buffer->Erase(0);
- tmpcursor.par->InsertFromMinibuffer(tmpcursor.pos);
- tmpcursor.pos++;
-#endif
}
}
} else {
// the beginning of the paragraph the space should
// be removed.
while (simple_cut_buffer->size()) {
-#ifdef FIX_DOUBLE_SPACE
// This is an attempt to fix the
// "never insert a space at the
// beginning of a paragraph" problem.
tmpcursor.par->InsertFromMinibuffer(tmpcursor.pos);
tmpcursor.pos++;
}
-#else
- simple_cut_buffer->CutIntoMinibuffer(0);
- simple_cut_buffer->Erase(0);
- tmpcursor.par->InsertFromMinibuffer(tmpcursor.pos);
- tmpcursor.pos++;
-#endif
}
}
delete simple_cut_buffer;
// make sure there is no class difference
cap.SwitchLayoutsBetweenClasses(simple_cut_buffer_textclass,
- buffer->params->textclass,
+ buffer->params.textclass,
simple_cut_buffer);
// make the simple_cut_buffer exactly the same layout than
while (lastbuffer->Next())
lastbuffer = lastbuffer->Next();
-#ifndef FIX_DOUBLE_SPACE
- // 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++;
-#endif
bool paste_the_end = false;
// open the paragraph for inserting the simple_cut_buffer
paste_the_end = true;
}
-#ifndef FIX_DOUBLE_SPACE
- // be careful with double spaces
- if ((!cursor.par->Last()
- || cursor.par->IsLineSeparator(cursor.pos - 1)
- || cursor.par->IsNewline(cursor.pos - 1))
- && simple_cut_buffer->text.size()
- && simple_cut_buffer->IsLineSeparator(0))
- simple_cut_buffer->Erase(0);
-#endif
// set the end for redoing later
endpar = cursor.par->ParFromPos(cursor.pos)->next->Next();
// maybe some pasting
if (lastbuffer->Next() && paste_the_end) {
if (lastbuffer->Next()->HasSameLayout(lastbuffer)) {
-#ifndef FIX_DOUBLE_SPACE
- // be careful with 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);
-#endif
lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph();
} else if (!lastbuffer->Next()->Last()) {
lastbuffer->Next()->MakeSameLayout(lastbuffer);
-#ifndef FIX_DOUBLE_SPACE
- // 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);
-#endif
lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph();
} else if (!lastbuffer->Last()) {
lastbuffer->MakeSameLayout(lastbuffer->next);
-#ifndef FIX_DOUBLE_SPACE
- // 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);
-#endif
lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph();
} else
++pos;
}
} else if (str[i] == ' ') {
-#if 1
InsetSpecialChar * new_inset =
new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR);
if (par->InsertInsetAllowed(new_inset)) {
} else {
delete new_inset;
}
-#else
- par->InsertChar(pos, LyXParagraph::META_PROTECTED_SEPARATOR);
- par->SetFont(pos, current_font);
-#endif
++pos;
} else if (str[i] == '\t') {
for (a = pos; a < (pos / 8 + 1) * 8 ; ++a) {
-#if 1
InsetSpecialChar * new_inset =
new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR);
if (par->InsertInsetAllowed(new_inset)) {
} else {
delete new_inset;
}
-#else
- par->InsertChar(a, LyXParagraph::META_PROTECTED_SEPARATOR);
- par->SetFont(a, current_font);
-#endif
}
pos = a;
} else if (str[i] != 13 &&
break;
} else {
if (!par->size()) { // par is empty
-#if 1
InsetSpecialChar * new_inset =
new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR);
if (par->InsertInsetAllowed(new_inset)) {
} else {
delete new_inset;
}
-#else
- par->InsertChar(pos, LyXParagraph::META_PROTECTED_SEPARATOR);
- par->SetFont(pos, current_font);
-#endif
++pos;
}
par->BreakParagraph(pos, flag);
void LyXText::CheckParagraph(LyXParagraph * par,
LyXParagraph::size_type pos)
{
-
- LyXCursor tmpcursor;
+ LyXCursor tmpcursor;
+
/* table stuff -- begin*/
DeleteEmptyParagraphMechanism(old_cursor);
}
+
void LyXText::SetCursor(LyXCursor & cur, LyXParagraph * par,
LyXParagraph::size_type pos) const
{
bool deleted = false;
-#ifdef FIX_DOUBLE_SPACE
/* 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,
return;
}
}
-#endif
-#if 1
+
// Do not delete empty paragraphs with keepempty set.
if ((textclasslist.Style(buffer->params.textclass,
old_cursor.par->GetLayout())).keepempty)
}
// correct cursor y
-#if 1
+
SetCursorIntern(cursor.par, cursor.pos);
-#else
- SetCursor(cursor.par, cursor.pos);
-#endif
- /* 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
if (old_cursor.par->ClearParagraph()) {
RedoParagraphs(old_cursor, old_cursor.par->Next());
// correct cursor y
-#if 1
SetCursorIntern(cursor.par, cursor.pos);
-#else
- SetCursor(cursor.par, cursor.pos);
-#endif
sel_cursor = cursor;
}
}
}
-#endif
}
if (undo->kind == Undo::EDIT) {
tmppar2->setContentsFromPar(tmppar);
tmppar->clearContents();
- //tmppar2->text = tmppar->text;
- //tmppar->text.clear();
tmppar2 = tmppar2->next;
}
- if ( currentrow && currentrow->par == tmppar )
- currentrow = currentrow -> previous;
- // Commenting out this might remove the error
- // reported by Purify, but it might also
- // introduce a memory leak. We need to
- // check this (Lgb)
- //delete tmppar;
}
}