#include "insets/insetspecialchar.h"
#include "insets/insettext.h"
#include "insets/insetfloat.h"
+#include "insets/insetwrap.h"
#include "support/LAssert.h"
#include "support/textutils.h"
#include "support/lstrings.h"
+#include "BoostFormat.h"
+
using std::vector;
using std::copy;
using std::endl;
LyXText::LyXText(BufferView * bv)
- : number_of_rows(0), height(0), width(0), first_y(0),
+ : height(0), width(0), first_y(0),
bv_owner(bv), inset_owner(0), the_locking_inset(0),
need_break_row(0), refresh_y(0), refresh_row(0),
status_(LyXText::UNCHANGED), firstrow(0), lastrow(0)
LyXText::LyXText(InsetText * inset)
- : number_of_rows(0), height(0), width(0), first_y(0),
+ : height(0), width(0), first_y(0),
bv_owner(0), inset_owner(inset), the_locking_inset(0),
need_break_row(0), refresh_y(0), refresh_row(0),
status_(LyXText::UNCHANGED), firstrow(0), lastrow(0)
need_break_row = 0;
width = height = 0;
copylayouttype.erase();
- number_of_rows = first_y = refresh_y = 0;
+ first_y = refresh_y = 0;
status_ = LyXText::UNCHANGED;
} else if (firstrow)
return;
}
setCursorIntern(bview, firstrow->par(), 0);
selection.cursor = cursor;
+
+ updateCounters(bview);
}
while (par && par_depth && !tmpfont.resolved()) {
par = par->outerHook();
if (par) {
-#ifndef INHERIT_LANGUAGE
tmpfont.realize(par->layout()->font);
-#else
- tmpfont.realize(tclass[par->layout()]->font,
- buf->params.language);
-#endif
par_depth = par->getDepth();
}
}
-#ifndef INHERIT_LANGUAGE
tmpfont.realize(tclass.defaultfont());
-#else
- tmpfont.realize(tclass.defaultfont(), buf->params.language);
-#endif
return tmpfont;
}
LyXFont f = par->getFontSettings(buf->params, pos);
if (par->inInset())
par->inInset()->getDrawFont(f);
-#ifndef INHERIT_LANGUAGE
return f.realize(layout->reslabelfont);
-#else
- return f.realize(layout.reslabelfont, buf->params.language);
-#endif
} else {
LyXFont f = par->getFontSettings(buf->params, pos);
if (par->inInset())
par->inInset()->getDrawFont(f);
-#ifndef INHERIT_LANGUAGE
return f.realize(layout->resfont);
-#else
- return f.realize(layout.resfont, buf->params.language);
-#endif
}
}
}
LyXFont tmpfont = par->getFontSettings(buf->params, pos);
-#ifndef INHERIT_LANGUAGE
tmpfont.realize(layoutfont);
-#else
- tmpfont.realize(layoutfont, buf->params.language);
-#endif
+
if (par->inInset())
par->inInset()->getDrawFont(tmpfont);
while (!layoutfont.resolved() && tp && tp->getDepth()) {
tp = tp->outerHook();
if (tp)
-#ifndef INHERIT_LANGUAGE
layoutfont.realize(tp->layout()->font);
-#else
- layoutfont.realize(tclass[tp->layout()].font,
- buf->params.language);
-#endif
}
}
-#ifndef INHERIT_LANGUAGE
layoutfont.realize(tclass.defaultfont());
-#else
- layoutfont.realize(tclass.defaultfont(), buf->params.language);
-#endif
// Now, reduce font against full layout font
font.reduce(layoutfont);
if (row == lastrow)
lastrow = tmprow;
- ++number_of_rows;
}
height -= row->height(); // the text becomes smaller
delete row;
- --number_of_rows; // one row less
}
// insert a new row, starting at position 0
insertRow(row, par, 0);
- // set the counters
- setCounter(bview->buffer(), par);
-
// and now append the whole paragraph behind the new row
if (!row) {
firstrow->height(0);
// and sel_end cursor
cursor = selection.start;
- bool anything_changed = false;
-
while (true) {
// NOTE: you can't change the depth of a bibliography entry
if (cursor.par()->layout()->labeltype != LABEL_BIBLIO) {
if (cursor.par()->getDepth()
< prev->getMaxDepthAfter()) {
cursor.par()->params().depth(cursor.par()->getDepth() + 1);
- anything_changed = true;
}
}
}
cursor.par(cursor.par()->next());
}
- // if nothing changed set all depth to 0
- if (!anything_changed) {
- cursor = selection.start;
- while (cursor.par() != selection.end.par()) {
- cursor.par()->params().depth(0);
- cursor.par(cursor.par()->next());
- }
- cursor.par()->params().depth(0);
- }
-
redoParagraphs(bview, selection.start, endpar);
// we have to reset the selection, because the
current_font = real_current_font;
current_font.reduce(layoutfont);
// And resolve it completely
-#ifndef INHERIT_LANGUAGE
real_current_font.realize(layoutfont);
-#else
- real_current_font.realize(layoutfont,
- bview->buffer()->params.language);
-#endif
+
return;
}
string LyXText::getStringToIndex(BufferView * bview)
{
- string idxstring;
-
// Try implicit word selection
// If there is a change in the language the implicit word selection
// is disabled.
LyXCursor const reset_cursor = cursor;
bool const implicitSelection = selectWordWhenUnderCursor(bview, PREVIOUS_WORD);
- if (!selection.set()) {
+ string idxstring;
+ if (!selection.set())
bview->owner()->message(_("Nothing to index!"));
- return string();
- }
- if (selection.start.par() != selection.end.par()) {
+ else if (selection.start.par() != selection.end.par())
bview->owner()->message(_("Cannot index more than one paragraph!"));
- return string();
- }
+ else
+ idxstring = selectionAsString(bview->buffer(), false);
- idxstring = selectionAsString(bview->buffer(), false);
+ // Reset cursors to their original position.
+ cursor = reset_cursor;
+ setCursor(bview, cursor.par(), cursor.pos());
+ selection.cursor = cursor;
- // Implicit selections are cleared afterwards
- //and cursor is set to the original position.
- if (implicitSelection) {
+ // Clear the implicit selection.
+ if (implicitSelection)
clearSelection();
- cursor = reset_cursor;
- setCursor(bview, cursor.par(), cursor.pos());
- selection.cursor = cursor;
- }
+
return idxstring;
}
par->params().appendix(par->previous()->params().appendix());
if (!par->params().appendix() && par->params().startOfAppendix()) {
par->params().appendix(true);
- buf->counters().reset();
+ textclass.counters().reset();
}
par->enumdepth = par->previous()->enumdepth;
par->itemdepth = par->previous()->itemdepth;
// is it a layout that has an automatic label?
if (layout->labeltype >= LABEL_COUNTER_CHAPTER) {
+ int const i = layout->labeltype - LABEL_COUNTER_CHAPTER;
- int i = layout->labeltype - LABEL_COUNTER_CHAPTER;
- string numbertype, langtype;
ostringstream s;
if (i >= 0 && i <= buf->params.secnumdepth) {
+ string numbertype;
+ string langtype;
- buf->counters().step(buf->counters().sects[i]);
+ textclass.counters().step(layout->latexname());
// Is there a label? Useful for Chapter layout
if (!par->params().appendix()) {
- if (!layout->labelstring().empty())
- par->params().labelString(layout->labelstring());
- else
- par->params().labelString(string());
+ s << layout->labelstring();
} else {
- if (!layout->labelstring_appendix().empty())
- par->params().labelString(layout->labelstring_appendix());
- else
- par->params().labelString(string());
+ s << layout->labelstring_appendix();
}
- // Use if an integer is here less than elegant. For now.
+ // Use of an integer is here less than elegant. For now.
int head = textclass.maxcounter() - LABEL_COUNTER_CHAPTER;
if (!par->params().appendix()) {
numbertype = "sectioning";
langtype = "latin";
}
- s << buf->counters().numberLabel(buf->counters().sects[i],
- numbertype, langtype, head);
+ s << textclass.counters()
+ .numberLabel(layout->latexname(),
+ numbertype, langtype, head);
- par->params().labelString(par->params().labelString() + s.str().c_str());
- // We really want to remove the c_str as soon as
- // possible...
+ par->params().labelString(STRCONV(s.str()));
// reset enum counters
- buf->counters().reset("enum");
+ textclass.counters().reset("enum");
} else if (layout->labeltype < LABEL_COUNTER_ENUMI) {
- buf->counters().reset("enum");
+ textclass.counters().reset("enum");
} else if (layout->labeltype == LABEL_COUNTER_ENUMI) {
- buf->counters().step(buf->counters().enums[par->enumdepth]);
+ // FIXME
+ // Yes I know this is a really, really! bad solution
+ // (Lgb)
+ string enumcounter("enum");
+
+ switch (par->enumdepth) {
+ case 2:
+ enumcounter += 'i';
+ case 1:
+ enumcounter += 'i';
+ case 0:
+ enumcounter += 'i';
+ break;
+ case 3:
+ enumcounter += "iv";
+ break;
+ default:
+ // not a valid enumdepth...
+ break;
+ }
- s << buf->counters().numberLabel(buf->counters().enums[par->enumdepth],
- "enumeration", langtype);
- par->params().labelString(s.str().c_str());
+ textclass.counters().step(enumcounter);
+ s << textclass.counters()
+ .numberLabel(enumcounter, "enumeration");
+ par->params().labelString(STRCONV(s.str()));
}
} else if (layout->labeltype == LABEL_BIBLIO) {// ale970302
- buf->counters().step("bibitem");
- int number = buf->counters().value("bibitem");
+ textclass.counters().step("bibitem");
+ int number = textclass.counters().value("bibitem");
if (!par->bibkey) {
- InsetCommandParams p("bibitem" );
+ InsetCommandParams p("bibitem");
par->bibkey = new InsetBibKey(p);
}
par->bibkey->setCounter(number);
while (tmppar && tmppar->inInset()
// the single '=' is intended below
&& (in = tmppar->inInset()->owner())) {
- if (in->lyxCode() == Inset::FLOAT_CODE) {
+ if (in->lyxCode() == Inset::FLOAT_CODE ||
+ in->lyxCode() == Inset::WRAP_CODE) {
isOK = true;
break;
} else {
if (isOK) {
Floating const & fl
- = floatList.getType(static_cast<InsetFloat*>(in)->type());
+ = textclass.floats().getType(static_cast<InsetFloat*>(in)->type());
- buf->counters().step(fl.name());
+ textclass.counters().step(fl.type());
// Doesn't work... yet.
+#warning use boost.format
+#if USE_BOOST_FORMAT
+ s = boost::io::str(boost::format(_("%1$s #:")) % fl.name());
+ // s << boost::format(_("%1$s %1$d:")
+ // % fl.name()
+ // % buf->counters().value(fl.name());
+#else
ostringstream o;
- //o << fl.name() << " " << buf->counters().value(fl.name()) << ":";
+ //o << fl.name() << ' ' << buf->counters().value(fl.name()) << ":";
o << fl.name() << " #:";
- s = o.str();
+ s = STRCONV(o.str());
+#endif
} else {
// par->SetLayout(0);
// s = layout->labelstring;
- s = (par->getParLanguage(buf->params)->lang() == "hebrew")
- ? " :úåòîùî øñç" : "Senseless: ";
+ s = _("Senseless: ");
}
}
par->params().labelString(s);
- // reset the enumeration counter. They are always resetted
+ // reset the enumeration counter. They are always reset
// when there is any other layout between
- for (int i = par->enumdepth + 1; i < 4; i++) {
- buf->counters().set(buf->counters().enums[i], 0);
+ // Just fall-through between the cases so that all
+ // enum counters deeper than enumdepth is also reset.
+ switch (par->enumdepth) {
+ case 0:
+ textclass.counters().reset("enumi");
+ case 1:
+ textclass.counters().reset("enumii");
+ case 2:
+ textclass.counters().reset("enumiii");
+ case 3:
+ textclass.counters().reset("enumiv");
}
}
}
-// Updates all counters BEHIND the row. Changed paragraphs
-// with a dynamic left margin will be rebroken.
+// Updates all counters. Paragraphs with changed label string will be rebroken
void LyXText::updateCounters(BufferView * bview) const
{
- Paragraph * par;
-
Row * row = firstrow;
- par = row->par();
+ Paragraph * par = row->par();
+
+ // CHECK if this is really needed. (Lgb)
+ bview->buffer()->params.getLyXTextClass().counters().reset();
- bview->buffer()->counters().reset();
while (par) {
while (row->par() != par)
row = row->next();
+ string const oldLabel = par->params().labelString();
+
+ // setCounter can potentially change the labelString.
setCounter(bview->buffer(), par);
- // now check for the headline layouts. remember that they
- // have a dynamic left margin
- LyXLayout_ptr const & layout = par->layout();
+ string const & newLabel = par->params().labelString();
- if (layout->margintype == MARGIN_DYNAMIC
- || layout->labeltype == LABEL_SENSITIVE) {
- // Rebreak the paragraph
+ if (oldLabel.empty() && !newLabel.empty()) {
removeParagraph(row);
appendParagraph(bview, row);
}
+
par = par->next();
}
}
void LyXText::pasteEnvironmentType(BufferView * bview)
{
- setLayout(bview, copylayouttype);
+ // do nothing if there has been no previous copyEnvironmentType()
+ if (!copylayouttype.empty())
+ setLayout(bview, copylayouttype);
}
// cutSelection can invalidate the cursor so we need to set
// it anew. (Lgb)
- cursor = selection.start;
+ // we prefer the end for when tracking changes
+ cursor = selection.end;
// need a valid cursor. (Lgb)
clearSelection();
}
-// sets the selection over the number of characters of string, no check!!
-void LyXText::setSelectionOverString(BufferView * bview, string const & str)
+void LyXText::setSelectionRange(BufferView * bview, lyx::pos_type length)
{
- if (str.empty())
+ if (!length)
return;
selection.cursor = cursor;
- for (string::size_type i = 0; i < str.length(); ++i)
+ while (length--)
cursorRight(bview);
setSelection(bview);
}
}
-bool LyXText::gotoNextInset(BufferView * bview,
- vector<Inset::Code> const & codes,
- string const & contents) const
-{
- LyXCursor res = cursor;
- Inset * inset;
- do {
- if (res.pos() < res.par()->size() - 1) {
- res.pos(res.pos() + 1);
- } else {
- res.par(res.par()->next());
- res.pos(0);
- }
-
- } while (res.par() &&
- !(res.par()->isInset(res.pos())
- && (inset = res.par()->getInset(res.pos())) != 0
- && find(codes.begin(), codes.end(), inset->lyxCode())
- != codes.end()
- && (contents.empty() ||
- static_cast<InsetCommand *>(res.par()->getInset(res.pos()))->getContents()
- == contents)));
-
- if (res.par()) {
- setCursor(bview, res.par(), res.pos(), false);
- return true;
- }
- return false;
-}
-
-
void LyXText::checkParagraph(BufferView * bview, Paragraph * par,
pos_type pos)
{
pos_type last = rowLastPrintable(old_row);
- if (pos > last + 1) {
+ // None of these should happen, but we're scaredy-cats
+ if (pos > par->size()) {
+ pos = 0;
+ cur.pos(0);
+ } else if (pos > last + 1) {
// This shouldn't happen.
pos = last + 1;
cur.pos(pos);
int y1 = cursor.iy() - first_y;
int y2 = y1;
y -= first_y;
- Inset * inset_hit =
- bview->checkInsetHit(const_cast<LyXText *>(this), x, y1);
+ Inset * inset_hit = checkInsetHit(bview, x, y1);
if (inset_hit && isHighlyEditableInset(inset_hit)) {
inset_hit->edit(bview, x, y - (y2 - y1), mouse_button::none);
}
int y1 = cursor.iy() - first_y;
int y2 = y1;
y -= first_y;
- Inset * inset_hit =
- bview->checkInsetHit(const_cast<LyXText *>(this), x, y1);
+ Inset * inset_hit = checkInsetHit(bview, x, y1);
if (inset_hit && isHighlyEditableInset(inset_hit)) {
inset_hit->edit(bview, x, y - (y2 - y1), mouse_button::none);
}