X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView2.C;h=e58b0e4ef7665cdebe8851e7895d1aa701576b1e;hb=a69e7a45780e94f4330a91facfe35126c678e34e;hp=a085889f001a6fea61bd88f85eeb84145d704d04;hpb=c8ed113f7648086b25b767445bf3d01e17e1d268;p=lyx.git diff --git a/src/BufferView2.C b/src/BufferView2.C index a085889f00..e58b0e4ef7 100644 --- a/src/BufferView2.C +++ b/src/BufferView2.C @@ -11,6 +11,9 @@ #include +#include +#include + #include "BufferView.h" #include "buffer.h" #include "lyxcursor.h" @@ -22,15 +25,25 @@ #include "minibuffer.h" #include "bufferlist.h" #include "support/FileInfo.h" +#include "lyxscreen.h" +#include "support/filetools.h" +#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) // - // (c) CHT Software Service GmbH + // Copyright CHT Software Service GmbH // Uwe C. Schroeder // // Insert a Lyxformat - file into current buffer @@ -60,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(); @@ -83,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; } @@ -117,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(); @@ -133,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) { @@ -148,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()); } @@ -172,71 +194,105 @@ 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); } - int lay = textclasslist.NumberOfLayout(buffer()->params.textclass, - lout).second; - if (lay == -1) // layout not found - // use default layout "Standard" (0) + pair lres = + textclasslist.NumberOfLayout(buffer()->params + .textclass, lout); + LyXTextClass::size_type lay; + if (lres.first != false) { + // layout found + lay = lres.second; + } else { + // layout not fount using default "Standard" (0) lay = 0; + } + + text->SetLayout(this, lay); - text->SetLayout(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); - update(-1); + 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 + // inset now after the Undo LyX tries to call inset->Edit(...) again + // 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(buffer()->params)) + text->CursorRight(this); + else + text->CursorLeft(this); + } +#endif + 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); - new_inset->Edit(0, 0); + 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) */ @@ -247,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) { @@ -312,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 { @@ -341,38 +395,40 @@ 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() { InsetInfo * new_inset = new InsetInfo(); insertInset(new_inset); - new_inset->Edit(0, 0); + new_inset->Edit(this, 0, 0, 0); } +#ifndef NEW_INSETS void BufferView::openStuff() { if (available()) { owner()->getMiniBuffer()->Set(_("Open/Close...")); - getScreen()->HideCursor(); + hideCursor(); beforeChange(); - update(-2); - text->OpenStuff(); - update(0); - SetState(); + update(BufferView::SELECT|BufferView::FITCUR); + text->OpenStuff(this); + update(BufferView::SELECT|BufferView::FITCUR); + setState(); } } @@ -381,27 +437,28 @@ void BufferView::toggleFloat() { if (available()) { owner()->getMiniBuffer()->Set(_("Open/Close...")); - getScreen()->HideCursor(); + hideCursor(); beforeChange(); - update(-2); - text->ToggleFootnote(); - update(0); - SetState(); + update(BufferView::SELECT|BufferView::FITCUR); + text->ToggleFootnote(this); + update(BufferView::SELECT|BufferView::FITCUR); + setState(); } } +#endif void BufferView::menuUndo() { if (available()) { owner()->getMiniBuffer()->Set(_("Undo")); - getScreen()->HideCursor(); + 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); - SetState(); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + setState(); } } @@ -415,14 +472,14 @@ void BufferView::menuRedo() if (available()) { owner()->getMiniBuffer()->Set(_("Redo")); - getScreen()->HideCursor(); + 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); - SetState(); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + setState(); } } @@ -430,8 +487,8 @@ void BufferView::menuRedo() void BufferView::hyphenationPoint() { if (available()) { - getScreen()->HideCursor(); - update(-2); + hideCursor(); + update(BufferView::SELECT|BufferView::FITCUR); InsetSpecialChar * new_inset = new InsetSpecialChar(InsetSpecialChar::HYPHENATION); insertInset(new_inset); @@ -442,8 +499,8 @@ void BufferView::hyphenationPoint() void BufferView::ldots() { if (available()) { - getScreen()->HideCursor(); - update(-2); + hideCursor(); + update(BufferView::SELECT|BufferView::FITCUR); InsetSpecialChar * new_inset = new InsetSpecialChar(InsetSpecialChar::LDOTS); insertInset(new_inset); @@ -454,8 +511,8 @@ void BufferView::ldots() void BufferView::endOfSentenceDot() { if (available()) { - getScreen()->HideCursor(); - update(-2); + hideCursor(); + update(BufferView::SELECT|BufferView::FITCUR); InsetSpecialChar * new_inset = new InsetSpecialChar(InsetSpecialChar::END_OF_SENTENCE); insertInset(new_inset); @@ -466,8 +523,8 @@ void BufferView::endOfSentenceDot() void BufferView::menuSeparator() { if (available()) { - getScreen()->HideCursor(); - update(-2); + hideCursor(); + update(BufferView::SELECT|BufferView::FITCUR); InsetSpecialChar * new_inset = new InsetSpecialChar(InsetSpecialChar::MENU_SEPARATOR); insertInset(new_inset); @@ -478,10 +535,10 @@ void BufferView::menuSeparator() void BufferView::newline() { if (available()) { - getScreen()->HideCursor(); - update(-2); - text->InsertChar(LyXParagraph::META_NEWLINE); - update(-1); + hideCursor(); + update(BufferView::SELECT|BufferView::FITCUR); + text->InsertChar(this, LyXParagraph::META_NEWLINE); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); } } @@ -489,10 +546,11 @@ void BufferView::newline() void BufferView::protectedBlank() { if (available()) { - getScreen()->HideCursor(); - update(-2); - text->InsertChar(LyXParagraph::META_PROTECTED_SEPARATOR); - update(-1); + hideCursor(); + update(BufferView::SELECT|BufferView::FITCUR); + InsetSpecialChar * new_inset = + new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR); + insertInset(new_inset); } } @@ -500,10 +558,10 @@ void BufferView::protectedBlank() void BufferView::hfill() { if (available()) { - getScreen()->HideCursor(); - update(-2); - text->InsertChar(LyXParagraph::META_HFILL); - update(-1); + hideCursor(); + update(BufferView::SELECT|BufferView::FITCUR); + text->InsertChar(this, LyXParagraph::META_HFILL); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); } } @@ -512,9 +570,9 @@ void BufferView::copyEnvironment() if (available()) { text->copyEnvironmentType(); // clear the selection, even if mark_set - getScreen()->ToggleSelection(); + toggleSelection(); text->ClearSelection(); - update(-2); + update(BufferView::SELECT|BufferView::FITCUR); owner()->getMiniBuffer()->Set(_("Paragraph environment type copied")); } } @@ -523,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); } } @@ -533,11 +591,11 @@ void BufferView::pasteEnvironment() void BufferView::copy() { if (available()) { - text->CopySelection(); + text->CopySelection(this); // clear the selection, even if mark_set - getScreen()->ToggleSelection(); + toggleSelection(); text->ClearSelection(); - update(-2); + update(BufferView::SELECT|BufferView::FITCUR); owner()->getMiniBuffer()->Set(_("Copy")); } } @@ -545,10 +603,10 @@ void BufferView::copy() void BufferView::cut() { if (available()) { - getScreen()->HideCursor(); - update(-2); - text->CutSelection(); - update(1); + hideCursor(); + update(BufferView::SELECT|BufferView::FITCUR); + text->CutSelection(this); + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); owner()->getMiniBuffer()->Set(_("Cut")); } } @@ -559,39 +617,39 @@ void BufferView::paste() if (!available()) return; owner()->getMiniBuffer()->Set(_("Paste")); - getScreen()->HideCursor(); + hideCursor(); // clear the selection - getScreen()->ToggleSelection(); + 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 - getScreen()->ToggleSelection(); + toggleSelection(); text->ClearSelection(); - update(-2); + update(BufferView::SELECT|BufferView::FITCUR); } void BufferView::gotoNote() { - if (!getScreen()) return; + if (!available()) return; - getScreen()->HideCursor(); + 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(); @@ -601,7 +659,7 @@ void BufferView::gotoNote() LyXBell(); } } - update(0); + update(BufferView::SELECT|BufferView::FITCUR); text->sel_cursor = text->cursor; } @@ -610,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 = ' '; @@ -627,7 +685,7 @@ char * BufferView::nextWord(float & value) return 0; } - char * string = text->SelectNextWord(value); + char * string = text->SelectNextWord(this, value); return string; } @@ -637,11 +695,11 @@ void BufferView::selectLastWord() { if (!available()) return; - getScreen()->HideCursor(); + hideCursor(); beforeChange(); - text->SelectSelectedWord(); - getScreen()->ToggleSelection(false); - update(0); + text->SelectSelectedWord(this); + toggleSelection(false); + update(BufferView::SELECT|BufferView::FITCUR); } @@ -649,75 +707,83 @@ void BufferView::endOfSpellCheck() { if (!available()) return; - getScreen()->HideCursor(); + hideCursor(); beforeChange(); - text->SelectSelectedWord(); + text->SelectSelectedWord(this); text->ClearSelection(); - update(0); + update(BufferView::SELECT|BufferView::FITCUR); } + + void BufferView::replaceWord(string const & replacestring) { - if (!getScreen()) return; + if (!available()) return; - getScreen()->HideCursor(); - update(-2); + hideCursor(); + update(BufferView::SELECT|BufferView::FITCUR); /* clear the selection (if there is any) */ - getScreen()->ToggleSelection(false); - update(-2); + toggleSelection(false); + update(BufferView::SELECT|BufferView::FITCUR); /* clear the selection (if there is any) */ - getScreen()->ToggleSelection(false); - text->ReplaceSelectionWithString(replacestring.c_str()); + toggleSelection(false); + 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 && getScreen()) { - y += text->cursor.y; - getScreen()->ShowManualCursor(x, y, - asc, desc); + if (the_locking_inset && available()) { + 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); } } -void BufferView::hideLockedInsetCursor(long x, long y, int asc, int desc) +void BufferView::hideLockedInsetCursor() { - if (the_locking_inset && getScreen()) { - y += text->cursor.y; - getScreen()->HideManualCursor(x, y, - asc, desc); + if (the_locking_inset && available()) { + pimpl_->screen_->HideCursor(); } } void BufferView::fitLockedInsetCursor(long x, long y, int asc, int desc) { - if (the_locking_inset && getScreen()){ - y += text->cursor.y; - if (getScreen()->FitManualCursor(x, y, asc, desc)) + if (the_locking_inset && available()){ + y += text->cursor.y() + the_locking_inset->InsetInInsetY(); + if (pimpl_->screen_->FitManualCursor(text, x, y, asc, desc)) updateScrollbar(); } } @@ -726,10 +792,14 @@ void BufferView::fitLockedInsetCursor(long x, long y, int asc, int desc) int BufferView::unlockInset(UpdatableInset * inset) { if (inset && the_locking_inset == inset) { - inset->InsetUnlock(); + inset->InsetUnlock(this); the_locking_inset = 0; text->FinishUndo(); return 0; + } else if (inset && the_locking_inset && + the_locking_inset->UnlockInsetInInset(this, inset)) { + text->FinishUndo(); + return 0; } return bufferlist.unlockInset(inset); } @@ -741,9 +811,111 @@ 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 + ); +} + + +void BufferView::updateInset(Inset * inset, bool mark_dirty) +{ + if (!inset) + return; + + // first check for locking insets + if (the_locking_inset) { + if (the_locking_inset == inset) { + if (text->UpdateInset(this, inset)){ + update(); + if (mark_dirty){ + if (buffer()->isLyxClean()) + owner()->getMiniBuffer()-> + setTimer(4); + buffer()->markDirty(); + } + updateScrollbar(); + return; + } + } else if (the_locking_inset->UpdateInsetInInset(this,inset)) { + if (text->UpdateInset(this, the_locking_inset)) { + update(); + if (mark_dirty){ + if (buffer()->isLyxClean()) + owner()->getMiniBuffer()-> + setTimer(4); + buffer()->markDirty(); + } + updateScrollbar(); + return; + } + } + } + + // then check the current buffer + if (available()) { + hideCursor(); + update(BufferView::UPDATE); + if (text->UpdateInset(this, inset)){ + if (mark_dirty) + update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + else + 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; }