X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.C;h=395e860419e39b2a07e6c6c063f3a06961de70bf;hb=21226de2b87a86be19fff025cace3d286a75aa76;hp=b549d2013c59c6fd11bdb86e15ad346649c431b0;hpb=352479f603b4e3cab9ae7f3a54262983b79595af;p=lyx.git diff --git a/src/CutAndPaste.C b/src/CutAndPaste.C index b549d2013c..395e860419 100644 --- a/src/CutAndPaste.C +++ b/src/CutAndPaste.C @@ -3,26 +3,32 @@ * * 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 "paragraph.h" #include "lyx_gui_misc.h" #include "lyxcursor.h" #include "gettext.h" +#include "iterators.h" +#include "lyxtextclasslist.h" -#ifdef __GNUG__ -#pragma implementation -#endif +#include "insets/inseterror.h" using std::pair; +using lyx::pos_type; +using lyx::layout_type; +using lyx::textclass_type; extern BufferView * current_view; @@ -30,7 +36,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 +53,8 @@ extern BufferView * current_view; namespace { -LyXParagraph * buf = 0; -LyXTextClassList::size_type textclass = 0; +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,61 +62,67 @@ LyXTextClassList::size_type textclass = 0; // Perhaps it even should take a parameter? (Lgb) void DeleteBuffer() { - if (!buf) + if (!buf) return; - LyXParagraph * tmppar; + Paragraph * tmppar; - while (buf) { + while (buf) { tmppar = buf; buf = buf->next(); delete tmppar; - } - buf = 0; + } + buf = 0; } } // namespace anon -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->size())) return false; - DeleteBuffer(); + if (realcut) + DeleteBuffer(); textclass = tc; - if (!(*endpar) || - startpar == (*endpar)) { + if (!(*endpar) || startpar == (*endpar)) { // only within one paragraph - buf = new LyXParagraph; - LyXParagraph::size_type i = start; + if (realcut) + buf = new Paragraph; + pos_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()); + if (realcut) + startpar->copyIntoMinibuffer(*current_view->buffer(), + start); + startpar->erase(start); + if (realcut) + buf->insertFromMinibuffer(buf->size()); } end = start - 1; } else { // more than one paragraph - (*endpar)->BreakParagraphConservative(current_view->buffer()->params, - end); + (*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(); + startpar->breakParagraphConservative(current_view->buffer()->params, + start); - buf->previous(0); + // store the selection + if (realcut) { + buf = startpar->next(); + buf->previous(0); + } else { + startpar->next()->previous(0); + } (*endpar)->previous()->next(0); // cut the selection @@ -119,22 +131,29 @@ bool CutAndPaste::cutSelection(LyXParagraph * startpar, LyXParagraph ** endpar, (*endpar)->previous(startpar); // the cut selection should begin with standard layout - buf->Clear(); + if (realcut) + buf->clear(); // paste the paragraphs again, if possible if (doclear) - startpar->next()->StripLeadingSpaces(textclass); - if (startpar->HasSameLayout(startpar->next()) || + startpar->next()->stripLeadingSpaces(textclass); + if (startpar->hasSameLayout(startpar->next()) || !startpar->next()->size()) { - startpar->PasteParagraph(current_view->buffer()->params); + startpar->pasteParagraph(current_view->buffer()->params); (*endpar) = startpar; // this because endpar gets deleted here! } + // this paragraph's are of noone's owner! + Paragraph * p = buf; + while (p) { + p->setInsetOwner(0); + p = p->next(); + } } return true; } -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())) @@ -144,58 +163,55 @@ bool CutAndPaste::copySelection(LyXParagraph * startpar, LyXParagraph * endpar, 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; + 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; -#if 0 - buf = tmppar->Clone(); -#else - buf = new LyXParagraph(*tmppar); -#endif - LyXParagraph * tmppar2 = buf; + Paragraph * tmppar = startpar; + buf = new Paragraph(*tmppar, false); + Paragraph * tmppar2 = buf; while (tmppar != endpar && tmppar->next()) { tmppar = tmppar->next(); -#if 0 - tmppar2->next(tmppar->Clone()); -#else - tmppar2->next(new LyXParagraph(*tmppar)); -#endif + tmppar2->next(new Paragraph(*tmppar, false)); tmppar2->next()->previous(tmppar2); tmppar2 = tmppar2->next(); } 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; } -bool CutAndPaste::pasteSelection(LyXParagraph ** par, LyXParagraph ** endpar, - int & pos, char tc) +bool CutAndPaste::pasteSelection(Paragraph ** par, Paragraph ** endpar, + int & pos, char tc) { if (!checkPastePossible(*par)) return false; @@ -203,18 +219,15 @@ bool CutAndPaste::pasteSelection(LyXParagraph ** par, LyXParagraph ** endpar, if (pos > (*par)->size()) pos = (*par)->size(); - // LyXParagraph * tmpbuf; - LyXParagraph * tmppar = *par; + // 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 -#if 0 - LyXParagraph * tmpbuf = buf->Clone(); -#else - LyXParagraph * tmpbuf = new LyXParagraph(*buf); -#endif + 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 @@ -225,12 +238,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; } } @@ -242,33 +255,52 @@ bool CutAndPaste::pasteSelection(LyXParagraph ** par, LyXParagraph ** endpar, // many paragraphs // make a copy of the simple cut_buffer - LyXParagraph * tmpbuf = buf; -#if 0 - LyXParagraph * simple_cut_clone = tmpbuf->Clone(); -#else - LyXParagraph * simple_cut_clone = new LyXParagraph(*tmpbuf); -#endif - 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(); -#if 0 - tmpbuf2->next(tmpbuf->Clone()); -#else - tmpbuf2->next(new LyXParagraph(*tmpbuf)); -#endif + 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; + while(tmpbuf) { + 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); + } + } + } + // set the inset owner of this paragraph + tmpbuf->setInsetOwner((*par)->inInset()); + tmpbuf = tmpbuf->next(); + } // make sure there is no class difference - SwitchLayoutsBetweenClasses(textclass, tc, buf); + SwitchLayoutsBetweenClasses(textclass, tc, buf, + current_view->buffer()->params); // 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(); @@ -277,7 +309,7 @@ bool CutAndPaste::pasteSelection(LyXParagraph ** par, LyXParagraph ** endpar, // open the paragraph for inserting the buf // if necessary if (((*par)->size() > pos) || !(*par)->next()) { - (*par)->BreakParagraphConservative(current_view->buffer()->params, + (*par)->breakParagraphConservative(current_view->buffer()->params, pos); paste_the_end = true; } @@ -294,22 +326,22 @@ bool CutAndPaste::pasteSelection(LyXParagraph ** par, LyXParagraph ** endpar, if ((*par)->next() == lastbuffer) lastbuffer = *par; - (*par)->PasteParagraph(current_view->buffer()->params); + (*par)->pasteParagraph(current_view->buffer()->params); // 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)) { + lastbuffer->pasteParagraph(current_view->buffer()->params); } else if (!lastbuffer->next()->size()) { - lastbuffer->next()->MakeSameLayout(lastbuffer); - lastbuffer->PasteParagraph(current_view->buffer()->params); + lastbuffer->next()->makeSameLayout(lastbuffer); + lastbuffer->pasteParagraph(current_view->buffer()->params); } else if (!lastbuffer->size()) { - lastbuffer->MakeSameLayout(lastbuffer->next()); - lastbuffer->PasteParagraph(current_view->buffer()->params); + lastbuffer->makeSameLayout(lastbuffer->next()); + lastbuffer->pasteParagraph(current_view->buffer()->params); } else - lastbuffer->next()->StripLeadingSpaces(tc); + lastbuffer->next()->stripLeadingSpaces(tc); } // restore the simple cut buffer buf = simple_cut_clone; @@ -323,10 +355,10 @@ int CutAndPaste::nrOfParagraphs() { if (!buf) return 0; - + int n = 1; - LyXParagraph * tmppar = buf; - while(tmppar->next()) { + Paragraph * tmppar = buf; + while (tmppar->next()) { ++n; tmppar = tmppar->next(); } @@ -334,47 +366,51 @@ int CutAndPaste::nrOfParagraphs() } -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; - while (par) { - string name = textclasslist.NameOfLayout(c1, par->layout); + ParIterator end = ParIterator(); + for (ParIterator it = ParIterator(par); it != end; ++it) { + par = *it; + string const name = textclasslist.NameOfLayout(c1, par->layout); int lay = 0; - pair pp = + pair pp = textclasslist.NumberOfLayout(c2, name); if (pp.first) { lay = pp.second; - } else { // layout not found - // use default layout "Standard" (0) + } else { + // not found: use default layout "Standard" (0) lay = 0; } par->layout = lay; if (name != textclasslist.NameOfLayout(c2, par->layout)) { ++ret; - string s = _("Layout had to be changed from\n") + string const s = _("Layout had to be changed from\n") + name + _(" to ") + textclasslist.NameOfLayout(c2, par->layout) + _("\nbecause of class conversion from\n") + textclasslist.NameOfClass(c1) + _(" to ") + textclasslist.NameOfClass(c2); InsetError * new_inset = new InsetError(s); - par->InsertInset(0, new_inset); + par->insertInset(0, new_inset, + LyXFont(LyXFont::ALL_INHERIT, + bparams.language)); } - par = par->next(); - } - return ret; + } + return ret; } -bool CutAndPaste::checkPastePossible(LyXParagraph *) +bool CutAndPaste::checkPastePossible(Paragraph *) { - if (!buf) return false; - - return true; + if (!buf) return false; + + return true; }