#include "errorlist.h"
#include "funcrequest.h"
#include "gettext.h"
+#include "insetiterator.h"
#include "lfuns.h"
#include "lyxrc.h"
#include "lyxtext.h"
#include "pariterator.h"
#include "undo.h"
+#include "insets/insetcharstyle.h"
#include "insets/insettabular.h"
#include "mathed/math_data.h"
// Now remove all out of the pars which is NOT allowed in the
// new environment and set also another font if that is required.
+ // Convert newline to paragraph break in ERT inset.
+ // This should not be here!
+ if (pars[pit].inInset() &&
+ pars[pit].inInset()->lyxCode() == InsetBase::ERT_CODE) {
+ for (ParagraphList::size_type i = 0; i < insertion.size(); ++i) {
+ for (pos_type j = 0; j < insertion[i].size(); ++j) {
+ if (insertion[i].isNewline(j)) {
+ insertion[i].erase(j);
+ breakParagraphConservative(
+ buffer.params(),
+ insertion, i, j);
+ }
+ }
+ }
+ }
+
// Make sure there is no class difference.
- lyx::cap::SwitchLayoutsBetweenClasses(textclass, tc, insertion,
- errorlist);
+ lyx::cap::SwitchBetweenClasses(textclass, tc, insertion, errorlist);
ParagraphList::iterator tmpbuf = insertion.begin();
int depth_delta = pars[pit].params().depth() - tmpbuf->params().depth();
// Set the inset owner of this paragraph.
tmpbuf->setInsetOwner(pars[pit].inInset());
for (pos_type i = 0; i < tmpbuf->size(); ++i) {
- if (tmpbuf->getChar(i) == Paragraph::META_INSET) {
- if (!pars[pit].insetAllowed(tmpbuf->getInset(i)->lyxCode()))
- tmpbuf->erase(i--);
- }
+ if (tmpbuf->getChar(i) == Paragraph::META_INSET &&
+ !pars[pit].insetAllowed(tmpbuf->getInset(i)->lyxCode()))
+ tmpbuf->erase(i--);
}
}
}
-int SwitchLayoutsBetweenClasses(textclass_type c1, textclass_type c2,
+void SwitchBetweenClasses(textclass_type c1, textclass_type c2,
ParagraphList & pars, ErrorList & errorlist)
{
BOOST_ASSERT(!pars.empty());
- int ret = 0;
if (c1 == c2)
- return ret;
+ return;
LyXTextClass const & tclass1 = textclasslist[c1];
LyXTextClass const & tclass2 = textclasslist[c2];
InsetText in;
std::swap(in.paragraphs(), pars);
+ // layouts
ParIterator end = par_iterator_end(in);
for (ParIterator it = par_iterator_begin(in); it != end; ++it) {
string const name = it->layout()->name();
it->layout(tclass2.defaultLayout());
if (!hasLayout && name != tclass1.defaultLayoutName()) {
- ++ret;
string const s = bformat(
_("Layout had to be changed from\n%1$s to %2$s\n"
"because of class conversion from\n%3$s to %4$s"),
name, it->layout()->name(), tclass1.name(), tclass2.name());
// To warn the user that something had to be done.
- errorlist.push_back(ErrorItem("Changed Layout", s,
+ errorlist.push_back(ErrorItem(_("Changed Layout"), s,
it->id(), 0,
it->size()));
}
}
+
+ // character styles
+ InsetIterator const i_end = inset_iterator_end(in);
+ for (InsetIterator it = inset_iterator_begin(in); it != i_end; ++it) {
+ if (it->lyxCode() == InsetBase::CHARSTYLE_CODE) {
+ InsetCharStyle & inset =
+ static_cast<InsetCharStyle &>(*it);
+ string const name = inset.params().type;
+ CharStyles::iterator const found_cs =
+ tclass2.charstyle(name);
+ if (found_cs == tclass2.charstyles().end()) {
+ // The character style is undefined in tclass2
+ inset.setUndefined();
+ string const s = bformat(_(
+ "Character style %1$s is "
+ "undefined because of class "
+ "conversion from\n%2$s to %3$s"),
+ name, tclass1.name(), tclass2.name());
+ // To warn the user that something had to be done.
+ errorlist.push_back(ErrorItem(
+ _("Undefined character style"),
+ s, it.paragraph().id(),
+ it.pos(), it.pos() + 1));
+ } else if (inset.undefined()) {
+ // The character style is undefined in
+ // tclass1 and is defined in tclass2
+ inset.setDefined(found_cs);
+ }
+ }
+ }
+
std::swap(in.paragraphs(), pars);
- return ret;
}
// need a valid cursor. (Lgb)
cur.clearSelection();
- text->updateCounters();
+ updateCounters(cur.buffer());
}
if (cur.inMathed()) {
cur.resetAnchor();
text->setCursor(cur, ppp.first, ppp.second);
cur.setSelection();
- text->updateCounters();
+ updateCounters(cur.buffer());
}
if (cur.inMathed()) {
CursorSlice const & i1 = cur.selBegin();
CursorSlice const & i2 = cur.selEnd();
if (i1.inset().asMathInset()) {
+ cur.top() = i1;
if (i1.idx() == i2.idx()) {
i1.cell().erase(i1.pos(), i2.pos());
} else {
for (InsetBase::row_type row = r1; row <= r2; ++row)
for (InsetBase::col_type col = c1; col <= c2; ++col)
p->cell(p->index(row, col)).clear();
+ // We've deleted the whole cell. Only pos 0 is valid.
+ cur.pos() = 0;
}
- cur.back() = i1;
- cur.pos() = 0; // We've deleted the whole cell. Only pos 0 is valid.
cur.resetAnchor();
} else {
lyxerr << "can't erase this selection 1" << endl;