X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.C;h=d5306afd315e153d959a6ce4765c403075a11cff;hb=98c966c64594611e469313314abd1e59524adb4a;hp=2081ec2765e66a773af54c9121e4443746f8bce0;hpb=26f07a39bcce38800814623f6cbe27d9a037ea68;p=lyx.git diff --git a/src/CutAndPaste.C b/src/CutAndPaste.C index 2081ec2765..d5306afd31 100644 --- a/src/CutAndPaste.C +++ b/src/CutAndPaste.C @@ -1,8 +1,8 @@ /* This file is part of * ====================================================== - * + * * LyX, The Document Processor - * + * * Copyright 1995-2001 The LyX Team. * * ====================================================== */ @@ -19,6 +19,7 @@ #include "buffer.h" #include "paragraph.h" #include "ParagraphParameters.h" +#include "lyxtext.h" #include "lyxcursor.h" #include "gettext.h" #include "iterators.h" @@ -64,9 +65,9 @@ void DeleteBuffer() { if (!buf) return; - + Paragraph * tmppar; - + while (buf) { tmppar = buf; buf = buf->next(); @@ -79,28 +80,30 @@ void DeleteBuffer() bool CutAndPaste::cutSelection(Paragraph * startpar, Paragraph ** endpar, - int start, int & end, char tc, bool doclear, + int start, int & end, char tc, bool doclear, bool realcut) { if (!startpar || (start > startpar->size())) return false; - + if (realcut) DeleteBuffer(); - + textclass = tc; - + if (!(*endpar) || startpar == (*endpar)) { // only within one paragraph - if (realcut) + if (realcut) { buf = new Paragraph; + buf->layout(startpar->layout()); + } pos_type i = start; if (end > startpar->size()) end = startpar->size(); for (; i < end; ++i) { if (realcut) startpar->copyIntoMinibuffer(*current_view->buffer(), - start); + start); startpar->erase(start); if (realcut) buf->insertFromMinibuffer(buf->size()); @@ -109,13 +112,13 @@ bool CutAndPaste::cutSelection(Paragraph * startpar, Paragraph ** endpar, } else { // more than one paragraph (*endpar)->breakParagraphConservative(current_view->buffer()->params, - end); + end); *endpar = (*endpar)->next(); end = 0; - + startpar->breakParagraphConservative(current_view->buffer()->params, - start); - + start); + // store the selection if (realcut) { buf = startpar->next(); @@ -124,12 +127,12 @@ bool CutAndPaste::cutSelection(Paragraph * startpar, Paragraph ** endpar, startpar->next()->previous(0); } (*endpar)->previous()->next(0); - + // cut the selection startpar->next(*endpar); - + (*endpar)->previous(startpar); - + // the cut selection should begin with standard layout if (realcut) { buf->params().clear(); @@ -161,14 +164,15 @@ bool CutAndPaste::copySelection(Paragraph * startpar, Paragraph * endpar, { if (!startpar || (start > startpar->size())) return false; - + DeleteBuffer(); - + textclass = tc; - + if (!endpar || startpar == endpar) { // only within one paragraph buf = new Paragraph; + buf->layout(startpar->layout()); pos_type i = start; if (end > startpar->size()) end = startpar->size(); @@ -182,7 +186,7 @@ bool CutAndPaste::copySelection(Paragraph * startpar, Paragraph * endpar, Paragraph * tmppar = startpar; buf = new Paragraph(*tmppar, false); Paragraph * tmppar2 = buf; - + while (tmppar != endpar && tmppar->next()) { tmppar = tmppar->next(); @@ -191,12 +195,12 @@ bool CutAndPaste::copySelection(Paragraph * startpar, Paragraph * endpar, tmppar2 = tmppar2->next(); } tmppar2->next(0); - + // the buf paragraph is too big pos_type tmpi2 = start; for (; tmpi2; --tmpi2) buf->erase(0); - + // now tmppar 2 is too big, delete all after end tmpi2 = end; while (tmppar2->size() > tmpi2) { @@ -214,14 +218,14 @@ bool CutAndPaste::copySelection(Paragraph * startpar, Paragraph * endpar, bool CutAndPaste::pasteSelection(Paragraph ** par, Paragraph ** endpar, - int & pos, char tc) + int & pos, char tc) { if (!checkPastePossible(*par)) return false; - + if (pos > (*par)->size()) pos = (*par)->size(); - + #if 0 // Paragraph * tmpbuf; Paragraph * tmppar = *par; @@ -231,7 +235,7 @@ bool CutAndPaste::pasteSelection(Paragraph ** par, Paragraph ** endpar, if (!buf->next()) { // only within a paragraph 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 @@ -259,12 +263,12 @@ bool CutAndPaste::pasteSelection(Paragraph ** par, Paragraph ** endpar, #endif { // many paragraphs - + // make a copy of the simple cut_buffer Paragraph * tmpbuf = buf; Paragraph * simple_cut_clone = new Paragraph(*tmpbuf, false); Paragraph * tmpbuf2 = simple_cut_clone; - + while (tmpbuf->next()) { tmpbuf = tmpbuf->next(); tmpbuf2->next(new Paragraph(*tmpbuf, false)); @@ -279,7 +283,13 @@ bool CutAndPaste::pasteSelection(Paragraph ** par, Paragraph ** endpar, // 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, tmpbuf, + current_view->buffer()->params); + Paragraph::depth_type max_depth = (*par)->getMaxDepthAfter(current_view->buffer()); + 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 @@ -317,42 +327,38 @@ bool CutAndPaste::pasteSelection(Paragraph ** par, Paragraph ** endpar, } // now reset it to 0 buf->previous(0); - - // make sure there is no class difference - SwitchLayoutsBetweenClasses(textclass, tc, buf, - current_view->buffer()->params); - + // make the buf exactly the same layout than // the cursor paragraph buf->makeSameLayout(*par); - + // find the end of the buffer 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); + 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); // store the new cursor position *par = lastbuffer; @@ -373,7 +379,7 @@ bool CutAndPaste::pasteSelection(Paragraph ** par, Paragraph ** endpar, // restore the simple cut buffer buf = simple_cut_clone; } - + return true; } @@ -382,7 +388,7 @@ int CutAndPaste::nrOfParagraphs() { if (!buf) return 0; - + int n = 1; Paragraph * tmppar = buf; while (tmppar->next()) { @@ -396,7 +402,7 @@ int CutAndPaste::nrOfParagraphs() int CutAndPaste::SwitchLayoutsBetweenClasses(textclass_type c1, textclass_type c2, Paragraph * par, - BufferParams const & bparams) + BufferParams const & /*bparams*/) { int ret = 0; if (!par || c1 == c2) @@ -407,9 +413,9 @@ int CutAndPaste::SwitchLayoutsBetweenClasses(textclass_type c1, par = *it; string const name = par->layout(); LyXTextClass const & tclass = textclasslist[c2]; - + bool hasLayout = tclass.hasLayout(name); - + string lay = tclass.defaultLayoutName(); if (hasLayout) { lay = name; @@ -418,7 +424,7 @@ int CutAndPaste::SwitchLayoutsBetweenClasses(textclass_type c1, lay = tclass.defaultLayoutName(); } par->layout(lay); - + if (name != par->layout()) { ++ret; string const s = _("Layout had to be changed from\n") @@ -428,9 +434,12 @@ int CutAndPaste::SwitchLayoutsBetweenClasses(textclass_type c1, + textclasslist[c1].name() + _(" to ") + textclasslist[c2].name(); InsetError * new_inset = new InsetError(s); - par->insertInset(0, new_inset, - LyXFont(LyXFont::ALL_INHERIT, - bparams.language)); + 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()); } } return ret; @@ -440,6 +449,6 @@ int CutAndPaste::SwitchLayoutsBetweenClasses(textclass_type c1, bool CutAndPaste::checkPastePossible(Paragraph *) { if (!buf) return false; - + return true; }