X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsettext.C;h=9d414218ba572794709d44d5f915690177084739;hb=b95e8f250dca6264900d8aedf98e8a24411c36d4;hp=3b224b9b4945b1f7583beac871109e154be621c4;hpb=99d6f056e4e1c7514696ca29cf567d6cbb300aee;p=lyx.git diff --git a/src/insets/insettext.C b/src/insets/insettext.C index 3b224b9b49..9d414218ba 100644 --- a/src/insets/insettext.C +++ b/src/insets/insettext.C @@ -55,6 +55,8 @@ using std::min; using std::max; extern unsigned char getCurrentTextClass(Buffer *); +extern bool math_insert_greek(BufferView *, char); +extern int greek_kb_flag; InsetText::InsetText() { @@ -82,14 +84,19 @@ InsetText & InsetText::operator=(InsetText const & it) void InsetText::init(InsetText const * ins) { - top_y = last_width = last_height = 0; - insetAscent = insetDescent = insetWidth = 0; + top_y = 0; + last_width = 0; + last_height = 0; + insetAscent = 0; + insetDescent = 0; + insetWidth = 0; the_locking_inset = 0; cursor_visible = false; interline_space = 1; no_selection = false; need_update = INIT; - drawTextXOffset = drawTextYOffset = 0; + drawTextXOffset = 0; + drawTextYOffset = 0; autoBreakRows = false; drawFrame = NEVER; xpos = 0.0; @@ -107,33 +114,62 @@ void InsetText::init(InsetText const * ins) InsetText::~InsetText() { - for(Cache::const_iterator cit=cache.begin(); cit != cache.end(); ++cit) + // delete all instances of LyXText before deleting the paragraps used + // by it. + for (Cache::iterator cit = cache.begin(); cit != cache.end(); ++cit){ delete (*cit).second; -// deleteLyXText((*cit).first); - LyXParagraph * p = par->next; + (*cit).second = 0; + } +#ifndef NEW_INSETS + LyXParagraph * p = par->next_; delete par; while(p) { par = p; - p = p->next; + p = p->next_; delete par; } +#else + LyXParagraph * p = par->next(); + delete par; + while(p) { + par = p; + p = p->next(); + delete par; + } +#endif } void InsetText::clear() { - LyXParagraph * p = par->next; + // delete all instances of LyXText before deleting the paragraps used + // by it. + for (Cache::iterator cit = cache.begin(); cit != cache.end(); ++cit){ + delete (*cit).second; + (*cit).second = 0; + } +#ifndef NEW_INSETS + LyXParagraph * p = par->next_; delete par; while(p) { par = p; - p = p->next; + p = p->next_; delete par; } +#else + LyXParagraph * p = par->next(); + delete par; + while(p) { + par = p; + p = p->next(); + delete par; + } +#endif par = new LyXParagraph(); } -Inset * InsetText::Clone() const +Inset * InsetText::Clone(Buffer const &) const { InsetText * t = new InsetText(*this); return t; @@ -165,13 +201,30 @@ void InsetText::Read(Buffer const * buf, LyXLex & lex) #endif LyXFont font(LyXFont::ALL_INHERIT); - LyXParagraph * p = par->next; + // delete all instances of LyXText before deleting the paragraps used + // by it. + for (Cache::iterator cit = cache.begin(); cit != cache.end(); ++cit){ + delete (*cit).second; + (*cit).second = 0; + } + +#ifndef NEW_INSETS + LyXParagraph * p = par->next_; delete par; while(p) { par = p; - p = p->next; + p = p->next_; delete par; } +#else + LyXParagraph * p = par->next(); + delete par; + while(p) { + par = p; + p = p->next(); + delete par; + } +#endif par = new LyXParagraph; while (lex.IsOK()) { lex.nextToken(); @@ -198,7 +251,11 @@ void InsetText::Read(Buffer const * buf, LyXLex & lex) par = return_par; while(return_par) { return_par->SetInsetOwner(this); - return_par = return_par->next; +#ifndef NEW_INSETS + return_par = return_par->next_; +#else + return_par = return_par->next(); +#endif } if (token != "\\end_inset") { @@ -211,7 +268,7 @@ void InsetText::Read(Buffer const * buf, LyXLex & lex) int InsetText::ascent(BufferView * bv, LyXFont const &) const { - long int y_temp = 0; + int y_temp = 0; Row * row = TEXT(bv)->GetRowNearY(y_temp); insetAscent = row->ascent_of_text() + TEXT_TO_INSET_OFFSET; return insetAscent; @@ -220,7 +277,7 @@ int InsetText::ascent(BufferView * bv, LyXFont const &) const int InsetText::descent(BufferView * bv, LyXFont const &) const { - long int y_temp = 0; + int y_temp = 0; Row * row = TEXT(bv)->GetRowNearY(y_temp); insetDescent = TEXT(bv)->height - row->ascent_of_text() + TEXT_TO_INSET_OFFSET; @@ -230,14 +287,15 @@ int InsetText::descent(BufferView * bv, LyXFont const &) const int InsetText::width(BufferView * bv, LyXFont const &) const { - insetWidth = TEXT(bv)->width + (2 * TEXT_TO_INSET_OFFSET); + insetWidth = max(textWidth(bv->painter()), + (int)TEXT(bv)->width + (2 * TEXT_TO_INSET_OFFSET)); return insetWidth; } int InsetText::textWidth(Painter & pain) const { - int w = getMaxWidth(pain, this); + int const w = getMaxWidth(pain, this); return w; } @@ -249,7 +307,7 @@ void InsetText::draw(BufferView * bv, LyXFont const & f, // no draw is necessary !!! if ((drawFrame == LOCKED) && !locked && !par->size()) { - if (!cleared && (need_update == CLEAR_FRAME)) { + if (!cleared && (need_update & CLEAR_FRAME)) { pain.rectangle(top_x + 1, baseline - insetAscent + 1, width(bv, f) - 1, insetAscent + insetDescent - 1, @@ -265,8 +323,10 @@ void InsetText::draw(BufferView * bv, LyXFont const & f, xpos = x; UpdatableInset::draw(bv, f, baseline, x, cleared); - if (!cleared && ((need_update==FULL) || (top_x!=int(x)) || - (top_baseline!=baseline))) { + // if top_x differs we have a rule down and we don't have to clear anything + if (!cleared && (top_x == int(x)) && + ((need_update==INIT)||(need_update==FULL)||(top_baseline!=baseline))) + { int w = insetWidth; int h = insetAscent + insetDescent; int ty = baseline - insetAscent; @@ -308,42 +368,68 @@ void InsetText::draw(BufferView * bv, LyXFont const & f, return; } x += TEXT_TO_INSET_OFFSET; - long int y = 0; - Row * row = TEXT(bv)->GetRowNearY(y); - y += baseline - row->ascent_of_text(); - if (cleared || !locked || (need_update == FULL)) { - while (row != 0) { - TEXT(bv)->GetVisibleRow(bv, y, int(x), row, y, cleared); + { + int y = 0; + Row * row = TEXT(bv)->GetRowNearY(y); + int y_offset = baseline - row->ascent_of_text(); + int ph = pain.paperHeight(); + int first = 0; + y = y_offset; + while ((row != 0) && ((y+row->height()) <= 0)) { y += row->height(); + first += row->height(); row = row->next(); } - } else if (need_update == SELECTION) { - bv->screen()->ToggleToggle(TEXT(bv), y, int(x)); - } else { - locked = false; - if (need_update == CURSOR) { - bv->screen()->ToggleSelection(TEXT(bv), true, y, int(x)); - TEXT(bv)->ClearSelection(); - TEXT(bv)->sel_cursor = TEXT(bv)->cursor; + if (y_offset < 0) + y_offset = y; + TEXT(bv)->first = first; + if (cleared) { // (need_update&FULL) || (need_update&INIT) + int yf = y_offset; + y = 0; + while ((row != 0) && (yf < ph)) { + TEXT(bv)->GetVisibleRow(bv, y+y_offset, int(x), row, + y+first, cleared); + y += row->height(); + yf += row->height(); + row = row->next(); + } + } else if (!locked) { + if (need_update & CURSOR) { + bv->screen()->ToggleSelection(TEXT(bv), bv, true, y_offset,int(x)); + TEXT(bv)->ClearSelection(bv); + TEXT(bv)->sel_cursor = TEXT(bv)->cursor; + } + bv->screen()->Update(TEXT(bv), bv, y_offset, int(x)); + } else { + locked = false; + if (need_update & SELECTION) + bv->screen()->ToggleToggle(TEXT(bv), bv, y_offset, int(x)); + else if (need_update & CURSOR) { + bv->screen()->ToggleSelection(TEXT(bv), bv, true, y_offset,int(x)); + TEXT(bv)->ClearSelection(bv); + TEXT(bv)->sel_cursor = TEXT(bv)->cursor; + } + bv->screen()->Update(TEXT(bv), bv, y_offset, int(x)); + locked = true; } - bv->screen()->Update(TEXT(bv), y, int(x)); - locked = true; } TEXT(bv)->refresh_y = 0; TEXT(bv)->status = LyXText::UNCHANGED; - if ((drawFrame == ALWAYS) || ((drawFrame == LOCKED) && locked)) { + if ((need_update != CURSOR_PAR) && + ((drawFrame == ALWAYS) || ((drawFrame == LOCKED) && locked))) + { pain.rectangle(top_x + 1, baseline - insetAscent + 1, width(bv, f) - 1, insetAscent + insetDescent - 1, frame_color); - } else if (need_update == CLEAR_FRAME) { + } else if (need_update & CLEAR_FRAME) { pain.rectangle(top_x + 1, baseline - insetAscent + 1, width(bv, f) - 1, insetAscent + insetDescent - 1, LColor::background); } x += width(bv, f) - TEXT_TO_INSET_OFFSET; - if (bv->text->status==LyXText::CHANGED_IN_DRAW) + if (bv->text->status==LyXText::CHANGED_IN_DRAW) { need_update = INIT; - else if (need_update != INIT) + } else if (need_update != INIT) need_update = NONE; } @@ -365,8 +451,6 @@ void InsetText::update(BufferView * bv, LyXFont const & font, bool reinit) if (need_update == INIT) { resizeLyXText(bv); need_update = FULL; -// if (!owner() && bv->text) -// bv->text->UpdateInset(bv, this); } int oldw = insetWidth; #if 1 @@ -384,20 +468,7 @@ void InsetText::update(BufferView * bv, LyXFont const & font, bool reinit) // textWidth(bv->painter()),static_cast(TEXT(bv)->width)); resizeLyXText(bv); need_update = FULL; -#if 0 - if (owner()) { - owner()->update(bv, font, reinit); - return; - } else { - update(bv, font, reinit); - } -#else -#if 1 update(bv, font, reinit); -#else - UpdateLocal(bv, INIT, false); -#endif -#endif return; } if ((need_update==CURSOR_PAR) && (TEXT(bv)->status==LyXText::UNCHANGED) && @@ -409,23 +480,30 @@ void InsetText::update(BufferView * bv, LyXFont const & font, bool reinit) if (TEXT(bv)->status == LyXText::NEED_MORE_REFRESH) need_update = FULL; - long int y_temp = 0; + int y_temp = 0; Row * row = TEXT(bv)->GetRowNearY(y_temp); insetAscent = row->ascent_of_text() + TEXT_TO_INSET_OFFSET; insetDescent = TEXT(bv)->height - row->ascent_of_text() + TEXT_TO_INSET_OFFSET; } +void InsetText::SetUpdateStatus(BufferView * bv, int what) +{ + need_update |= what; + if (TEXT(bv)->status == LyXText::NEED_MORE_REFRESH) + need_update |= FULL; + else if (TEXT(bv)->status == LyXText::NEED_VERY_LITTLE_REFRESH) + need_update |= CURSOR_PAR; + + // this to not draw a selection when we redraw all of it! + if ((need_update & (INIT|FULL)) && (need_update & CURSOR)) + TEXT(bv)->ClearSelection(bv); +} -void InsetText::UpdateLocal(BufferView * bv, UpdateCodes what, bool mark_dirty) +void InsetText::UpdateLocal(BufferView * bv, int what, bool mark_dirty) { TEXT(bv)->FullRebreak(bv); - if (need_update != INIT) { - if (TEXT(bv)->status == LyXText::NEED_MORE_REFRESH) - need_update = FULL; - else if (!the_locking_inset || (what != CURSOR)) - need_update = what; - } + SetUpdateStatus(bv, what); if ((need_update != CURSOR) || (TEXT(bv)->status != LyXText::UNCHANGED) || TEXT(bv)->selection) bv->updateInset(this, mark_dirty); @@ -455,14 +533,28 @@ void InsetText::Edit(BufferView * bv, int x, int y, unsigned int button) locked = true; the_locking_inset = 0; inset_pos = inset_x = inset_y = 0; + inset_boundary = false; inset_par = 0; old_par = 0; if (!checkAndActivateInset(bv, x, y, button)) TEXT(bv)->SetCursorFromCoordinates(bv, x-drawTextXOffset, - y+TEXT(bv)->first+insetAscent); + y+insetAscent); TEXT(bv)->sel_cursor = TEXT(bv)->cursor; bv->text->FinishUndo(); + ShowInsetCursor(bv); UpdateLocal(bv, FULL, false); + + // If the inset is empty set the language of the current font to the + // language to the surronding text. +#ifndef NEW_INSETS + if (par->Last() == 0 && !par->next_) { +#else# + if (par->Last() == 0 && !par->next()) { +#endif + LyXFont font(LyXFont::ALL_IGNORE); + font.setLanguage(bv->getParentLanguage(this)); + SetFont(bv, font, false); + } } @@ -475,8 +567,7 @@ void InsetText::InsetUnlock(BufferView * bv) HideInsetCursor(bv); no_selection = false; locked = false; - TEXT(bv)->selection = 0; - UpdateLocal(bv, CLEAR_FRAME, false); + UpdateLocal(bv, CLEAR_FRAME|CURSOR, false); if (owner()) bv->owner()->setLayout(owner()->getLyXText(bv) ->cursor.par()->GetLayout()); @@ -497,7 +588,14 @@ bool InsetText::LockInsetInInset(BufferView * bv, UpdatableInset * inset) inset_y = cy(bv) + drawTextYOffset; inset_pos = cpos(bv); inset_par = cpar(bv); + inset_boundary = cboundary(bv); +#if 0 + TEXT(bv)->ClearSelection(bv); + TEXT(bv)->sel_cursor = TEXT(bv)->cursor; TEXT(bv)->UpdateInset(bv, the_locking_inset); +#else + UpdateLocal(bv, CURSOR, false); +#endif return true; } else if (the_locking_inset && (the_locking_inset == inset)) { if (cpar(bv) == inset_par && cpos(bv) == inset_pos) { @@ -541,7 +639,7 @@ bool InsetText::UpdateInsetInInset(BufferView * bv, Inset * inset) return false; if (the_locking_inset != inset) { TEXT(bv)->UpdateInset(bv, the_locking_inset); - need_update = CURSOR_PAR; + SetUpdateStatus(bv, CURSOR_PAR); return the_locking_inset->UpdateInsetInInset(bv, inset); } // UpdateLocal(bv, FULL, false); @@ -557,45 +655,49 @@ bool InsetText::UpdateInsetInInset(BufferView * bv, Inset * inset) void InsetText::InsetButtonPress(BufferView * bv, int x, int y, int button) { - no_selection = false; + no_selection = true; int tmp_x = x - drawTextXOffset; - int tmp_y = y + insetAscent; + int tmp_y = y + insetAscent - TEXT(bv)->first; Inset * inset = bv->checkInsetHit(TEXT(bv), tmp_x, tmp_y, button); HideInsetCursor(bv); if (the_locking_inset) { if (the_locking_inset == inset) { the_locking_inset->InsetButtonPress(bv,x-inset_x,y-inset_y,button); + no_selection = false; return; } else if (inset) { // otherwise unlock the_locking_inset and lock the new inset the_locking_inset->InsetUnlock(bv); inset_x = cx(bv) - top_x + drawTextXOffset; inset_y = cy(bv) + drawTextYOffset; + the_locking_inset = static_cast(inset); inset->InsetButtonPress(bv, x - inset_x, y - inset_y, button); inset->Edit(bv, x - inset_x, y - inset_y, button); - if (the_locking_inset) { - UpdateLocal(bv, CURSOR_PAR, false); - } + if (the_locking_inset) + UpdateLocal(bv, CURSOR, false); + no_selection = false; return; } // otherwise only unlock the_locking_inset the_locking_inset->InsetUnlock(bv); the_locking_inset = 0; } - if (bv->the_locking_inset) { + if (bv->theLockingInset()) { if (inset && inset->Editable() == Inset::HIGHLY_EDITABLE) { UpdatableInset * uinset = static_cast(inset); inset_x = cx(bv) - top_x + drawTextXOffset; inset_y = cy(bv) + drawTextYOffset; inset_pos = cpos(bv); inset_par = cpar(bv); + inset_boundary = cboundary(bv); + the_locking_inset = uinset; uinset->InsetButtonPress(bv, x - inset_x, y - inset_y, button); uinset->Edit(bv, x - inset_x, y - inset_y, 0); - if (the_locking_inset) { - UpdateLocal(bv, CURSOR_PAR, false); - } + if (the_locking_inset) + UpdateLocal(bv, CURSOR, false); + no_selection = false; return; } } @@ -606,7 +708,7 @@ void InsetText::InsetButtonPress(BufferView * bv, int x, int y, int button) paste_internally = true; } TEXT(bv)->SetCursorFromCoordinates(bv, x-drawTextXOffset, - y+TEXT(bv)->first+insetAscent); + y + insetAscent); TEXT(bv)->sel_cursor = TEXT(bv)->cursor; UpdateLocal(bv, CURSOR, false); bv->owner()->setLayout(cpar(bv)->GetLayout()); @@ -622,6 +724,7 @@ void InsetText::InsetButtonPress(BufferView * bv, int x, int y, int button) } } ShowInsetCursor(bv); + no_selection = false; } @@ -653,22 +756,21 @@ void InsetText::InsetButtonRelease(BufferView * bv, int x, int y, int button) void InsetText::InsetMotionNotify(BufferView * bv, int x, int y, int state) { + if (no_selection) + return; if (the_locking_inset) { the_locking_inset->InsetMotionNotify(bv, x - inset_x, y - inset_y,state); return; } - if (!no_selection) { - HideInsetCursor(bv); - TEXT(bv)->SetCursorFromCoordinates(bv, x-drawTextXOffset, - y+TEXT(bv)->first+insetAscent); - TEXT(bv)->SetSelection(); - if (TEXT(bv)->toggle_cursor.par()!=TEXT(bv)->toggle_end_cursor.par() || - TEXT(bv)->toggle_cursor.pos()!=TEXT(bv)->toggle_end_cursor.pos()) - UpdateLocal(bv, SELECTION, false); - ShowInsetCursor(bv); - } - no_selection = false; + HideInsetCursor(bv); + TEXT(bv)->SetCursorFromCoordinates(bv, x-drawTextXOffset, + y+insetAscent); + TEXT(bv)->SetSelection(bv); + if (TEXT(bv)->toggle_cursor.par()!=TEXT(bv)->toggle_end_cursor.par() || + TEXT(bv)->toggle_cursor.pos()!=TEXT(bv)->toggle_end_cursor.pos()) + UpdateLocal(bv, SELECTION, false); + ShowInsetCursor(bv); } @@ -683,7 +785,7 @@ void InsetText::InsetKeyPress(XKeyEvent * xke) UpdatableInset::RESULT InsetText::LocalDispatch(BufferView * bv, - int action, string const & arg) + kb_action action, string const & arg) { no_selection = false; UpdatableInset::RESULT @@ -704,25 +806,36 @@ InsetText::LocalDispatch(BufferView * bv, UpdateLocal(bv, CURSOR_PAR, false); return result; } else if (result == FINISHED) { - switch(action) { - case -1: + bool dispatched = false; + switch (action) { + case LFUN_UNKNOWN_ACTION: + case LFUN_BREAKPARAGRAPH: + case LFUN_BREAKLINE: + moveRightIntern(bv, false, false); + break; case LFUN_RIGHT: - moveRight(bv, false); + if (!TEXT(bv)->cursor.par()->isRightToLeftPar(bv->buffer()->params)) + moveRightIntern(bv, false, false); + dispatched = true; + break; + case LFUN_LEFT: + if (TEXT(bv)->cursor.par()->isRightToLeftPar(bv->buffer()->params)) + moveRightIntern(bv, false, false); + dispatched = true; break; - case LFUN_DOWN: - moveDown(bv); + default: break; } the_locking_inset = 0; - return DISPATCHED; + if (dispatched) + return DISPATCHED; } } HideInsetCursor(bv); switch (action) { // Normal chars - case -1: + case LFUN_UNKNOWN_ACTION: if (bv->buffer()->isReadonly()) { - LyXBell(); // setErrorMessage(N_("Document is read only")); break; } @@ -735,30 +848,41 @@ InsetText::LocalDispatch(BufferView * bv, bv->text->SetUndo(bv->buffer(), Undo::INSERT, #ifndef NEW_INSETS - bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous, - bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_, + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_ #else - bv->text->cursor.par()->previous, - bv->text->cursor.par()->next + bv->text->cursor.par()->previous(), + bv->text->cursor.par()->next() #endif ); + bv->setState(); if (lyxrc.auto_region_delete) { if (TEXT(bv)->selection){ TEXT(bv)->CutSelection(bv, false); } } - TEXT(bv)->ClearSelection(); + TEXT(bv)->ClearSelection(bv); for (string::size_type i = 0; i < arg.length(); ++i) { - bv->owner()->getIntl()->getTrans()->TranslateAndInsert(arg[i], TEXT(bv)); + if (greek_kb_flag) { + if (!math_insert_greek(bv, arg[i])) { + bv->owner()->getIntl()->getTrans().TranslateAndInsert(arg[i], TEXT(bv)); + } else if (!the_locking_inset) { + (void)moveRight(bv, false); + } + } else { + bv->owner()->getIntl()->getTrans().TranslateAndInsert(arg[i], TEXT(bv)); + } } } + TEXT(bv)->sel_cursor = TEXT(bv)->cursor; UpdateLocal(bv, CURSOR_PAR, true); + result=DISPATCHED_NOUPDATE; break; // --- Cursor Movements --------------------------------------------- case LFUN_RIGHTSEL: bv->text->FinishUndo(); - moveRight(bv, false); - TEXT(bv)->SetSelection(); + moveRight(bv, false, true); + TEXT(bv)->SetSelection(bv); UpdateLocal(bv, SELECTION, false); break; case LFUN_RIGHT: @@ -768,19 +892,19 @@ InsetText::LocalDispatch(BufferView * bv, break; case LFUN_LEFTSEL: bv->text->FinishUndo(); - moveLeft(bv, false); - TEXT(bv)->SetSelection(); + moveLeft(bv, false, true); + TEXT(bv)->SetSelection(bv); UpdateLocal(bv, SELECTION, false); break; case LFUN_LEFT: bv->text->FinishUndo(); - result= moveLeft(bv); + result = moveLeft(bv); UpdateLocal(bv, CURSOR, false); break; case LFUN_DOWNSEL: bv->text->FinishUndo(); moveDown(bv); - TEXT(bv)->SetSelection(); + TEXT(bv)->SetSelection(bv); UpdateLocal(bv, SELECTION, false); break; case LFUN_DOWN: @@ -791,7 +915,7 @@ InsetText::LocalDispatch(BufferView * bv, case LFUN_UPSEL: bv->text->FinishUndo(); moveUp(bv); - TEXT(bv)->SetSelection(); + TEXT(bv)->SetSelection(bv); UpdateLocal(bv, SELECTION, false); break; case LFUN_UP: @@ -811,11 +935,11 @@ InsetText::LocalDispatch(BufferView * bv, case LFUN_BACKSPACE: bv->text->SetUndo(bv->buffer(), Undo::DELETE, #ifndef NEW_INSETS - bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous, - bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_, + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_ #else - bv->text->cursor.par()->previous, - bv->text->cursor.par()->next + bv->text->cursor.par()->previous(), + bv->text->cursor.par()->next() #endif ); if (TEXT(bv)->selection) @@ -827,11 +951,11 @@ InsetText::LocalDispatch(BufferView * bv, case LFUN_DELETE: bv->text->SetUndo(bv->buffer(), Undo::DELETE, #ifndef NEW_INSETS - bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous, - bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_, + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_ #else - bv->text->cursor.par()->previous, - bv->text->cursor.par()->next + bv->text->cursor.par()->previous(), + bv->text->cursor.par()->next() #endif ); if (TEXT(bv)->selection) @@ -843,11 +967,11 @@ InsetText::LocalDispatch(BufferView * bv, case LFUN_CUT: bv->text->SetUndo(bv->buffer(), Undo::DELETE, #ifndef NEW_INSETS - bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous, - bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_, + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_ #else - bv->text->cursor.par()->previous, - bv->text->cursor.par()->next + bv->text->cursor.par()->previous(), + bv->text->cursor.par()->next() #endif ); TEXT(bv)->CutSelection(bv); @@ -885,11 +1009,11 @@ InsetText::LocalDispatch(BufferView * bv, } bv->text->SetUndo(bv->buffer(), Undo::INSERT, #ifndef NEW_INSETS - bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous, - bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_, + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_ #else - bv->text->cursor.par()->previous, - bv->text->cursor.par()->next + bv->text->cursor.par()->previous(), + bv->text->cursor.par()->next() #endif ); TEXT(bv)->PasteSelection(bv); @@ -901,16 +1025,22 @@ InsetText::LocalDispatch(BufferView * bv, TEXT(bv)->BreakParagraph(bv, 0); UpdateLocal(bv, FULL, true); break; + case LFUN_BREAKPARAGRAPHKEEPLAYOUT: + if (!autoBreakRows) + return DISPATCHED; + TEXT(bv)->BreakParagraph(bv, 1); + UpdateLocal(bv, FULL, true); + break; case LFUN_BREAKLINE: if (!autoBreakRows) return DISPATCHED; bv->text->SetUndo(bv->buffer(), Undo::INSERT, #ifndef NEW_INSETS - bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous, - bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_, + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_ #else - bv->text->cursor.par()->previous, - bv->text->cursor.par()->next + bv->text->cursor.par()->previous(), + bv->text->cursor.par()->next() #endif ); TEXT(bv)->InsertChar(bv, LyXParagraph::META_NEWLINE); @@ -919,7 +1049,7 @@ InsetText::LocalDispatch(BufferView * bv, case LFUN_LAYOUT: // do not set layouts on non breakable textinsets if (autoBreakRows) { - static LyXTextClass::size_type cur_layout = cpar(bv)->layout; + LyXTextClass::size_type cur_layout = cpar(bv)->layout; // Derive layout number from given argument (string) // and current buffer's textclass (number). */ @@ -961,10 +1091,10 @@ InsetText::LocalDispatch(BufferView * bv, // inherit bufferparams/paragraphparams in a strange way. (Lgb) { LyXParagraph * par = TEXT(bv)->cursor.par(); - Spacing::Space cur_spacing = par->spacing.getSpace(); + Spacing::Space cur_spacing = par->params.spacing().getSpace(); float cur_value = 1.0; if (cur_spacing == Spacing::Other) { - cur_value = par->spacing.getValue(); + cur_value = par->params.spacing().getValue(); } std::istringstream istr(arg.c_str()); @@ -995,7 +1125,7 @@ InsetText::LocalDispatch(BufferView * bv, << arg << endl; } if (cur_spacing != new_spacing || cur_value != new_value) { - par->spacing.set(new_spacing, new_value); + par->params.spacing(Spacing(new_spacing, new_value)); //TEXT(bv)->RedoParagraph(owner->view()); UpdateLocal(bv, CURSOR_PAR, true); //bv->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); @@ -1004,9 +1134,23 @@ InsetText::LocalDispatch(BufferView * bv, break; default: - result = UNDISPATCHED; + if (!bv->Dispatch(action, arg)) + result = UNDISPATCHED; break; } + + /// If the action has deleted all text in the inset, we need to change the + // language to the language to the surronding text. +#ifndef NEW_INSETS + if (par->Last() == 0 && !par->next_) { +#else + if (par->Last() == 0 && !par->next()) { +#endif + LyXFont font(LyXFont::ALL_IGNORE); + font.setLanguage(bv->getParentLanguage(this)); + SetFont(bv, font, false); + } + if (result != FINISHED) { ShowInsetCursor(bv); } else @@ -1026,11 +1170,40 @@ int InsetText::Latex(Buffer const * buf, ostream & os, bool, bool) const int InsetText::Ascii(Buffer const * buf, ostream & os, int linelen) const { LyXParagraph * p = par; + unsigned int lines = 0; + + string tmp; + while (p) { + tmp = buf->asciiParagraph(p, linelen); + lines += countChar(tmp, '\n'); + os << tmp; +#ifndef NEW_INSETS + p = p->next(); +#else + p = p->next(); +#endif + } + return lines; +} + + +int InsetText::DocBook(Buffer const * buf, ostream & os) const +{ + LyXParagraph * p = par; + unsigned int lines = 0; + int desc=0; + + string tmp; while (p) { - os << buf->asciiParagraph(p, linelen); - p = p->next; + buf->SimpleDocBookOnePar(os,tmp,p,desc,0); +#ifndef NEW_INSETS + p = p->next_; +#else + p = p->next(); +#endif } - os << "\n"; + + return lines; } @@ -1039,7 +1212,11 @@ void InsetText::Validate(LaTeXFeatures & features) const LyXParagraph * p = par; while(p) { p->validate(features); - p = p->next; +#ifndef NEW_INSETS + p = p->next_; +#else + p = p->next(); +#endif } } @@ -1054,14 +1231,15 @@ int InsetText::BeginningOfMainBody(Buffer const * buf, LyXParagraph * p) const } -void InsetText::GetCursorPos(BufferView * bv, int & x, int & y) const +void InsetText::GetCursorPos(BufferView * bv, + int & x, int & y) const { x = cx(bv); y = cy(bv); } -int InsetText::InsetInInsetY() +unsigned int InsetText::InsetInInsetY() { if (!the_locking_inset) return 0; @@ -1090,7 +1268,7 @@ void InsetText::ToggleInsetCursor(BufferView * bv) } -void InsetText::ShowInsetCursor(BufferView * bv) +void InsetText::ShowInsetCursor(BufferView * bv, bool show) { if (the_locking_inset) { the_locking_inset->ShowInsetCursor(bv); @@ -1103,7 +1281,8 @@ void InsetText::ShowInsetCursor(BufferView * bv) int desc = lyxfont::maxDescent(font); bv->fitLockedInsetCursor(cx(bv), cy(bv), asc, desc); - bv->showLockedInsetCursor(cx(bv), cy(bv), asc, desc); + if (show) + bv->showLockedInsetCursor(cx(bv), cy(bv), asc, desc); cursor_visible = true; } } @@ -1121,24 +1300,57 @@ void InsetText::HideInsetCursor(BufferView * bv) UpdatableInset::RESULT -InsetText::moveRight(BufferView * bv, bool activate_inset) +InsetText::moveRight(BufferView * bv, bool activate_inset, bool selecting) +{ + if (TEXT(bv)->cursor.par()->isRightToLeftPar(bv->buffer()->params)) + return moveLeftIntern(bv, false, activate_inset, selecting); + else + return moveRightIntern(bv, false, activate_inset, selecting); +} + +UpdatableInset::RESULT +InsetText::moveLeft(BufferView * bv, bool activate_inset, bool selecting) +{ + if (TEXT(bv)->cursor.par()->isRightToLeftPar(bv->buffer()->params)) + return moveRightIntern(bv, true, activate_inset, selecting); + else + return moveLeftIntern(bv, true, activate_inset, selecting); +} + + +UpdatableInset::RESULT +InsetText::moveRightIntern(BufferView * bv, bool behind, + bool activate_inset, bool selecting) { - if (!cpar(bv)->next && (cpos(bv) >= cpar(bv)->Last())) +#ifndef NEW_INSETS + if (!cpar(bv)->next_ && (cpos(bv) >= cpar(bv)->Last())) +#else + if (!cpar(bv)->next() && (cpos(bv) >= cpar(bv)->Last())) +#endif return FINISHED; - if (activate_inset && checkAndActivateInset(bv, false)) + if (activate_inset && checkAndActivateInset(bv, behind)) return DISPATCHED; TEXT(bv)->CursorRight(bv); + if (!selecting) + TEXT(bv)->sel_cursor = TEXT(bv)->cursor; return DISPATCHED_NOUPDATE; } UpdatableInset::RESULT -InsetText::moveLeft(BufferView * bv, bool activate_inset) +InsetText::moveLeftIntern(BufferView * bv, bool behind, + bool activate_inset, bool selecting) { - if (!cpar(bv)->previous && (cpos(bv) <= 0)) +#ifndef NEW_INSETS + if (!cpar(bv)->previous_ && (cpos(bv) <= 0)) +#else + if (!cpar(bv)->previous() && (cpos(bv) <= 0)) +#endif return FINISHED; TEXT(bv)->CursorLeft(bv); - if (activate_inset && checkAndActivateInset(bv, true)) + if (!selecting) + TEXT(bv)->sel_cursor = TEXT(bv)->cursor; + if (activate_inset && checkAndActivateInset(bv, behind)) return DISPATCHED; return DISPATCHED_NOUPDATE; } @@ -1173,21 +1385,24 @@ bool InsetText::InsertInset(BufferView * bv, Inset * inset) } bv->text->SetUndo(bv->buffer(), Undo::INSERT, #ifndef NEW_INSETS - bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous, - bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_, + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_ #else - bv->text->cursor.par()->previous, - bv->text->cursor.par()->next + bv->text->cursor.par()->previous(), + bv->text->cursor.par()->next() #endif ); - if (inset->Editable() == Inset::IS_EDITABLE) { - UpdatableInset * i = static_cast(inset); - i->setOwner(static_cast(this)); - } + inset->setOwner(this); + HideInsetCursor(bv); TEXT(bv)->InsertInset(bv, inset); - TEXT(bv)->selection = 0; - UpdateLocal(bv, CURSOR_PAR, true); - static_cast(inset)->Edit(bv, 0, 0, 0); +#if 0 + if ((cpar(bv)->GetChar(cpos(bv)) != LyXParagraph::META_INSET) || + (cpar(bv)->GetInset(cpos(bv)) != inset)) + TEXT(bv)->CursorLeft(bv); +#endif + bv->fitCursor(TEXT(bv)); + UpdateLocal(bv, CURSOR_PAR|CURSOR, true); + ShowInsetCursor(bv); return true; } @@ -1210,28 +1425,44 @@ UpdatableInset * InsetText::GetFirstLockingInsetOfType(Inset::Code c) void InsetText::SetFont(BufferView * bv, LyXFont const & font, bool toggleall) { + if (TEXT(bv)->selection) { + bv->text->SetUndo(bv->buffer(), Undo::EDIT, +#ifndef NEW_INSETS + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_, + bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_ +#else + bv->text->cursor.par()->previous(), + bv->text->cursor.par()->next() +#endif + ); + } TEXT(bv)->SetFont(bv, font, toggleall); + bv->fitCursor(TEXT(bv)); + UpdateLocal(bv, CURSOR_PAR, true); } bool InsetText::checkAndActivateInset(BufferView * bv, bool behind) { if (cpar(bv)->GetChar(cpos(bv)) == LyXParagraph::META_INSET) { - int x, y; + unsigned int x; + unsigned int y; Inset * inset = static_cast(cpar(bv)->GetInset(cpos(bv))); if (!inset || inset->Editable() != Inset::HIGHLY_EDITABLE) return false; - LyXFont font = TEXT(bv)->GetFont(bv->buffer(), cpar(bv), cpos(bv)); + LyXFont const font = + TEXT(bv)->GetFont(bv->buffer(), cpar(bv), cpos(bv)); if (behind) { x = inset->width(bv, font); - y = inset->descent(bv, font); + y = font.isRightToLeft() ? 0 : inset->descent(bv, font); } else { - x = y = 0; + x = 0; + y = font.isRightToLeft() ? inset->descent(bv, font) : 0; } - inset_x = cx(bv) - top_x + drawTextXOffset; - inset_y = cy(bv) + drawTextYOffset; - inset->Edit(bv, x-inset_x, y-inset_y, 0); + //inset_x = cx(bv) - top_x + drawTextXOffset; + //inset_y = cy(bv) + drawTextYOffset; + inset->Edit(bv, x, y, 0); if (!the_locking_inset) return false; UpdateLocal(bv, CURSOR_PAR, false); @@ -1244,9 +1475,9 @@ bool InsetText::checkAndActivateInset(BufferView * bv, bool behind) bool InsetText::checkAndActivateInset(BufferView * bv, int x, int y, int button) { - int tmp_x = x - drawTextXOffset; - int tmp_y = y + insetAscent; - Inset * inset = bv->checkInsetHit(TEXT(bv), tmp_x, tmp_y, button); + x = x - drawTextXOffset; + y = y + insetAscent; + Inset * inset = bv->checkInsetHit(TEXT(bv), x, y, button); if (inset) { if (x < 0) @@ -1281,33 +1512,71 @@ int InsetText::getMaxWidth(Painter & pain, UpdatableInset const * inset) const } -void InsetText::SetParagraphData(LyXParagraph *p) +void InsetText::SetParagraphData(LyXParagraph * p) { - LyXParagraph * np; + // delete all instances of LyXText before deleting the paragraps used + // by it. + for (Cache::iterator cit = cache.begin(); cit != cache.end(); ++cit){ + delete (*cit).second; + (*cit).second = 0; + } +#ifndef NEW_INSETS + LyXParagraph * np; if (par) { - np = par->next; + np = par->next_; + delete par; + while (np) { + par = np; + np = np->next_; + delete par; + } + } + par = p->Clone(); + par->SetInsetOwner(this); + np = par; + while (p->next_) { + p = p->next_; + np->next(p->Clone()); + np->next_->previous(np); + np = np->next_; + np->SetInsetOwner(this); + } +#else + LyXParagraph * np; + if (par) { + np = par->next(); delete par; while(np) { par = np; - np = np->next; + np = np->next(); delete par; } } par = p->Clone(); par->SetInsetOwner(this); np = par; - while(p->next) { - p = p->next; - np->next = p->Clone(); - np->next->previous = np; - np = np->next; + while(p->next()) { + p = p->next(); + np->next(p->Clone()); + np->next()->previous(np); + np = np->next(); np->SetInsetOwner(this); } +#endif need_update = INIT; } +void InsetText::SetText(string const & data) +{ + clear(); + LyXFont font(LyXFont::ALL_SANE); + for(unsigned int i=0; i < data.length(); ++i) + par->InsertChar(i, data[i], font); +} + + void InsetText::SetAutoBreakRows(bool flag) { if (flag != autoBreakRows) { @@ -1345,9 +1614,18 @@ LyXFont InsetText::GetDrawFont(BufferView * bv, LyXParagraph * p, int pos) const } #endif + int InsetText::cx(BufferView * bv) const { - return TEXT(bv)->cursor.x() + top_x + TEXT_TO_INSET_OFFSET; + LyXText * text = TEXT(bv); + int x = text->cursor.x() + top_x + TEXT_TO_INSET_OFFSET; + if (the_locking_inset) { + LyXFont font = text->GetFont(bv->buffer(), + text->cursor.par(), text->cursor.pos()); + if (font.isVisibleRightToLeft()) + x -= the_locking_inset->width(bv, font); + } + return x; } @@ -1358,7 +1636,7 @@ int InsetText::cy(BufferView * bv) const } -int InsetText::cpos(BufferView * bv) const +LyXParagraph::size_type InsetText::cpos(BufferView * bv) const { return TEXT(bv)->cursor.pos(); } @@ -1369,6 +1647,11 @@ LyXParagraph * InsetText::cpar(BufferView * bv) const return TEXT(bv)->cursor.par(); } +bool InsetText::cboundary(BufferView * bv) const +{ + return TEXT(bv)->cursor.boundary(); +} + Row * InsetText::crow(BufferView * bv) const { @@ -1376,15 +1659,23 @@ Row * InsetText::crow(BufferView * bv) const } -LyXText * InsetText::getLyXText(BufferView * bv) const +LyXText * InsetText::getLyXText(BufferView const * lbv, bool const recursive) const { - if (cache.find(bv) != cache.end()) + // Super UGLY! (Lgb) + BufferView * bv = const_cast(lbv); + + if ((cache.find(bv) != cache.end()) && cache[bv]) { + if (recursive && the_locking_inset) + return the_locking_inset->getLyXText(bv); return cache[bv]; + } LyXText * lt = new LyXText(const_cast(this)); lt->init(bv); cache[bv] = lt; if (the_locking_inset) { - lt->SetCursor(bv, inset_par, inset_pos); + lt->SetCursor(bv, inset_par, inset_pos, true, inset_boundary); + if (recursive) + return the_locking_inset->getLyXText(bv); } return lt; } @@ -1392,33 +1683,46 @@ LyXText * InsetText::getLyXText(BufferView * bv) const void InsetText::deleteLyXText(BufferView * bv, bool recursive) const { - if (cache.find(bv) == cache.end()) + if ((cache.find(bv) == cache.end()) || !cache[bv]) return; delete cache[bv]; cache.erase(bv); if (recursive) { /// then remove all LyXText in text-insets LyXParagraph * p = par; - for(;p;p = p->next) { +#ifndef NEW_INSETS + for (; p; p = p->next_) { + p->deleteInsetsLyXText(bv); + } +#else + for (; p; p = p->next()) { p->deleteInsetsLyXText(bv); } +#endif } } void InsetText::resizeLyXText(BufferView * bv) const { - if (!par->next && !par->size()) // resize not neccessary! +#ifndef NEW_INSETS + if (!par->next_ && !par->size()) // resize not neccessary! +#else + if (!par->next() && !par->size()) // resize not neccessary! +#endif return; - if (cache.find(bv) == cache.end()) + if ((cache.find(bv) == cache.end()) || !cache[bv]) return; LyXParagraph * lpar = 0; LyXParagraph * selstartpar = 0; LyXParagraph * selendpar = 0; - int pos = 0; - int selstartpos = 0; - int selendpos = 0; + LyXParagraph::size_type pos = 0; + LyXParagraph::size_type selstartpos = 0; + LyXParagraph::size_type selendpos = 0; + bool boundary = false; + bool selstartboundary = false; + bool selendboundary = false; int selection = 0; int mark_set = 0; @@ -1427,10 +1731,13 @@ void InsetText::resizeLyXText(BufferView * bv) const if (locked) { lpar = TEXT(bv)->cursor.par(); pos = TEXT(bv)->cursor.pos(); + boundary = TEXT(bv)->cursor.boundary(); selstartpar = TEXT(bv)->sel_start_cursor.par(); selstartpos = TEXT(bv)->sel_start_cursor.pos(); + selstartboundary = TEXT(bv)->sel_start_cursor.boundary(); selendpar = TEXT(bv)->sel_end_cursor.par(); selendpos = TEXT(bv)->sel_end_cursor.pos(); + selendboundary = TEXT(bv)->sel_end_cursor.boundary(); selection = TEXT(bv)->selection; mark_set = TEXT(bv)->mark_set; } @@ -1442,13 +1749,14 @@ void InsetText::resizeLyXText(BufferView * bv) const * Mechanism when setting the cursor */ TEXT(bv)->mark_set = mark_set; if (selection) { - TEXT(bv)->SetCursor(bv, selstartpar, selstartpos); + TEXT(bv)->SetCursor(bv, selstartpar, selstartpos,true, + selstartboundary); TEXT(bv)->sel_cursor = TEXT(bv)->cursor; - TEXT(bv)->SetCursor(bv, selendpar, selendpos); - TEXT(bv)->SetSelection(); + TEXT(bv)->SetCursor(bv, selendpar, selendpos, true, selendboundary); + TEXT(bv)->SetSelection(bv); TEXT(bv)->SetCursor(bv, lpar, pos); } else { - TEXT(bv)->SetCursor(bv, lpar, pos); + TEXT(bv)->SetCursor(bv, lpar, pos, true, boundary); TEXT(bv)->sel_cursor = TEXT(bv)->cursor; TEXT(bv)->selection = false; } @@ -1462,9 +1770,15 @@ void InsetText::resizeLyXText(BufferView * bv) const /// then resize all LyXText in text-insets inset_x = cx(bv) - top_x + drawTextXOffset; inset_y = cy(bv) + drawTextYOffset; - for(LyXParagraph * p = par; p; p = p->next) { +#ifndef NEW_INSETS + for (LyXParagraph * p = par; p; p = p->next_) { + p->resizeInsetsLyXText(bv); + } +#else + for (LyXParagraph * p = par; p; p = p->next()) { p->resizeInsetsLyXText(bv); } +#endif } need_update = FULL; } @@ -1472,8 +1786,12 @@ void InsetText::resizeLyXText(BufferView * bv) const void InsetText::removeNewlines() { - for(LyXParagraph * p = par; p; p = p->next) { - for(int i = 0; i < p->Last(); ++i) { +#ifndef NEW_INSETS + for (LyXParagraph * p = par; p; p = p->next_) { +#else + for (LyXParagraph * p = par; p; p = p->next()) { +#endif + for (int i = 0; i < p->Last(); ++i) { if (p->GetChar(i) == LyXParagraph::META_NEWLINE) p->Erase(i); }