X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView2.C;h=2e32c7cc787024e4444886f003e4c65cd3285bca;hb=e7ae04343eeb55d92b52c979c2fd5f5ea54ccf38;hp=6cc7c8b4569aa721f7983b0d4bfec9ebbcce9f22;hpb=ba5e47f1a92c3688d16f76f654fd3768672ebb50;p=lyx.git diff --git a/src/BufferView2.C b/src/BufferView2.C index 6cc7c8b456..2e32c7cc78 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" @@ -19,19 +22,32 @@ #include "insets/insetinfo.h" #include "insets/insetspecialchar.h" #include "LyXView.h" -#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 +#include "support/lyxfunctional.h" //equal_1st_in_pair +#include "language.h" +#include "gettext.h" extern BufferList bufferlist; +using std::pair; +using std::endl; using std::ifstream; +using std::vector; +using std::find; +using std::count; +using std::count_if; // 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 @@ -40,10 +56,10 @@ bool BufferView::insertLyXFile(string const & filen) { if (filen.empty()) return false; - string fname = MakeAbsPath(filen); + string const fname = MakeAbsPath(filen); // check if file exist - FileInfo fi(fname); + FileInfo const fi(fname); if (!fi.readable()) { WriteAlert(_("Error!"), @@ -52,7 +68,7 @@ bool BufferView::insertLyXFile(string const & filen) return false; } - beforeChange(); + beforeChange(text); ifstream ifs(fname.c_str()); if (!ifs) { @@ -61,53 +77,72 @@ bool BufferView::insertLyXFile(string const & filen) MakeDisplayPath(fname, 50)); return false; } + + char const 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(); return res; } + 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; +#ifndef NEW_INSETS while (par) { + // this has to be done before the delete + if (par->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE) + text->SetCursor(this, cursor, par, 0); if (par->AutoDeleteInsets()){ a = true; 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(); + text->RedoParagraphs(this, cursor, + cursor.par()->next()); + text->FullRebreak(this); } } - par = par->next; + 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()); +#else + while (par) { + // this has to be done before the delete + text->SetCursor(this, cursor, par, 0); + if (par->AutoDeleteInsets()){ + a = true; + text->RedoParagraphs(this, cursor, + cursor.par()->next()); + text->FullRebreak(this); + } + par = par->next(); + } + + // avoid forbidden cursor positions caused by error removing + if (tmpcursor.pos() > tmpcursor.par()->size()) + tmpcursor.pos(tmpcursor.par()->size()); +#endif + text->SetCursorIntern(this, tmpcursor.par(), tmpcursor.pos()); return a; } @@ -118,24 +153,28 @@ 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(); ++cit) { - string desctext((*cit).error_desc); - string errortext((*cit).error_text); - string msgtxt = desctext + '\n' + errortext; - int errorrow = (*cit).error_in_line; + string const desctext((*cit).error_desc); + string const errortext((*cit).error_text); + string const msgtxt = desctext + '\n' + errortext; + int const errorrow = (*cit).error_in_line; // Insert error string for row number 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) { @@ -149,12 +188,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()); } @@ -173,34 +212,40 @@ 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 no_table) + +bool BufferView::insertInset(Inset * inset, string const & lout, + bool /*no_table*/) { - // check for table/list in tables - if (no_table && text->cursor.par->table){ - WriteAlert(_("Impossible Operation!"), - _("Cannot insert table/list in table."), - _("Sorry.")); - return; + // if we are in a locking inset we should try to insert the + // inset there otherwise this is a illegal function now + if (theLockingInset()) { + if (theLockingInset()->InsertInsetAllowed(inset)) + return theLockingInset()->InsertInset(this, inset); + return false; } + // not quite sure if we want this... - text->SetCursorParUndo(); + text->SetCursorParUndo(buffer()); text->FreezeUndo(); - beforeChange(); + beforeChange(text); if (!lout.empty()) { - update(-2); - text->BreakParagraph(); - update(-1); - - if (text->cursor.par->Last()) { - text->CursorLeft(); + update(text, BufferView::SELECT|BufferView::FITCUR); + text->BreakParagraph(this); + update(text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + +#ifndef NEW_INSETS + if (text->cursor.par()->Last()) { +#else + if (text->cursor.par()->size()) { +#endif + text->CursorLeft(this); - text->BreakParagraph(); - update(-1); + text->BreakParagraph(this); + update(text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); } pair lres = @@ -215,35 +260,42 @@ 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(text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); text->current_font.setLatex(LyXFont::OFF); } - text->InsertInset(inset); - update(-1); + text->InsertInset(this, inset); + update(text, 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, bool behind) { - beforeChange(); + beforeChange(text); text->FinishUndo(); - insertInset(new_inset); - text->CursorLeft(); - update(1); - new_inset->Edit(this, 0, 0, 0); + if (!insertInset(new_inset)) { + delete new_inset; + return false; + } + if (behind) { + LyXFont & font = getLyXText()->real_current_font; + new_inset->Edit(this, new_inset->width(this, font), 0, 0); + } else + new_inset->Edit(this, 0, 0, 0); + return true; } /* This is also a buffer property (ale) */ @@ -254,51 +306,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); + text->SetCursor(this, it.getPar(), it.getPos()); + text->sel_cursor = text->cursor; + update(text, 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(); + beforeChange(text); 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) { @@ -316,12 +365,13 @@ void BufferView::allFloats(char flag, char figmar) ) ) ) { - if (par->previous - && par->previous->footnoteflag != + 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 { @@ -348,18 +398,18 @@ void BufferView::allFloats(char flag, char figmar) ) ) ) { - text->SetCursorIntern(par, 0); - text->CloseFootnote(); + text->SetCursorIntern(this, par, 0); + text->CloseFootnote(this); } } - par = par->next; + par = par->next_; } - text->SetCursorIntern(cursor.par, cursor.pos); + text->SetCursorIntern(this, cursor.par(), cursor.pos()); redraw(); - fitCursor(); - updateScrollbar(); + fitCursor(text); } +#endif void BufferView::insertNote() @@ -370,15 +420,16 @@ void BufferView::insertNote() } +#ifndef NEW_INSETS void BufferView::openStuff() { if (available()) { - owner()->getMiniBuffer()->Set(_("Open/Close...")); + owner()->message(_("Open/Close...")); hideCursor(); - beforeChange(); - update(-2); - text->OpenStuff(); - update(0); + beforeChange(text); + update(text, BufferView::SELECT|BufferView::FITCUR); + text->OpenStuff(this); + update(text, BufferView::SELECT|BufferView::FITCUR); setState(); } } @@ -387,27 +438,28 @@ void BufferView::openStuff() void BufferView::toggleFloat() { if (available()) { - owner()->getMiniBuffer()->Set(_("Open/Close...")); + owner()->message(_("Open/Close...")); hideCursor(); - beforeChange(); - update(-2); - text->ToggleFootnote(); - update(0); + beforeChange(text); + update(text, BufferView::SELECT|BufferView::FITCUR); + text->ToggleFootnote(this); + update(text, BufferView::SELECT|BufferView::FITCUR); setState(); } } +#endif void BufferView::menuUndo() { if (available()) { - owner()->getMiniBuffer()->Set(_("Undo")); + owner()->message(_("Undo")); hideCursor(); - beforeChange(); - update(-2); - if (!text->TextUndo()) - owner()->getMiniBuffer()->Set(_("No further undo information")); + beforeChange(text); + update(text, BufferView::SELECT|BufferView::FITCUR); + if (!text->TextUndo(this)) + owner()->message(_("No forther undo information")); else - update(-1); + update(text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); setState(); } } @@ -415,20 +467,20 @@ void BufferView::menuUndo() void BufferView::menuRedo() { - if (the_locking_inset) { - owner()->getMiniBuffer()->Set(_("Redo not yet supported in math mode")); + if (theLockingInset()) { + owner()->message(_("Redo not yet supported in math mode")); return; } if (available()) { - owner()->getMiniBuffer()->Set(_("Redo")); + owner()->message(_("Redo")); hideCursor(); - beforeChange(); - update(-2); - if (!text->TextRedo()) - owner()->getMiniBuffer()->Set(_("No further redo information")); + beforeChange(text); + update(text, BufferView::SELECT|BufferView::FITCUR); + if (!text->TextRedo(this)) + owner()->message(_("No further redo information")); else - update(-1); + update(text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); setState(); } } @@ -438,7 +490,7 @@ void BufferView::hyphenationPoint() { if (available()) { hideCursor(); - update(-2); + update(text, BufferView::SELECT|BufferView::FITCUR); InsetSpecialChar * new_inset = new InsetSpecialChar(InsetSpecialChar::HYPHENATION); insertInset(new_inset); @@ -450,7 +502,7 @@ void BufferView::ldots() { if (available()) { hideCursor(); - update(-2); + update(text, BufferView::SELECT|BufferView::FITCUR); InsetSpecialChar * new_inset = new InsetSpecialChar(InsetSpecialChar::LDOTS); insertInset(new_inset); @@ -462,7 +514,7 @@ void BufferView::endOfSentenceDot() { if (available()) { hideCursor(); - update(-2); + update(text, BufferView::SELECT|BufferView::FITCUR); InsetSpecialChar * new_inset = new InsetSpecialChar(InsetSpecialChar::END_OF_SENTENCE); insertInset(new_inset); @@ -474,7 +526,7 @@ void BufferView::menuSeparator() { if (available()) { hideCursor(); - update(-2); + update(text, BufferView::SELECT|BufferView::FITCUR); InsetSpecialChar * new_inset = new InsetSpecialChar(InsetSpecialChar::MENU_SEPARATOR); insertInset(new_inset); @@ -486,32 +538,24 @@ 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(text, BufferView::SELECT|BufferView::FITCUR); + text->InsertChar(this, LyXParagraph::META_NEWLINE); + update(text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); } } -void BufferView::protectedBlank() +void BufferView::protectedBlank(LyXText * lt) { if (available()) { hideCursor(); - update(-2); -#if 1 + update(lt, 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 + if (!insertInset(new_inset)) + delete new_inset; + else + updateInset(new_inset, true); } } @@ -520,21 +564,22 @@ void BufferView::hfill() { if (available()) { hideCursor(); - update(-2); - text->InsertChar(LyXParagraph::META_HFILL); - update(-1); + update(text, BufferView::SELECT|BufferView::FITCUR); + text->InsertChar(this, LyXParagraph::META_HFILL); + update(text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); } } + void BufferView::copyEnvironment() { if (available()) { text->copyEnvironmentType(); // clear the selection, even if mark_set toggleSelection(); - text->ClearSelection(); - update(-2); - owner()->getMiniBuffer()->Set(_("Paragraph environment type copied")); + text->ClearSelection(this); + update(text, BufferView::SELECT|BufferView::FITCUR); + owner()->message(_("Paragraph environment type copied")); } } @@ -542,9 +587,9 @@ void BufferView::copyEnvironment() void BufferView::pasteEnvironment() { if (available()) { - text->pasteEnvironmentType(); - owner()->getMiniBuffer()->Set(_("Paragraph environment type set")); - update(1); + text->pasteEnvironmentType(this); + owner()->message(_("Paragraph environment type set")); + update(text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); } } @@ -552,12 +597,12 @@ 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); - owner()->getMiniBuffer()->Set(_("Copy")); + text->ClearSelection(this); + update(text, BufferView::SELECT|BufferView::FITCUR); + owner()->message(_("Copy")); } } @@ -565,10 +610,10 @@ void BufferView::cut() { if (available()) { hideCursor(); - update(-2); - text->CutSelection(); - update(1); - owner()->getMiniBuffer()->Set(_("Cut")); + update(text, BufferView::SELECT|BufferView::FITCUR); + text->CutSelection(this); + update(text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); + owner()->message(_("Cut")); } } @@ -576,61 +621,76 @@ void BufferView::cut() void BufferView::paste() { if (!available()) return; - - owner()->getMiniBuffer()->Set(_("Paste")); + + owner()->message(_("Paste")); + hideCursor(); // clear the selection toggleSelection(); - text->ClearSelection(); - update(-2); + text->ClearSelection(this); + update(text, BufferView::SELECT|BufferView::FITCUR); // paste - text->PasteSelection(); - update(1); + text->PasteSelection(this); + update(text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); // clear the selection toggleSelection(); - text->ClearSelection(); - update(-2); + text->ClearSelection(this); + update(text, BufferView::SELECT|BufferView::FITCUR); } -void BufferView::gotoNote() +void BufferView::gotoInset(std::vector const & codes, + bool same_content) { if (!available()) return; hideCursor(); - beforeChange(); - update(-2); - LyXCursor tmp; - - if (!text->GotoNextNote()) { - if (text->cursor.pos - || text->cursor.par != text->FirstParagraph()) { - tmp = text->cursor; - text->cursor.par = text->FirstParagraph(); - text->cursor.pos = 0; - if (!text->GotoNextNote()) { + beforeChange(text); + update(text, BufferView::SELECT|BufferView::FITCUR); + + string contents; + if (same_content && + text->cursor.par()->GetChar(text->cursor.pos()) == LyXParagraph::META_INSET) { + Inset const * inset = text->cursor.par()->GetInset(text->cursor.pos()); + if (find(codes.begin(), codes.end(), inset->LyxCode()) + != codes.end()) + contents = + static_cast(inset)->getContents(); + } + + if (!text->GotoNextInset(this, codes, contents)) { + if (text->cursor.pos() + || text->cursor.par() != text->FirstParagraph()) { + LyXCursor tmp = text->cursor; + text->cursor.par(text->FirstParagraph()); + text->cursor.pos(0); + if (!text->GotoNextInset(this, codes, contents)) { text->cursor = tmp; - owner()->getMiniBuffer()->Set(_("No more notes")); - LyXBell(); + owner()->message(_("No more insets")); } } else { - owner()->getMiniBuffer()->Set(_("No more notes")); - LyXBell(); + owner()->message(_("No more insets")); } } - update(0); + update(text, BufferView::SELECT|BufferView::FITCUR); text->sel_cursor = text->cursor; } +void BufferView::gotoInset(Inset::Code code, bool same_content) +{ + gotoInset(vector(1, code), same_content); +} + + 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 = ' '; @@ -639,16 +699,14 @@ void BufferView::insertCorrectQuote() /* these functions are for the spellchecker */ -char * BufferView::nextWord(float & value) +string const BufferView::nextWord(float & value) { if (!available()) { value = 1; - return 0; + return string(); } - char * string = text->SelectNextWord(value); - - return string; + return text->SelectNextWord(this, value); } @@ -657,10 +715,10 @@ void BufferView::selectLastWord() if (!available()) return; hideCursor(); - beforeChange(); - text->SelectSelectedWord(); + beforeChange(text); + text->SelectSelectedWord(this); toggleSelection(false); - update(0); + update(text, BufferView::SELECT|BufferView::FITCUR); } @@ -669,10 +727,10 @@ void BufferView::endOfSpellCheck() if (!available()) return; hideCursor(); - beforeChange(); - text->SelectSelectedWord(); - text->ClearSelection(); - update(0); + beforeChange(text); + text->SelectSelectedWord(this); + text->ClearSelection(this); + update(text, BufferView::SELECT|BufferView::FITCUR); } @@ -681,63 +739,81 @@ void BufferView::replaceWord(string const & replacestring) if (!available()) return; hideCursor(); - update(-2); + update(text, BufferView::SELECT|BufferView::FITCUR); /* clear the selection (if there is any) */ toggleSelection(false); - update(-2); + update(text, BufferView::SELECT|BufferView::FITCUR); /* clear the selection (if there is any) */ toggleSelection(false); - text->ReplaceSelectionWithString(replacestring.c_str()); + text->ReplaceSelectionWithString(this, replacestring); - text->SetSelectionOverString(replacestring.c_str()); + text->SetSelectionOverString(this, replacestring); // Go back so that replacement string is also spellchecked for (string::size_type i = 0; i < replacestring.length() + 1; ++i) { - text->CursorLeftIntern(); + text->CursorLeft(this); } - update(1); + update(text, 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){ - the_locking_inset = inset; - return 0; + if (!theLockingInset() && inset) { + theLockingInset(inset); + return true; + } else if (inset) { + return theLockingInset()->LockInsetInInset(this, inset); } - return 1; + return false; } -void BufferView::showLockedInsetCursor(long x, long y, int asc, int desc) +void BufferView::showLockedInsetCursor(int x, int y, int asc, int desc) { - if (the_locking_inset && available()) { - y += text->cursor.y; - screen->ShowManualCursor(x, y, - asc, desc); + if (theLockingInset() && 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) == + theLockingInset()->GetLockingInset())) + text->SetCursor(this, cursor, + cursor.par(), cursor.pos() - 1); + LyXScreen::Cursor_Shape shape = LyXScreen::BAR_SHAPE; + LyXText * txt = getLyXText(); + if (theLockingInset()->GetLockingInset()->LyxCode() == + Inset::TEXT_CODE && + (txt->real_current_font.language() != + buffer()->params.language + || txt->real_current_font.isVisibleRightToLeft() + != buffer()->params.language->RightToLeft())) + shape = (txt->real_current_font.isVisibleRightToLeft()) + ? LyXScreen::REVERSED_L_SHAPE + : LyXScreen::L_SHAPE; + y += cursor.y() + theLockingInset()->InsetInInsetY(); + pimpl_->screen_->ShowManualCursor(text, x, y, asc, desc, + shape); } } void BufferView::hideLockedInsetCursor() { - if (the_locking_inset && available()) { - screen->HideCursor(); + if (theLockingInset() && available()) { + pimpl_->screen_->HideCursor(); } } -void BufferView::fitLockedInsetCursor(long x, long y, int asc, int desc) +void BufferView::fitLockedInsetCursor(int x, int y, int asc, int desc) { - if (the_locking_inset && available()){ - y += text->cursor.y; - if (screen->FitManualCursor(x, y, asc, desc)) + if (theLockingInset() && available()) { + y += text->cursor.y() + theLockingInset()->InsetInInsetY(); + if (pimpl_->screen_->FitManualCursor(text, this, x, y, asc, desc)) updateScrollbar(); } } @@ -745,9 +821,13 @@ void BufferView::fitLockedInsetCursor(long x, long y, int asc, int desc) int BufferView::unlockInset(UpdatableInset * inset) { - if (inset && the_locking_inset == inset) { + if (inset && theLockingInset() == inset) { inset->InsetUnlock(this); - the_locking_inset = 0; + theLockingInset(0); + text->FinishUndo(); + return 0; + } else if (inset && theLockingInset() && + theLockingInset()->UnlockInsetInInset(this, inset)) { text->FinishUndo(); return 0; } @@ -757,15 +837,21 @@ int BufferView::unlockInset(UpdatableInset * inset) void BufferView::lockedInsetStoreUndo(Undo::undo_kind kind) { - if (!the_locking_inset) + if (!theLockingInset()) 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); +#ifndef NEW_INSETS + text->SetUndo(buffer(), kind, + text->cursor.par()-> + ParFromPos(text->cursor.pos())->previous_, + text->cursor.par()-> + ParFromPos(text->cursor.pos())->next_); +#else + text->SetUndo(buffer(), kind, + text->cursor.par()->previous(), + text->cursor.par()->next()); +#endif } @@ -775,26 +861,20 @@ void BufferView::updateInset(Inset * inset, bool mark_dirty) return; // first check for locking insets - if (the_locking_inset) { - if (the_locking_inset == inset) { - if (text->UpdateInset(inset)){ + if (theLockingInset()) { + if (theLockingInset() == inset) { + if (text->UpdateInset(this, inset)) { update(); - if (mark_dirty){ - if (buffer()->isLyxClean()) - owner()->getMiniBuffer()-> - setTimer(4); + if (mark_dirty) { buffer()->markDirty(); } updateScrollbar(); return; } - } else if (the_locking_inset->UpdateInsetInInset(this,inset)) { - if (text->UpdateInset(the_locking_inset)) { + } else if (theLockingInset()->UpdateInsetInInset(this,inset)) { + if (text->UpdateInset(this, theLockingInset())) { update(); if (mark_dirty){ - if (buffer()->isLyxClean()) - owner()->getMiniBuffer()-> - setTimer(4); buffer()->markDirty(); } updateScrollbar(); @@ -806,13 +886,142 @@ void BufferView::updateInset(Inset * inset, bool mark_dirty) // then check the current buffer if (available()) { hideCursor(); - update(-3); - if (text->UpdateInset(inset)){ + update(text, BufferView::UPDATE); + if (text->UpdateInset(this, inset)) { if (mark_dirty) - update(1); + update(text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); else - update(3); + update(text, SELECT); return; } } } + + +bool BufferView::ChangeInsets(Inset::Code code, + 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() == code) { + InsetCommand * inset = static_cast(*it); + if (inset->getContents() == from) { + inset->setContents(to); + flag2 = true; + } + } + } +#ifndef NEW_INSETS + if (flag2) { + flag = true; + if (par->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE){ + // 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); + } + } + par = par->next_; +#else + if (flag2) { + flag = true; + // 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); + } + par = par->next(); +#endif + } + text->SetCursorIntern(this, cursor.par(), cursor.pos()); + return flag; +} + + +bool BufferView::ChangeRefsIfUnique(string const & from, string const & to) +{ + // Check if the label 'from' appears more than once + vector labels = buffer()->getLabelList(); + if (count(labels.begin(), labels.end(), from) > 1) + return false; + + return ChangeInsets(Inset::REF_CODE, from, to); +} + + +bool BufferView::ChangeCitationsIfUnique(string const & from, string const & to) +{ + + vector > keys = buffer()->getBibkeyList(); + if (count_if(keys.begin(), keys.end(), + lyx::equal_1st_in_pair(from)) + > 1) + return false; + + return ChangeInsets(Inset::CITE_CODE, from, to); +} + +UpdatableInset * BufferView::theLockingInset() const +{ + // If NULL is not allowed we should put an Assert here. (Lgb) + if (text) + return text->the_locking_inset; + return 0; +} + + +void BufferView::theLockingInset(UpdatableInset * inset) +{ + text->the_locking_inset = inset; +} + + +LyXText * BufferView::getLyXText() const +{ + if (theLockingInset()) { + LyXText * txt = theLockingInset()->getLyXText(this, true); + if (txt) + return txt; + } + return text; +} + + +LyXText * BufferView::getParentText(Inset * inset) const +{ + if (inset->owner()) { + LyXText * txt = inset->getLyXText(this); + inset = inset->owner(); + while (inset && inset->getLyXText(this) == txt) + inset = inset->owner(); + if (inset) + return inset->getLyXText(this); + } + return text; +} + + +Language const * BufferView::getParentLanguage(Inset * inset) const +{ + LyXText * text = getParentText(inset); + return text->cursor.par()->GetFontSettings(buffer()->params, + text->cursor.pos()).language(); +}