X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView2.C;h=e58b0e4ef7665cdebe8851e7895d1aa701576b1e;hb=a69e7a45780e94f4330a91facfe35126c678e34e;hp=bd3c8e42012b8cc4164c1c8e5c5afbfbbe7c2bd9;hpb=c5041031428093b8415432caf178eef569b524ea;p=lyx.git diff --git a/src/BufferView2.C b/src/BufferView2.C index bd3c8e4201..e58b0e4ef7 100644 --- a/src/BufferView2.C +++ b/src/BufferView2.C @@ -12,6 +12,7 @@ #include #include +#include #include "BufferView.h" #include "buffer.h" @@ -29,12 +30,15 @@ #include "lyx_gui_misc.h" #include "LaTeX.h" #include "BufferView_pimpl.h" +#include "insets/insetcommand.h" //ChangeRefs extern BufferList bufferlist; using std::pair; using std::endl; using std::ifstream; +using std::vector; +using std::find; // Inserts a file into current document bool BufferView::insertLyXFile(string const & filen) @@ -69,19 +73,20 @@ bool BufferView::insertLyXFile(string const & filen) MakeDisplayPath(fname, 50)); return false; } + + char c = ifs.peek(); + LyXLex lex(0, 0); lex.setStream(ifs); - char c; ifs.get(c); - ifs.putback(c); bool res = true; if (c == '#') { lyxerr.debug() << "Will insert file with header" << endl; - res = buffer()->readFile(lex, text->cursor.par); + res = buffer()->readFile(lex, text->cursor.par()); } else { lyxerr.debug() << "Will insert file without header" << endl; - res = buffer()->readLyXformat2(lex, text->cursor.par); + res = buffer()->readLyXformat2(lex, text->cursor.par()); } resize(); @@ -92,30 +97,34 @@ bool BufferView::removeAutoInsets() { LyXParagraph * par = buffer()->paragraph; - LyXCursor cursor = text->cursor; - LyXCursor tmpcursor = cursor; - cursor.par = tmpcursor.par->ParFromPos(tmpcursor.pos); - cursor.pos = tmpcursor.par->PositionInParFromPos(tmpcursor.pos); + LyXCursor tmpcursor = text->cursor; + LyXCursor cursor; bool a = false; while (par) { + // this has to be done before the delete +#ifndef NEW_INSETS + if (par->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE) +#endif + text->SetCursor(this, cursor, par, 0); if (par->AutoDeleteInsets()){ a = true; +#ifndef NEW_INSETS if (par->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE){ - // this is possible now, since SetCursor takes - // care about footnotes - text->SetCursorIntern(par, 0); - text->RedoParagraphs(text->cursor, - text->cursor.par->Next()); - text->FullRebreak(); +#endif + text->RedoParagraphs(this, cursor, + cursor.par()->Next()); + text->FullRebreak(this); +#ifndef NEW_INSETS } +#endif } par = par->next; } // avoid forbidden cursor positions caused by error removing - if (cursor.pos > cursor.par->Last()) - cursor.pos = cursor.par->Last(); - text->SetCursorIntern(cursor.par, cursor.pos); + if (tmpcursor.pos() > tmpcursor.par()->Last()) + tmpcursor.pos(tmpcursor.par()->Last()); + text->SetCursorIntern(this, tmpcursor.par(), tmpcursor.pos()); return a; } @@ -126,9 +135,11 @@ void BufferView::insertErrors(TeXErrors & terr) // Save the cursor position LyXCursor cursor = text->cursor; +#ifndef NEW_INSETS // This is drastic, but it's the only fix, I could find. (Asger) allFloats(1, 0); allFloats(1, 1); +#endif for (TeXErrors::Errors::const_iterator cit = terr.begin(); cit != terr.end(); @@ -142,8 +153,10 @@ void BufferView::insertErrors(TeXErrors & terr) int tmpid = -1; int tmppos = -1; - buffer()->texrow.getIdFromRow(errorrow, tmpid, tmppos); - + if (buffer()->texrow.getIdFromRow(errorrow, tmpid, tmppos)) { + buffer()->texrow.increasePos(tmpid, tmppos); + } + LyXParagraph * texrowpar = 0; if (tmpid == -1) { @@ -157,12 +170,12 @@ void BufferView::insertErrors(TeXErrors & terr) continue; InsetError * new_inset = new InsetError(msgtxt); - text->SetCursorIntern(texrowpar, tmppos); - text->InsertInset(new_inset); - text->FullRebreak(); + text->SetCursorIntern(this, texrowpar, tmppos); + text->InsertInset(this, new_inset); + text->FullRebreak(this); } // Restore the cursor position - text->SetCursorIntern(cursor.par, cursor.pos); + text->SetCursorIntern(this, cursor.par(), cursor.pos()); } @@ -181,34 +194,46 @@ void BufferView::setCursorFromRow(int row) } else { texrowpar = text->GetParFromID(tmpid); } - text->SetCursor(texrowpar, tmppos); + text->SetCursor(this, texrowpar, tmppos); } -void BufferView::insertInset(Inset * inset, string const & lout, +bool BufferView::insertInset(Inset * inset, string const & lout, bool no_table) { + // if we are in a locking inset we should try to insert the + // inset there otherwise this is a illegal function now + if (the_locking_inset) { + if (the_locking_inset->InsertInsetAllowed(inset) && + the_locking_inset->InsertInset(this, inset)) + return true; + return false; + } + +#ifndef NEW_TABULAR // check for table/list in tables - if (no_table && text->cursor.par->table){ + if (no_table && text->cursor.par()->table){ WriteAlert(_("Impossible Operation!"), _("Cannot insert table/list in table."), _("Sorry.")); - return; + return false; } +#endif + // not quite sure if we want this... - text->SetCursorParUndo(); + text->SetCursorParUndo(buffer()); text->FreezeUndo(); beforeChange(); if (!lout.empty()) { - update(-2); - text->BreakParagraph(); - update(-1); + update(BufferView::SELECT|BufferView::FITCUR); + text->BreakParagraph(this); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); - if (text->cursor.par->Last()) { - text->CursorLeft(); + if (text->cursor.par()->Last()) { + text->CursorLeft(this); - text->BreakParagraph(); - update(-1); + text->BreakParagraph(this); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); } pair lres = @@ -223,20 +248,20 @@ void BufferView::insertInset(Inset * inset, string const & lout, lay = 0; } - text->SetLayout(lay); + text->SetLayout(this, lay); - text->SetParagraph(0, 0, + text->SetParagraph(this, 0, 0, 0, 0, VSpace(VSpace::NONE), VSpace(VSpace::NONE), LYX_ALIGN_LAYOUT, string(), 0); - update(-1); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); text->current_font.setLatex(LyXFont::OFF); } - text->InsertInset(inset); + text->InsertInset(this, inset); #if 1 // if we enter a text-inset the cursor should be to the left side // of it! This couldn't happen before as Undo was not handled inside @@ -244,27 +269,30 @@ void BufferView::insertInset(Inset * inset, string const & lout, // and cannot do this as the cursor is behind the inset and GetInset // does not return the inset! if (inset->IsTextInset()) { - if (text->cursor.par->isRightToLeftPar()) - text->CursorRight(); + if (text->cursor.par()->isRightToLeftPar(buffer()->params)) + text->CursorRight(this); else - text->CursorLeft(); + text->CursorLeft(this); } #endif - update(-1); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); - text->UnFreezeUndo(); + text->UnFreezeUndo(); + return true; } // Open and lock an updatable inset -void BufferView::open_new_inset(UpdatableInset * new_inset) +bool BufferView::open_new_inset(UpdatableInset * new_inset) { beforeChange(); text->FinishUndo(); - insertInset(new_inset); - text->CursorLeft(); - update(1); + if (!insertInset(new_inset)) + return false; + text->CursorLeft(this); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); new_inset->Edit(this, 0, 0, 0); + return true; } /* This is also a buffer property (ale) */ @@ -275,51 +303,48 @@ void BufferView::open_new_inset(UpdatableInset * new_inset) bool BufferView::gotoLabel(string const & label) { - LyXParagraph * par = buffer()->paragraph; - LyXParagraph::size_type pos; - Inset * inset; - while (par) { - pos = -1; - while ((inset = par->ReturnNextInsetPointer(pos))){ - for (int i = 0; i < inset->GetNumberOfLabels(); ++i) { - if (label == inset->getLabel(i)) { - beforeChange(); - text->SetCursor(par, pos); - text->sel_cursor = text->cursor; - update(0); - return true; - } - } - ++pos; - } - par = par->next; + for (Buffer::inset_iterator it = buffer()->inset_iterator_begin(); + it != buffer()->inset_iterator_end(); ++it) { + vector labels = (*it)->getLabelList(); + if ( find(labels.begin(),labels.end(),label) + != labels.end()) { + beforeChange(); + text->SetCursor(this, it.getPar(), it.getPos()); + text->sel_cursor = text->cursor; + update(BufferView::SELECT|BufferView::FITCUR); + return true; + } } return false; } + +#ifndef NEW_INSETS void BufferView::allFloats(char flag, char figmar) { if (!available()) return; LyXCursor cursor = text->cursor; - if (!flag && cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE + if (!flag + && cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE && ((figmar - && cursor.par->footnotekind != LyXParagraph::FOOTNOTE - && cursor.par->footnotekind != LyXParagraph::MARGIN) + && cursor.par()->footnotekind != LyXParagraph::FOOTNOTE + && cursor.par()->footnotekind != LyXParagraph::MARGIN + ) || (!figmar - && cursor.par->footnotekind != LyXParagraph::FIG - && cursor.par->footnotekind != LyXParagraph::TAB - && cursor.par->footnotekind != LyXParagraph::WIDE_FIG - && cursor.par->footnotekind != LyXParagraph::WIDE_TAB - && cursor.par->footnotekind != LyXParagraph::ALGORITHM))) + && cursor.par()->footnotekind != LyXParagraph::FIG + && cursor.par()->footnotekind != LyXParagraph::TAB + && cursor.par()->footnotekind != LyXParagraph::WIDE_FIG + && cursor.par()->footnotekind != LyXParagraph::WIDE_TAB + && cursor.par()->footnotekind != LyXParagraph::ALGORITHM))) toggleFloat(); else beforeChange(); LyXCursor tmpcursor = cursor; - cursor.par = tmpcursor.par->ParFromPos(tmpcursor.pos); - cursor.pos = tmpcursor.par->PositionInParFromPos(tmpcursor.pos); + cursor.par(tmpcursor.par()->ParFromPos(tmpcursor.pos())); + cursor.pos(tmpcursor.par()->PositionInParFromPos(tmpcursor.pos())); LyXParagraph *par = buffer()->paragraph; while (par) { @@ -340,9 +365,10 @@ void BufferView::allFloats(char flag, char figmar) if (par->previous && par->previous->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE){ /* should be */ - text->SetCursorIntern(par->previous, + text->SetCursorIntern(this, + par->previous, 0); - text->OpenFootnote(); + text->OpenFootnote(this); } } } else { @@ -369,18 +395,19 @@ void BufferView::allFloats(char flag, char figmar) ) ) ) { - text->SetCursorIntern(par, 0); - text->CloseFootnote(); + text->SetCursorIntern(this, par, 0); + text->CloseFootnote(this); } } par = par->next; } - text->SetCursorIntern(cursor.par, cursor.pos); + text->SetCursorIntern(this, cursor.par(), cursor.pos()); redraw(); fitCursor(); - updateScrollbar(); + //updateScrollbar(); } +#endif void BufferView::insertNote() @@ -391,15 +418,16 @@ void BufferView::insertNote() } +#ifndef NEW_INSETS void BufferView::openStuff() { if (available()) { owner()->getMiniBuffer()->Set(_("Open/Close...")); hideCursor(); beforeChange(); - update(-2); - text->OpenStuff(); - update(0); + update(BufferView::SELECT|BufferView::FITCUR); + text->OpenStuff(this); + update(BufferView::SELECT|BufferView::FITCUR); setState(); } } @@ -411,12 +439,13 @@ void BufferView::toggleFloat() owner()->getMiniBuffer()->Set(_("Open/Close...")); hideCursor(); beforeChange(); - update(-2); - text->ToggleFootnote(); - update(0); + update(BufferView::SELECT|BufferView::FITCUR); + text->ToggleFootnote(this); + update(BufferView::SELECT|BufferView::FITCUR); setState(); } } +#endif void BufferView::menuUndo() { @@ -424,11 +453,11 @@ void BufferView::menuUndo() owner()->getMiniBuffer()->Set(_("Undo")); hideCursor(); beforeChange(); - update(-2); - if (!text->TextUndo()) + update(BufferView::SELECT|BufferView::FITCUR); + if (!text->TextUndo(this)) owner()->getMiniBuffer()->Set(_("No further undo information")); else - update(-1); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); setState(); } } @@ -445,11 +474,11 @@ void BufferView::menuRedo() owner()->getMiniBuffer()->Set(_("Redo")); hideCursor(); beforeChange(); - update(-2); - if (!text->TextRedo()) + update(BufferView::SELECT|BufferView::FITCUR); + if (!text->TextRedo(this)) owner()->getMiniBuffer()->Set(_("No further redo information")); else - update(-1); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); setState(); } } @@ -459,7 +488,7 @@ void BufferView::hyphenationPoint() { if (available()) { hideCursor(); - update(-2); + update(BufferView::SELECT|BufferView::FITCUR); InsetSpecialChar * new_inset = new InsetSpecialChar(InsetSpecialChar::HYPHENATION); insertInset(new_inset); @@ -471,7 +500,7 @@ void BufferView::ldots() { if (available()) { hideCursor(); - update(-2); + update(BufferView::SELECT|BufferView::FITCUR); InsetSpecialChar * new_inset = new InsetSpecialChar(InsetSpecialChar::LDOTS); insertInset(new_inset); @@ -483,7 +512,7 @@ void BufferView::endOfSentenceDot() { if (available()) { hideCursor(); - update(-2); + update(BufferView::SELECT|BufferView::FITCUR); InsetSpecialChar * new_inset = new InsetSpecialChar(InsetSpecialChar::END_OF_SENTENCE); insertInset(new_inset); @@ -495,7 +524,7 @@ void BufferView::menuSeparator() { if (available()) { hideCursor(); - update(-2); + update(BufferView::SELECT|BufferView::FITCUR); InsetSpecialChar * new_inset = new InsetSpecialChar(InsetSpecialChar::MENU_SEPARATOR); insertInset(new_inset); @@ -507,15 +536,9 @@ void BufferView::newline() { if (available()) { hideCursor(); - update(-2); -#if 0 - InsetSpecialChar * new_inset = - new InsetSpecialChar(InsetSpecialChar::NEWLINE); - insertInset(new_inset); -#else - text->InsertChar(LyXParagraph::META_NEWLINE); - update(-1); -#endif + update(BufferView::SELECT|BufferView::FITCUR); + text->InsertChar(this, LyXParagraph::META_NEWLINE); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); } } @@ -524,15 +547,10 @@ void BufferView::protectedBlank() { if (available()) { hideCursor(); - update(-2); -#if 1 + update(BufferView::SELECT|BufferView::FITCUR); InsetSpecialChar * new_inset = new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR); insertInset(new_inset); -#else - text->InsertChar(LyXParagraph::META_PROTECTED_SEPARATOR); - update(-1); -#endif } } @@ -541,9 +559,9 @@ void BufferView::hfill() { if (available()) { hideCursor(); - update(-2); - text->InsertChar(LyXParagraph::META_HFILL); - update(-1); + update(BufferView::SELECT|BufferView::FITCUR); + text->InsertChar(this, LyXParagraph::META_HFILL); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); } } @@ -554,7 +572,7 @@ void BufferView::copyEnvironment() // clear the selection, even if mark_set toggleSelection(); text->ClearSelection(); - update(-2); + update(BufferView::SELECT|BufferView::FITCUR); owner()->getMiniBuffer()->Set(_("Paragraph environment type copied")); } } @@ -563,9 +581,9 @@ void BufferView::copyEnvironment() void BufferView::pasteEnvironment() { if (available()) { - text->pasteEnvironmentType(); + text->pasteEnvironmentType(this); owner()->getMiniBuffer()->Set(_("Paragraph environment type set")); - update(1); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); } } @@ -573,11 +591,11 @@ void BufferView::pasteEnvironment() void BufferView::copy() { if (available()) { - text->CopySelection(); + text->CopySelection(this); // clear the selection, even if mark_set toggleSelection(); text->ClearSelection(); - update(-2); + update(BufferView::SELECT|BufferView::FITCUR); owner()->getMiniBuffer()->Set(_("Copy")); } } @@ -586,9 +604,9 @@ void BufferView::cut() { if (available()) { hideCursor(); - update(-2); - text->CutSelection(); - update(1); + update(BufferView::SELECT|BufferView::FITCUR); + text->CutSelection(this); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); owner()->getMiniBuffer()->Set(_("Cut")); } } @@ -603,16 +621,16 @@ void BufferView::paste() // clear the selection toggleSelection(); text->ClearSelection(); - update(-2); + update(BufferView::SELECT|BufferView::FITCUR); // paste - text->PasteSelection(); - update(1); + text->PasteSelection(this); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); // clear the selection toggleSelection(); text->ClearSelection(); - update(-2); + update(BufferView::SELECT|BufferView::FITCUR); } @@ -622,16 +640,16 @@ void BufferView::gotoNote() hideCursor(); beforeChange(); - update(-2); + update(BufferView::SELECT|BufferView::FITCUR); LyXCursor tmp; - if (!text->GotoNextNote()) { - if (text->cursor.pos - || text->cursor.par != text->FirstParagraph()) { + if (!text->GotoNextNote(this)) { + if (text->cursor.pos() + || text->cursor.par() != text->FirstParagraph()) { tmp = text->cursor; - text->cursor.par = text->FirstParagraph(); - text->cursor.pos = 0; - if (!text->GotoNextNote()) { + text->cursor.par(text->FirstParagraph()); + text->cursor.pos(0); + if (!text->GotoNextNote(this)) { text->cursor = tmp; owner()->getMiniBuffer()->Set(_("No more notes")); LyXBell(); @@ -641,7 +659,7 @@ void BufferView::gotoNote() LyXBell(); } } - update(0); + update(BufferView::SELECT|BufferView::FITCUR); text->sel_cursor = text->cursor; } @@ -650,8 +668,8 @@ void BufferView::insertCorrectQuote() { char c; - if (text->cursor.pos) - c = text->cursor.par->GetChar(text->cursor.pos - 1); + if (text->cursor.pos()) + c = text->cursor.par()->GetChar(text->cursor.pos() - 1); else c = ' '; @@ -667,7 +685,7 @@ char * BufferView::nextWord(float & value) return 0; } - char * string = text->SelectNextWord(value); + char * string = text->SelectNextWord(this, value); return string; } @@ -679,9 +697,9 @@ void BufferView::selectLastWord() hideCursor(); beforeChange(); - text->SelectSelectedWord(); + text->SelectSelectedWord(this); toggleSelection(false); - update(0); + update(BufferView::SELECT|BufferView::FITCUR); } @@ -691,9 +709,9 @@ void BufferView::endOfSpellCheck() hideCursor(); beforeChange(); - text->SelectSelectedWord(); + text->SelectSelectedWord(this); text->ClearSelection(); - update(0); + update(BufferView::SELECT|BufferView::FITCUR); } @@ -702,47 +720,53 @@ void BufferView::replaceWord(string const & replacestring) if (!available()) return; hideCursor(); - update(-2); + update(BufferView::SELECT|BufferView::FITCUR); /* clear the selection (if there is any) */ toggleSelection(false); - update(-2); + update(BufferView::SELECT|BufferView::FITCUR); /* clear the selection (if there is any) */ toggleSelection(false); - text->ReplaceSelectionWithString(replacestring.c_str()); + text->ReplaceSelectionWithString(this, replacestring.c_str()); - text->SetSelectionOverString(replacestring.c_str()); + text->SetSelectionOverString(this, replacestring.c_str()); // Go back so that replacement string is also spellchecked for (string::size_type i = 0; i < replacestring.length() + 1; ++i) { - text->CursorLeftIntern(); + text->CursorLeftIntern(this); } - update(1); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); } // End of spellchecker stuff - -/* these functions return 1 if an error occured, - otherwise 0 */ -int BufferView::lockInset(UpdatableInset * inset) +bool BufferView::lockInset(UpdatableInset * inset) { - if (!the_locking_inset && inset){ + if (!the_locking_inset && inset) { the_locking_inset = inset; - return 0; + return true; + } else if (inset) { + return the_locking_inset->LockInsetInInset(this, inset); } - return 1; + return false; } void BufferView::showLockedInsetCursor(long x, long y, int asc, int desc) { if (the_locking_inset && available()) { - y += text->cursor.y + - the_locking_inset->InsetInInsetY(); - pimpl_->screen->ShowManualCursor(x, y, asc, desc, - LyXScreen::BAR_SHAPE); + LyXCursor cursor = text->cursor; + if ((cursor.pos() - 1 >= 0) && + (cursor.par()->GetChar(cursor.pos() - 1) == + LyXParagraph::META_INSET) && + (cursor.par()->GetInset(cursor.pos() - 1) == + the_locking_inset->GetLockingInset())) + text->SetCursor(this, cursor, + cursor.par(), cursor.pos() - 1); + y += cursor.y() + the_locking_inset->InsetInInsetY(); + pimpl_->screen_->ShowManualCursor(text, x, y, asc, desc, + LyXScreen::BAR_SHAPE); } } @@ -750,7 +774,7 @@ void BufferView::showLockedInsetCursor(long x, long y, int asc, int desc) void BufferView::hideLockedInsetCursor() { if (the_locking_inset && available()) { - pimpl_->screen->HideCursor(); + pimpl_->screen_->HideCursor(); } } @@ -758,8 +782,8 @@ void BufferView::hideLockedInsetCursor() void BufferView::fitLockedInsetCursor(long x, long y, int asc, int desc) { if (the_locking_inset && available()){ - y += text->cursor.y; - if (pimpl_->screen->FitManualCursor(x, y, asc, desc)) + y += text->cursor.y() + the_locking_inset->InsetInInsetY(); + if (pimpl_->screen_->FitManualCursor(text, x, y, asc, desc)) updateScrollbar(); } } @@ -787,11 +811,17 @@ void BufferView::lockedInsetStoreUndo(Undo::undo_kind kind) return; // shouldn't happen if (kind == Undo::EDIT) // in this case insets would not be stored! kind = Undo::FINISH; - text->SetUndo(kind, - text->cursor.par-> - ParFromPos(text->cursor.pos)->previous, - text->cursor.par-> - ParFromPos(text->cursor.pos)->next); + text->SetUndo(buffer(), kind, +#ifndef NEW_INSETS + text->cursor.par()-> + ParFromPos(text->cursor.pos())->previous, + text->cursor.par()-> + ParFromPos(text->cursor.pos())->next +#else + text->cursor.par()->previous, + text->cursor.par()->next +#endif + ); } @@ -803,7 +833,7 @@ void BufferView::updateInset(Inset * inset, bool mark_dirty) // first check for locking insets if (the_locking_inset) { if (the_locking_inset == inset) { - if (text->UpdateInset(inset)){ + if (text->UpdateInset(this, inset)){ update(); if (mark_dirty){ if (buffer()->isLyxClean()) @@ -815,7 +845,7 @@ void BufferView::updateInset(Inset * inset, bool mark_dirty) return; } } else if (the_locking_inset->UpdateInsetInInset(this,inset)) { - if (text->UpdateInset(the_locking_inset)) { + if (text->UpdateInset(this, the_locking_inset)) { update(); if (mark_dirty){ if (buffer()->isLyxClean()) @@ -832,13 +862,60 @@ void BufferView::updateInset(Inset * inset, bool mark_dirty) // then check the current buffer if (available()) { hideCursor(); - update(-3); - if (text->UpdateInset(inset)){ + update(BufferView::UPDATE); + if (text->UpdateInset(this, inset)){ if (mark_dirty) - update(1); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); else - update(3); + update(SELECT); return; } } } + +bool BufferView::ChangeRefs(string const & from, string const & to) +{ + bool flag = false; + LyXParagraph * par = buffer()->paragraph; + LyXCursor cursor = text->cursor; + LyXCursor tmpcursor = cursor; +#ifndef NEW_INSETS + cursor.par(tmpcursor.par()->ParFromPos(tmpcursor.pos())); + cursor.pos(tmpcursor.par()->PositionInParFromPos(tmpcursor.pos())); +#else + cursor.par(tmpcursor.par()); + cursor.pos(tmpcursor.pos()); +#endif + + while (par) { + bool flag2 = false; + for (LyXParagraph::inset_iterator it = par->inset_iterator_begin(); + it != par->inset_iterator_end(); ++it) { + if ((*it)->LyxCode() == Inset::REF_CODE) { + InsetCommand * inset = static_cast(*it); + if (inset->getContents() == from) { + inset->setContents(to); + flag2 = true; + } + } + } + if (flag2) { + flag = true; +#ifndef NEW_INSETS + if (par->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE){ +#endif + // this is possible now, since SetCursor takes + // care about footnotes + text->SetCursorIntern(this, par, 0); + text->RedoParagraphs(this, text->cursor, + text->cursor.par()->Next()); + text->FullRebreak(this); +#ifndef NEW_INSETS + } +#endif + } + par = par->next; + } + text->SetCursorIntern(this, cursor.par(), cursor.pos()); + return flag; +}