X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.C;h=0f3a66c47aef613aa776324fe549e5395828ee4e;hb=8a5d04fd84e344a1ba1cfd3f5cce67d41874cfa3;hp=ed331f729163d8567c7c9f4e4783dd1a3d94ffed;hpb=a014900f15fa7a6bf553b5c87184d17b1818b3f3;p=lyx.git diff --git a/src/CutAndPaste.C b/src/CutAndPaste.C index ed331f7291..0f3a66c47a 100644 --- a/src/CutAndPaste.C +++ b/src/CutAndPaste.C @@ -1,28 +1,40 @@ /* This file is part of * ====================================================== - * + * * LyX, The Document Processor - * - * Copyright 1995-2000 The LyX Team. + * + * Copyright 1995-2001 The LyX Team. * * ====================================================== */ #include +#ifdef __GNUG__ +#pragma implementation +#endif + #include "CutAndPaste.h" #include "BufferView.h" #include "buffer.h" -#include "lyxparagraph.h" -#include "insets/inseterror.h" -#include "lyx_gui_misc.h" +#include "paragraph.h" +#include "ParagraphParameters.h" +#include "lyxtext.h" #include "lyxcursor.h" #include "gettext.h" +#include "iterators.h" +#include "lyxtextclasslist.h" +#include "undo_funcs.h" +#include "paragraph_funcs.h" +#include "debug.h" -#ifdef __GNUG__ -#pragma implementation -#endif +#include "insets/inseterror.h" + +#include "BoostFormat.h" +using std::endl; using std::pair; +using lyx::pos_type; +using lyx::textclass_type; extern BufferView * current_view; @@ -30,7 +42,7 @@ extern BufferView * current_view; // of selections cut/copied. So IMHO later we should have a // list/vector/deque that we could store // struct selection_item { -// LyXParagraph * buf; +// Paragraph * buf; // LyXTextClassList::size_type textclass; // }; // in and some method of choosing beween them (based on the first few chars @@ -47,8 +59,9 @@ extern BufferView * current_view; namespace { -LyXParagraph * buf = 0; -LyXTextClassList::size_type textclass = 0; +// FIXME: stupid name +Paragraph * buf = 0; +textclass_type textclass = 0; // for now here this should be in another Cut&Paste Class! // Jürgen, I moved this out of CutAndPaste since it does not operate on any @@ -56,414 +69,196 @@ LyXTextClassList::size_type textclass = 0; // Perhaps it even should take a parameter? (Lgb) void DeleteBuffer() { - if (!buf) + if (!buf) return; - - LyXParagraph * tmppar; - - while (buf) { + + Paragraph * tmppar; + + while (buf) { tmppar = buf; -#ifndef NEW_INSETS - buf = buf->next_; -#else buf = buf->next(); -#endif delete tmppar; - } - buf = 0; + } + buf = 0; } } // namespace anon -#ifndef NEW_INSETS -bool CutAndPaste::cutSelection(LyXParagraph * startpar, LyXParagraph ** endpar, - int start, int & end, char tc, bool doclear) +bool CutAndPaste::cutSelection(Paragraph * startpar, Paragraph ** endpar, + int start, int & end, char tc, bool doclear, + bool realcut) { - if (!startpar || (start > startpar->Last())) + if (!startpar || (start > startpar->size())) return false; - - DeleteBuffer(); - - textclass = tc; - - if (!(*endpar) || - (startpar->ParFromPos(start) == - (*endpar)->ParFromPos(end))) { - // only within one paragraph - buf = new LyXParagraph; - LyXParagraph::size_type i = start; - if (end > startpar->Last()) - end = startpar->Last(); - for (; i < end; ++i) { - startpar->CopyIntoMinibuffer(*current_view->buffer(), start); - startpar->Erase(start); - - buf->InsertFromMinibuffer(buf->Last()); + + if (realcut) { + copySelection(startpar, *endpar, start, end, tc); + } + + if (!endpar || startpar == *endpar) { + if (startpar->erase(start, end)) { + // Some chars were erased, go to start to be safe + end = start; } - end = start - 1; - } else { - // more than one paragraph - (*endpar)->BreakParagraphConservative(current_view->buffer()->params, - end); - *endpar = (*endpar)->next(); + return true; + } + + bool actually_erased = false; + + // clear end/begin fragments of the first/last par in selection + actually_erased |= (startpar)->erase(start, startpar->size()); + if ((*endpar)->erase(0, end)) { + actually_erased = true; end = 0; - - startpar->BreakParagraphConservative(current_view->buffer()->params, - start); - - // store the selection - buf = startpar->ParFromPos(start)->next_; - buf->previous(0); - (*endpar)->previous()->next(0); - - // cut the selection - startpar->ParFromPos(start)->next(*endpar); - - (*endpar)->previous(startpar->ParFromPos(start)); - - // care about footnotes - if (buf->footnoteflag) { - LyXParagraph * tmppar = buf; - while (tmppar){ - tmppar->footnoteflag = LyXParagraph::NO_FOOTNOTE; - tmppar = tmppar->next_; + } + + // Loop through the deleted pars if any, erasing as needed + + Paragraph * pit = startpar->next(); + + while (1) { + // *endpar can be 0 + if (!pit) + break; + + Paragraph * next = pit->next(); + + // "erase" the contents of the par + if (pit != *endpar) { + actually_erased |= pit->erase(0, pit->size()); + + // remove the par if it's now empty + if (actually_erased) { + pit->previous()->next(pit->next()); + if (next) { + next->previous(pit->previous()); + } + lyxerr << "deleting pit " << pit << endl; + + delete pit; } } - - // the cut selection should begin with standard layout - buf->Clear(); - - // paste the paragraphs again, if possible - if (doclear) - startpar->next()->StripLeadingSpaces(textclass); - if (startpar->FirstPhysicalPar()->HasSameLayout(startpar->next()) || - !startpar->next()->Last()) { - startpar->ParFromPos(start)->PasteParagraph(current_view->buffer()->params); - (*endpar) = startpar; // this because endpar gets deleted here! - } + + if (pit == *endpar) + break; + + pit = next; } - return true; -} -#else -bool CutAndPaste::cutSelection(LyXParagraph * startpar, LyXParagraph ** endpar, - int start, int & end, char tc, bool doclear) -{ - if (!startpar || (start > startpar->size())) - return false; - - DeleteBuffer(); - - textclass = tc; - - if (!(*endpar) || - startpar == (*endpar)) { - // only within one paragraph - buf = new LyXParagraph; - LyXParagraph::size_type i = start; - if (end > startpar->size()) - end = startpar->size(); - for (; i < end; ++i) { - startpar->CopyIntoMinibuffer(*current_view->buffer(), - start); - startpar->Erase(start); - - buf->InsertFromMinibuffer(buf->size()); - } - end = start - 1; - } else { - // more than one paragraph - (*endpar)->BreakParagraphConservative(current_view->buffer()->params, - end); - *endpar = (*endpar)->next(); - end = 0; - - startpar->BreakParagraphConservative(current_view->buffer()->params, - start); - - // store the selection - buf = startpar->next(); - - buf->previous(0); - (*endpar)->previous()->next(0); - - // cut the selection - startpar->next(*endpar); - - (*endpar)->previous(startpar); - - // the cut selection should begin with standard layout - buf->Clear(); - - // paste the paragraphs again, if possible - if (doclear) - startpar->next()->StripLeadingSpaces(textclass); - if (startpar->HasSameLayout(startpar->next()) || - !startpar->next()->size()) { - startpar->PasteParagraph(current_view->buffer()->params); - (*endpar) = startpar; // this because endpar gets deleted here! - } + +#if 0 // FIXME: why for cut but not copy ? + // the cut selection should begin with standard layout + if (realcut) { + buf->params().clear(); + buf->bibkey = 0; + buf->layout(textclasslist[buffer->params.textclass].defaultLayoutName()); } - return true; -} -#endif +#endif + if (!startpar->next()) + return true; + + Buffer * buffer = current_view->buffer(); -#ifndef NEW_INSETS -bool CutAndPaste::copySelection(LyXParagraph * startpar, LyXParagraph * endpar, - int start, int end, char tc) -{ - if (!startpar || (start > startpar->Last())) - return false; - - DeleteBuffer(); - - textclass = tc; - - if (!(endpar) || - (startpar->ParFromPos(start) == - (endpar)->ParFromPos(end))) { - // only within one paragraph - buf = new LyXParagraph; - LyXParagraph::size_type i = start; - if (end > startpar->Last()) - end = startpar->Last(); - for (; i < end; ++i) { - startpar->CopyIntoMinibuffer(*current_view->buffer(), - i); - buf->InsertFromMinibuffer(buf->Last()); - } - } else { - // copy more than one paragraph - // clone the paragraphs within the selection - LyXParagraph * tmppar = startpar->ParFromPos(start); - buf = tmppar->Clone(); - LyXParagraph * tmppar2 = buf; - - while (tmppar != endpar->ParFromPos(end) - && tmppar->next_) { - tmppar = tmppar->next_; - tmppar2->next(tmppar->Clone()); - tmppar2->next_->previous(tmppar2); - tmppar2 = tmppar2->next_; - } - tmppar2->next(0); - - // care about footnotes - if (buf->footnoteflag) { - tmppar = buf; - while (tmppar) { - tmppar->footnoteflag = LyXParagraph::NO_FOOTNOTE; - tmppar = tmppar->next_; - } - } - - // the buf paragraph is too big - LyXParagraph::size_type tmpi2 = startpar->PositionInParFromPos(start); - for (; tmpi2; --tmpi2) - buf->Erase(0); - - // now tmppar 2 is too big, delete all after end - tmpi2 = endpar->PositionInParFromPos(end); - while (tmppar2->size() > tmpi2) { - tmppar2->Erase(tmppar2->size() - 1); - } + if (doclear) { + startpar->next()->stripLeadingSpaces(); + } + + if (!actually_erased) + return true; + + // paste the paragraphs again, if possible + if (startpar->hasSameLayout(startpar->next()) || + startpar->next()->empty()) { + mergeParagraph(buffer->params, startpar); + // this because endpar gets deleted here! + (*endpar) = startpar; } + return true; } -#else -bool CutAndPaste::copySelection(LyXParagraph * startpar, LyXParagraph * endpar, + + +bool CutAndPaste::copySelection(Paragraph * startpar, Paragraph * endpar, int start, int end, char tc) { if (!startpar || (start > startpar->size())) return false; - + DeleteBuffer(); - + textclass = tc; - - if (!endpar || - startpar == endpar) { + + if (!endpar || startpar == endpar) { // only within one paragraph - buf = new LyXParagraph; - LyXParagraph::size_type i = start; + buf = new Paragraph; + buf->layout(startpar->layout()); + pos_type i = start; if (end > startpar->size()) end = startpar->size(); for (; i < end; ++i) { - startpar->CopyIntoMinibuffer(*current_view->buffer(), i); - buf->InsertFromMinibuffer(buf->size()); + startpar->copyIntoMinibuffer(*current_view->buffer(), i); + buf->insertFromMinibuffer(buf->size()); } } else { // copy more than one paragraph // clone the paragraphs within the selection - LyXParagraph * tmppar = startpar; - buf = tmppar->Clone(); - LyXParagraph * tmppar2 = buf; - + Paragraph * tmppar = startpar; + buf = new Paragraph(*tmppar, false); + Paragraph * tmppar2 = buf; + tmppar2->cleanChanges(); + while (tmppar != endpar && tmppar->next()) { tmppar = tmppar->next(); - tmppar2->next(tmppar->Clone()); + tmppar2->next(new Paragraph(*tmppar, false)); tmppar2->next()->previous(tmppar2); tmppar2 = tmppar2->next(); + // reset change info + tmppar2->cleanChanges(); } tmppar2->next(0); - + // the buf paragraph is too big - LyXParagraph::size_type tmpi2 = start; + pos_type tmpi2 = start; for (; tmpi2; --tmpi2) - buf->Erase(0); - + buf->erase(0); + // now tmppar 2 is too big, delete all after end tmpi2 = end; while (tmppar2->size() > tmpi2) { - tmppar2->Erase(tmppar2->size() - 1); + tmppar2->erase(tmppar2->size() - 1); + } + // this paragraph's are of noone's owner! + tmppar = buf; + while (tmppar) { + tmppar->setInsetOwner(0); + tmppar = tmppar->next(); } } return true; } -#endif -#ifndef NEW_INSETS -bool CutAndPaste::pasteSelection(LyXParagraph ** par, LyXParagraph ** endpar, - int & pos, char tc) -{ - if (!checkPastePossible(*par)) - return false; - - if (pos > (*par)->Last()) - pos = (*par)->Last(); - - LyXParagraph * tmpbuf; - LyXParagraph * tmppar = *par; - int tmppos = pos; - - // There are two cases: cutbuffer only one paragraph or many - if (!buf->next_) { - // only within a paragraph - tmpbuf = buf->Clone(); - // Some provisions should be done here for checking - // if we are inserting at the beginning of a - // paragraph. If there are a space at the beginning - // of the text to insert and we are inserting at - // the beginning of the paragraph the space should - // be removed. - while (buf->size()) { - // This is an attempt to fix the - // "never insert a space at the - // beginning of a paragraph" problem. - if (!tmppos && buf->IsLineSeparator(0)) { - buf->Erase(0); - } else { - buf->CutIntoMinibuffer(current_view->buffer()->params, 0); - buf->Erase(0); - if (tmppar->InsertFromMinibuffer(tmppos)) - ++tmppos; - } - } - delete buf; - buf = tmpbuf; - *endpar = tmppar->next(); - pos = tmppos; - } else { - // many paragraphs - - // make a copy of the simple cut_buffer - tmpbuf = buf; - LyXParagraph * simple_cut_clone = tmpbuf->Clone(); - LyXParagraph * tmpbuf2 = simple_cut_clone; - if ((*par)->footnoteflag) { - tmpbuf->footnoteflag = (*par)->footnoteflag; - tmpbuf->footnotekind = (*par)->footnotekind; - } - while (tmpbuf->next_) { - tmpbuf = tmpbuf->next_; - tmpbuf2->next(tmpbuf->Clone()); - tmpbuf2->next_->previous(tmpbuf2); - tmpbuf2 = tmpbuf2->next_; - if ((*par)->footnoteflag){ - tmpbuf->footnoteflag = (*par)->footnoteflag; - tmpbuf->footnotekind = (*par)->footnotekind; - } - } - - // make sure there is no class difference - SwitchLayoutsBetweenClasses(textclass, tc, buf); - - // make the buf exactly the same layout than - // the cursor paragraph - buf->MakeSameLayout(*par); - - // find the end of the buffer - LyXParagraph * lastbuffer = buf; - while (lastbuffer->next()) - lastbuffer = lastbuffer->next(); - - bool paste_the_end = false; - - // open the paragraph for inserting the buf - // if necessary - if (((*par)->Last() > pos) || !(*par)->next()) { - (*par)->BreakParagraphConservative(current_view->buffer()->params, - pos); - paste_the_end = true; - } - // set the end for redoing later - *endpar = (*par)->ParFromPos(pos)->next_->next(); - - // paste it! - lastbuffer->ParFromPos(lastbuffer->Last())->next( - (*par)->ParFromPos(pos)->next_); - (*par)->ParFromPos(pos)->next()->previous( - lastbuffer->ParFromPos(lastbuffer->Last())); - - (*par)->ParFromPos(pos)->next(buf); - buf->previous((*par)->ParFromPos(pos)); - - if ((*par)->ParFromPos(pos)->next() == lastbuffer) - lastbuffer = *par; - - (*par)->ParFromPos(pos)->PasteParagraph(current_view->buffer()->params); - // store the new cursor position - *par = lastbuffer; - pos = lastbuffer->Last(); - // maybe some pasting - if (lastbuffer->next() && paste_the_end) { - if (lastbuffer->next()->HasSameLayout(lastbuffer)) { - lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph(current_view->buffer()->params); - } else if (!lastbuffer->next()->Last()) { - lastbuffer->next()->MakeSameLayout(lastbuffer); - lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph(current_view->buffer()->params); - } else if (!lastbuffer->Last()) { - lastbuffer->MakeSameLayout(lastbuffer->next_); - lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph(current_view->buffer()->params); - } else - lastbuffer->next()->StripLeadingSpaces(tc); - } - // restore the simple cut buffer - buf = simple_cut_clone; - } - return true; -} -#else -bool CutAndPaste::pasteSelection(LyXParagraph ** par, LyXParagraph ** endpar, +bool CutAndPaste::pasteSelection(Paragraph ** par, Paragraph ** endpar, int & pos, char tc) { if (!checkPastePossible(*par)) return false; - + if (pos > (*par)->size()) pos = (*par)->size(); - - LyXParagraph * tmpbuf; - LyXParagraph * tmppar = *par; + +#if 0 + // Paragraph * tmpbuf; + Paragraph * tmppar = *par; int tmppos = pos; - + // There are two cases: cutbuffer only one paragraph or many if (!buf->next()) { // only within a paragraph - tmpbuf = buf->Clone(); + Paragraph * tmpbuf = new Paragraph(*buf, false); + // Some provisions should be done here for checking // if we are inserting at the beginning of a // paragraph. If there are a space at the beginning @@ -474,12 +269,12 @@ bool CutAndPaste::pasteSelection(LyXParagraph ** par, LyXParagraph ** endpar, // This is an attempt to fix the // "never insert a space at the // beginning of a paragraph" problem. - if (!tmppos && buf->IsLineSeparator(0)) { - buf->Erase(0); + if (!tmppos && buf->isLineSeparator(0)) { + buf->erase(0); } else { - buf->CutIntoMinibuffer(current_view->buffer()->params, 0); - buf->Erase(0); - if (tmppar->InsertFromMinibuffer(tmppos)) + buf->cutIntoMinibuffer(current_view->buffer()->params, 0); + buf->erase(0); + if (tmppar->insertFromMinibuffer(tmppos)) ++tmppos; } } @@ -487,78 +282,129 @@ bool CutAndPaste::pasteSelection(LyXParagraph ** par, LyXParagraph ** endpar, buf = tmpbuf; *endpar = tmppar->next(); pos = tmppos; - } else { + } else +#endif + { // many paragraphs - + // make a copy of the simple cut_buffer - tmpbuf = buf; - LyXParagraph * simple_cut_clone = tmpbuf->Clone(); - LyXParagraph * tmpbuf2 = simple_cut_clone; + Paragraph * tmpbuf = buf; + Paragraph * simple_cut_clone = new Paragraph(*tmpbuf, false); + Paragraph * tmpbuf2 = simple_cut_clone; + while (tmpbuf->next()) { tmpbuf = tmpbuf->next(); - tmpbuf2->next(tmpbuf->Clone()); + tmpbuf2->next(new Paragraph(*tmpbuf, false)); tmpbuf2->next()->previous(tmpbuf2); tmpbuf2 = tmpbuf2->next(); } - + + // now remove all out of the buffer which is NOT allowed in the + // new environment and set also another font if that is required + tmpbuf = buf; + int depth_delta = (*par)->params().depth() - tmpbuf->params().depth(); + // temporary set *par as previous of tmpbuf as we might have to realize + // the font. + tmpbuf->previous(*par); + // make sure there is no class difference - SwitchLayoutsBetweenClasses(textclass, tc, buf); - + SwitchLayoutsBetweenClasses(textclass, tc, tmpbuf, + current_view->buffer()->params); + + Paragraph::depth_type max_depth = (*par)->getMaxDepthAfter(); + + while(tmpbuf) { + // if we have a negative jump so that the depth would go below + // 0 depth then we have to redo the delta to this new max depth + // level so that subsequent paragraphs are aligned correctly to + // this paragraph at level 0. + if ((static_cast(tmpbuf->params().depth()) + depth_delta) < 0) + depth_delta = 0; + // set the right depth so that we are not too deep or shallow. + tmpbuf->params().depth(tmpbuf->params().depth() + depth_delta); + if (tmpbuf->params().depth() > max_depth) + tmpbuf->params().depth(max_depth); + // only set this from the 2nd on as the 2nd depends for maxDepth + // still on *par + if (tmpbuf->previous() != (*par)) + max_depth = tmpbuf->getMaxDepthAfter(); + // set the inset owner of this paragraph + tmpbuf->setInsetOwner((*par)->inInset()); + for(pos_type i = 0; i < tmpbuf->size(); ++i) { + if (tmpbuf->getChar(i) == Paragraph::META_INSET) { + if (!(*par)->insetAllowed(tmpbuf->getInset(i)->lyxCode())) + { + tmpbuf->erase(i--); + } + } else { + LyXFont f1 = tmpbuf->getFont(current_view->buffer()->params,i); + LyXFont f2 = f1; + if (!(*par)->checkInsertChar(f1)) { + tmpbuf->erase(i--); + } else if (f1 != f2) { + tmpbuf->setFont(i, f1); + } + } + } + tmpbuf = tmpbuf->next(); + } + // now reset it to 0 + buf->previous(0); + // make the buf exactly the same layout than // the cursor paragraph - buf->MakeSameLayout(*par); - + buf->makeSameLayout(*par); + // find the end of the buffer - LyXParagraph * lastbuffer = buf; + Paragraph * lastbuffer = buf; while (lastbuffer->next()) lastbuffer = lastbuffer->next(); - + bool paste_the_end = false; - + // open the paragraph for inserting the buf // if necessary if (((*par)->size() > pos) || !(*par)->next()) { - (*par)->BreakParagraphConservative(current_view->buffer()->params, - pos); + breakParagraphConservative( + current_view->buffer()->params, *par, pos); paste_the_end = true; } // set the end for redoing later *endpar = (*par)->next()->next(); - + // paste it! lastbuffer->next((*par)->next()); (*par)->next()->previous(lastbuffer); - + (*par)->next(buf); buf->previous(*par); - + if ((*par)->next() == lastbuffer) lastbuffer = *par; - - (*par)->PasteParagraph(current_view->buffer()->params); + + mergeParagraph(current_view->buffer()->params, *par); // store the new cursor position *par = lastbuffer; pos = lastbuffer->size(); // maybe some pasting if (lastbuffer->next() && paste_the_end) { - if (lastbuffer->next()->HasSameLayout(lastbuffer)) { - lastbuffer->PasteParagraph(current_view->buffer()->params); + if (lastbuffer->next()->hasSameLayout(lastbuffer)) { + mergeParagraph(current_view->buffer()->params, lastbuffer); } else if (!lastbuffer->next()->size()) { - lastbuffer->next()->MakeSameLayout(lastbuffer); - lastbuffer->PasteParagraph(current_view->buffer()->params); + lastbuffer->next()->makeSameLayout(lastbuffer); + mergeParagraph(current_view->buffer()->params, lastbuffer); } else if (!lastbuffer->size()) { - lastbuffer->MakeSameLayout(lastbuffer->next()); - lastbuffer->PasteParagraph(current_view->buffer()->params); + lastbuffer->makeSameLayout(lastbuffer->next()); + mergeParagraph(current_view->buffer()->params, lastbuffer); } else - lastbuffer->next()->StripLeadingSpaces(tc); + lastbuffer->next()->stripLeadingSpaces(); } // restore the simple cut buffer buf = simple_cut_clone; } - + return true; } -#endif int CutAndPaste::nrOfParagraphs() @@ -567,89 +413,76 @@ int CutAndPaste::nrOfParagraphs() return 0; int n = 1; - LyXParagraph * tmppar = buf; -#ifndef NEW_INSETS - while(tmppar->next_) { - ++n; - tmppar = tmppar->next_; - } -#else - while(tmppar->next()) { + Paragraph * tmppar = buf; + while (tmppar->next()) { ++n; tmppar = tmppar->next(); } -#endif return n; } -int CutAndPaste::SwitchLayoutsBetweenClasses(LyXTextClassList::size_type c1, - LyXTextClassList::size_type c2, - LyXParagraph * par) +int CutAndPaste::SwitchLayoutsBetweenClasses(textclass_type c1, + textclass_type c2, + Paragraph * par, + BufferParams const & /*bparams*/) { - int ret = 0; - if (!par || c1 == c2) + int ret = 0; + if (!par || c1 == c2) return ret; -#ifndef NEW_INSETS - par = par->FirstPhysicalPar(); -#endif - while (par) { - string name = textclasslist.NameOfLayout(c1, par->layout); - int lay = 0; - pair pp = - textclasslist.NumberOfLayout(c2, name); - if (pp.first) { - lay = pp.second; - } else { // layout not found - // use default layout "Standard" (0) - lay = 0; - } - par->layout = lay; - - if (name != textclasslist.NameOfLayout(c2, par->layout)) { + + LyXTextClass const & tclass1 = textclasslist[c1]; + LyXTextClass const & tclass2 = textclasslist[c2]; + ParIterator end = ParIterator(); + for (ParIterator it = ParIterator(par); it != end; ++it) { + par = *it; + string const name = par->layout()->name(); + bool hasLayout = tclass2.hasLayout(name); + + if (hasLayout) + par->layout(tclass2[name]); + else + par->layout(tclass2.defaultLayout()); + + if (!hasLayout && name != tclass1.defaultLayoutName()) { ++ret; - string s = _("Layout had to be changed from\n") +#if USE_BOOST_FORMAT + boost::format fmt(_("Layout had to be changed from\n" + "%1$s to %2$s\n" + "because of class conversion from\n" + "%3$s to %4$s")); + fmt % name + % par->layout()->name() + % tclass1.name() + % tclass2.name(); + + string const s = fmt.str(); +#else + string const s = _("Layout had to be changed from\n") + name + _(" to ") - + textclasslist.NameOfLayout(c2, par->layout) + + par->layout()->name() + _("\nbecause of class conversion from\n") - + textclasslist.NameOfClass(c1) + _(" to ") - + textclasslist.NameOfClass(c2); + + tclass1.name() + _(" to ") + + tclass2.name(); +#endif + freezeUndo(); InsetError * new_inset = new InsetError(s); - par->InsertInset(0, new_inset); + LyXText * txt = current_view->getLyXText(); + LyXCursor cur = txt->cursor; + txt->setCursorIntern(current_view, par, 0); + txt->insertInset(current_view, new_inset); + txt->fullRebreak(current_view); + txt->setCursorIntern(current_view, cur.par(), cur.pos()); + unFreezeUndo(); } -#ifndef NEW_INSETS - par = par->next_; -#else - par = par->next(); -#endif - } - return ret; + } + return ret; } -#ifndef NEW_INSETS -bool CutAndPaste::checkPastePossible(LyXParagraph * par) -#else -bool CutAndPaste::checkPastePossible(LyXParagraph *) -#endif +bool CutAndPaste::checkPastePossible(Paragraph *) { - if (!buf) return false; - -#ifndef NEW_INSETS - // be carefull with footnotes in footnotes - if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE) { - // check whether the cut_buffer includes a footnote - LyXParagraph * tmppar = buf; - while (tmppar && tmppar->footnoteflag == LyXParagraph::NO_FOOTNOTE) - tmppar = tmppar->next_; - - if (tmppar) { - WriteAlert(_("Impossible operation"), - _("Can't paste float into float!"), - _("Sorry.")); - return false; - } - } -#endif - return true; + if (!buf) return false; + + return true; }