X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftext2.C;h=16c056c7b6d603483af90cf51ad2ec0044176fed;hb=501f1dd61b6c0beb927151ecf331f78848261b59;hp=8a04ef2b297a48e0bf9287312e3c9cae2431c361;hpb=cf3c73f4e85a8aedd92030427982aef98aae2baa;p=lyx.git diff --git a/src/text2.C b/src/text2.C index 8a04ef2b29..16c056c7b6 100644 --- a/src/text2.C +++ b/src/text2.C @@ -39,11 +39,14 @@ #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; @@ -546,8 +549,6 @@ void LyXText::incDepth(BufferView * bview) // 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) { @@ -557,7 +558,6 @@ void LyXText::incDepth(BufferView * bview) if (cursor.par()->getDepth() < prev->getMaxDepthAfter()) { cursor.par()->params().depth(cursor.par()->getDepth() + 1); - anything_changed = true; } } } @@ -566,16 +566,6 @@ void LyXText::incDepth(BufferView * bview) 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 @@ -1049,33 +1039,29 @@ void LyXText::toggleFree(BufferView * bview, 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; } @@ -1230,30 +1216,24 @@ void LyXText::setCounter(Buffer const * buf, Paragraph * par) const // 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; - string langtype; ostringstream s; if (i >= 0 && i <= buf->params.secnumdepth) { + string numbertype; + string langtype; 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"; @@ -1269,9 +1249,7 @@ void LyXText::setCounter(Buffer const * buf, Paragraph * par) const .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 textclass.counters().reset("enum"); @@ -1302,9 +1280,8 @@ void LyXText::setCounter(Buffer const * buf, Paragraph * par) const textclass.counters().step(enumcounter); s << textclass.counters() - .numberLabel(enumcounter, - "enumeration", langtype); - par->params().labelString(s.str().c_str()); + .numberLabel(enumcounter, "enumeration"); + par->params().labelString(STRCONV(s.str())); } } else if (layout->labeltype == LABEL_BIBLIO) {// ale970302 textclass.counters().step("bibitem"); @@ -1328,7 +1305,8 @@ void LyXText::setCounter(Buffer const * buf, Paragraph * par) const 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 { @@ -1343,15 +1321,22 @@ void LyXText::setCounter(Buffer const * buf, Paragraph * par) const 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); @@ -1374,14 +1359,11 @@ void LyXText::setCounter(Buffer const * buf, Paragraph * par) const } -// 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(); @@ -1390,18 +1372,18 @@ void LyXText::updateCounters(BufferView * bview) const 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(); } } @@ -1437,7 +1419,9 @@ void LyXText::copyEnvironmentType() void LyXText::pasteEnvironmentType(BufferView * bview) { - setLayout(bview, copylayouttype); + // do nothing if there has been no previous copyEnvironmentType() + if (!copylayouttype.empty()) + setLayout(bview, copylayouttype); } @@ -1509,7 +1493,8 @@ void LyXText::cutSelection(BufferView * bview, bool doclear, bool realcut) // 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(); @@ -1573,14 +1558,13 @@ void LyXText::pasteSelection(BufferView * bview) } -// 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); } @@ -1817,7 +1801,11 @@ void LyXText::setCursor(BufferView * bview, LyXCursor & cur, Paragraph * par, 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);