using std::max;
extern unsigned char getCurrentTextClass(Buffer *);
+extern bool math_insert_greek(BufferView *, char);
+extern int greek_kb_flag;
InsetText::InsetText()
{
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;
}
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;
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;
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)) {
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;
}
}
}
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;
}
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)
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))
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);
+ }
}
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)) {
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);
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"));
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);
}
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);
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);
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;
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;
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;
}
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);
}
+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) {
return TEXT(bv)->cursor.par();
}
+bool InsetText::cboundary(BufferView * bv) const
+{
+ return TEXT(bv)->cursor.boundary();
+}
+
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<BufferView *>(lbv);
+
if ((cache.find(bv) != cache.end()) && cache[bv])
return cache[bv];
LyXText * lt = new LyXText(const_cast<InsetText *>(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;
}
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;
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;
}
* 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;
}