X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsettext.C;h=a1f98b51634c6bc2a35215c4e8b531167776bfec;hb=716cd578ae8def1b71b806bbf15c21e1dfa9a1fc;hp=2d5f381ea49d296b8d43e21465bd0f7ffe737c1c;hpb=4789208ca1bcaeff22d05fa942656fbfc3fe8434;p=lyx.git diff --git a/src/insets/insettext.C b/src/insets/insettext.C index 2d5f381ea4..a1f98b5163 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() { @@ -251,7 +253,8 @@ 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; } @@ -286,8 +289,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==FULL) || (top_baseline!=baseline))) + { int w = insetWidth; int h = insetAscent + insetDescent; int ty = baseline - insetAscent; @@ -308,6 +313,7 @@ void InsetText::draw(BufferView * bv, LyXFont const & f, return; if (top_x != int(x)) { +// printf("InsetText::draw1 -> INIT(%d)\n",insetWidth); need_update = INIT; top_x = int(x); bv->text->status = LyXText::CHANGED_IN_DRAW; @@ -344,7 +350,7 @@ void InsetText::draw(BufferView * bv, LyXFont const & f, if (y_offset < 0) y_offset = y; TEXT(bv)->first = first; - if (cleared || !locked || (need_update == FULL)) { + if (cleared || !locked || (need_update==FULL) || (need_update==INIT)) { int yf = y_offset; y = 0; while ((row != 0) && (yf < ph)) { @@ -355,15 +361,15 @@ void InsetText::draw(BufferView * bv, LyXFont const & f, row = row->next(); } } else if (need_update == SELECTION) { - bv->screen()->ToggleToggle(TEXT(bv), y_offset, int(x)); + bv->screen()->ToggleToggle(TEXT(bv), bv, y_offset, int(x)); } else { locked = false; if (need_update == CURSOR) { - bv->screen()->ToggleSelection(TEXT(bv), true, y_offset,int(x)); + bv->screen()->ToggleSelection(TEXT(bv), bv, true, y_offset,int(x)); TEXT(bv)->ClearSelection(); TEXT(bv)->sel_cursor = TEXT(bv)->cursor; } - bv->screen()->Update(TEXT(bv), y_offset, int(x)); + bv->screen()->Update(TEXT(bv), bv, y_offset, int(x)); locked = true; } } @@ -382,7 +388,10 @@ void InsetText::draw(BufferView * bv, LyXFont const & f, } x += width(bv, f) - TEXT_TO_INSET_OFFSET; if (bv->text->status==LyXText::CHANGED_IN_DRAW) + { need_update = INIT; +// printf("InsetText::draw2 -> INIT(%d)\n",insetWidth); + } else if (need_update != INIT) need_update = NONE; } @@ -444,6 +453,8 @@ void InsetText::update(BufferView * bv, LyXFont const & font, bool reinit) void InsetText::UpdateLocal(BufferView * bv, UpdateCodes what, bool mark_dirty) { +// if (what == INIT) +// printf("InsetText::UpdateLocal -> INIT(%d)\n",insetWidth); TEXT(bv)->FullRebreak(bv); if (need_update != INIT) { if (TEXT(bv)->status == LyXText::NEED_MORE_REFRESH) @@ -480,6 +491,7 @@ 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)) @@ -489,6 +501,14 @@ void InsetText::Edit(BufferView * bv, int x, int y, unsigned int button) 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. + if (par->Last() == 0 && !par->next) { + LyXFont font(LyXFont::ALL_IGNORE); + font.setLanguage(bv->getParentLanguage(this)); + SetFont(bv, font, false); + } } @@ -523,6 +543,7 @@ bool InsetText::LockInsetInInset(BufferView * bv, UpdatableInset * inset) inset_y = cy(bv) + drawTextYOffset; inset_pos = cpos(bv); inset_par = cpar(bv); + inset_boundary = cboundary(bv); TEXT(bv)->UpdateInset(bv, the_locking_inset); return true; } else if (the_locking_inset && (the_locking_inset == inset)) { @@ -618,6 +639,7 @@ void InsetText::InsetButtonPress(BufferView * bv, int x, int y, int button) 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); @@ -733,23 +755,33 @@ InsetText::LocalDispatch(BufferView * bv, UpdateLocal(bv, CURSOR_PAR, false); return result; } else if (result == FINISHED) { + bool dispatched = false; switch (action) { - case -1: + 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_DOWN: - moveDown(bv); + case LFUN_LEFT: + if (TEXT(bv)->cursor.par()->isRightToLeftPar(bv->buffer()->params)) + moveRightIntern(bv, false, false); + dispatched = true; 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")); @@ -771,23 +803,7 @@ InsetText::LocalDispatch(BufferView * bv, bv->text->cursor.par()->next #endif ); - // if an empty paragraph set the language to the surronding - // paragraph language on insertion of the first character! - if (!par->Last() && !par->next) { - LyXText * text = 0; - if (owner()) { - Inset * inset = owner(); - while(inset && inset->getLyXText(bv) == TEXT(bv)) - inset = inset->owner(); - if (inset) - text = inset->getLyXText(bv); - } - if (!text) - text = bv->text; - LyXFont font(LyXFont::ALL_IGNORE); - font.setLanguage(text->cursor.par()->getParLanguage(bv->buffer()->params)); - SetFont(bv, font, false); - } + bv->setState(); if (lyxrc.auto_region_delete) { if (TEXT(bv)->selection){ TEXT(bv)->CutSelection(bv, false); @@ -795,7 +811,23 @@ InsetText::LocalDispatch(BufferView * bv, } TEXT(bv)->ClearSelection(); 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])) { +#if 0 + bv->owner()->getIntl()->getTrans()->TranslateAndInsert(arg[i], TEXT(bv)); +#else + bv->owner()->getIntl()->getTrans().TranslateAndInsert(arg[i], TEXT(bv)); +#endif + } else if (!the_locking_inset) { + (void)moveRight(bv, false); + } + } else { +#if 0 + bv->owner()->getIntl()->getTrans()->TranslateAndInsert(arg[i], TEXT(bv)); +#else + bv->owner()->getIntl()->getTrans().TranslateAndInsert(arg[i], TEXT(bv)); +#endif + } } } UpdateLocal(bv, CURSOR_PAR, true); @@ -822,7 +854,7 @@ InsetText::LocalDispatch(BufferView * bv, break; case LFUN_LEFT: bv->text->FinishUndo(); - result= moveLeft(bv); + result = moveLeft(bv); TEXT(bv)->ClearSelection(); TEXT(bv)->sel_cursor = TEXT(bv)->cursor; UpdateLocal(bv, CURSOR, false); @@ -959,6 +991,12 @@ 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; @@ -1203,10 +1241,30 @@ void InsetText::HideInsetCursor(BufferView * bv) UpdatableInset::RESULT 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())) return FINISHED; - if (activate_inset && checkAndActivateInset(bv, false)) + if (activate_inset && checkAndActivateInset(bv, behind)) return DISPATCHED; TEXT(bv)->CursorRight(bv, selecting); return DISPATCHED_NOUPDATE; @@ -1214,12 +1272,13 @@ InsetText::moveRight(BufferView * bv, bool activate_inset, bool selecting) UpdatableInset::RESULT -InsetText::moveLeft(BufferView * bv, bool activate_inset, bool selecting) +InsetText::moveLeftIntern(BufferView * bv, bool behind, + bool activate_inset, bool selecting) { if (!cpar(bv)->previous && (cpos(bv) <= 0)) return FINISHED; TEXT(bv)->CursorLeft(bv, selecting); - if (activate_inset && checkAndActivateInset(bv, true)) + if (activate_inset && checkAndActivateInset(bv, behind)) return DISPATCHED; return DISPATCHED_NOUPDATE; } @@ -1321,13 +1380,14 @@ bool InsetText::checkAndActivateInset(BufferView * bv, bool behind) 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); @@ -1410,6 +1470,15 @@ void InsetText::SetParagraphData(LyXParagraph *p) } +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) { @@ -1480,6 +1549,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 { @@ -1487,15 +1561,18 @@ Row * InsetText::crow(BufferView * bv) const } -LyXText * InsetText::getLyXText(BufferView * bv) const +LyXText * InsetText::getLyXText(BufferView const * lbv) const { + // Super UGLY! (Lgb) + BufferView * bv = const_cast(lbv); + if ((cache.find(bv) != cache.end()) && cache[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); } return lt; } @@ -1530,6 +1607,9 @@ void InsetText::resizeLyXText(BufferView * bv) const 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; @@ -1538,10 +1618,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; } @@ -1553,13 +1636,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)->SetCursor(bv, selendpar, selendpos, true, selendboundary); TEXT(bv)->SetSelection(); 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; }