using std::max;
extern unsigned char getCurrentTextClass(Buffer *);
+extern bool math_insert_greek(BufferView *, char);
+extern int greek_kb_flag;
InsetText::InsetText()
{
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);
+ (*cit).second = 0;
+ }
LyXParagraph * p = par->next;
delete par;
while(p) {
void InsetText::clear()
{
+ // 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;
+ }
LyXParagraph * p = par->next;
delete par;
while(p) {
#endif
LyXFont font(LyXFont::ALL_INHERIT);
+ // 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;
+ }
+
LyXParagraph * p = par->next;
delete par;
while(p) {
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;
return;
}
x += TEXT_TO_INSET_OFFSET;
- int y = 0;
- Row * row = TEXT(bv)->GetRowNearY(y);
- int y_offset = baseline - row->ascent_of_text();
- int ph = pain.paperHeight();
- y += y_offset;
- while ((row != 0) && ((y+row->height()) <= 0)) {
- y += row->height();
- row = row->next();
- }
- y -= y_offset;
- TEXT(bv)->first = y;
- if (cleared || !locked || (need_update == FULL)) {
- int first = y;
- y = 0;
- while ((row != 0) && (y < ph)) {
- TEXT(bv)->GetVisibleRow(bv, y+first+y_offset, int(x), row,
- y+first, 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+y_offset, int(x));
- } else {
- locked = false;
- if (need_update == CURSOR) {
- bv->screen()->ToggleSelection(TEXT(bv), true, y+y_offset, 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 || !locked || (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 (need_update == SELECTION) {
+ bv->screen()->ToggleToggle(TEXT(bv), bv, y_offset, int(x));
+ } else {
+ locked = false;
+ if (need_update == CURSOR) {
+ 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), 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;
}
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;
}
if (need_update == INIT) {
resizeLyXText(bv);
need_update = FULL;
-// if (!owner() && bv->text)
-// bv->text->UpdateInset(bv, this);
}
int oldw = insetWidth;
#if 1
// textWidth(bv->painter()),static_cast<int>(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) &&
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)) {
no_selection = false;
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);
the_locking_inset->InsetUnlock(bv);
inset_x = cx(bv) - top_x + drawTextXOffset;
inset_y = cy(bv) + drawTextYOffset;
+ the_locking_inset = static_cast<UpdatableInset*>(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) {
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);
+// TEXT(bv)->ClearSelection();
if (the_locking_inset) {
UpdateLocal(bv, CURSOR_PAR, false);
}
paste_internally = true;
}
TEXT(bv)->SetCursorFromCoordinates(bv, x-drawTextXOffset,
- y+insetAscent);
+ y + insetAscent);
TEXT(bv)->sel_cursor = TEXT(bv)->cursor;
UpdateLocal(bv, CURSOR, false);
bv->owner()->setLayout(cpar(bv)->GetLayout());
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_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);
+ result=DISPATCHED_NOUPDATE;
break;
// --- Cursor Movements ---------------------------------------------
case LFUN_RIGHTSEL:
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);
break;
case LFUN_DOWNSEL:
bv->text->FinishUndo();
result = moveDown(bv);
TEXT(bv)->ClearSelection();
+ TEXT(bv)->sel_cursor = TEXT(bv)->cursor;
UpdateLocal(bv, CURSOR, false);
break;
case LFUN_UPSEL:
bv->text->FinishUndo();
result = moveUp(bv);
TEXT(bv)->ClearSelection();
+ TEXT(bv)->sel_cursor = TEXT(bv)->cursor;
UpdateLocal(bv, CURSOR, false);
break;
case LFUN_HOME:
bv->text->FinishUndo();
TEXT(bv)->CursorHome(bv);
+ TEXT(bv)->ClearSelection();
+ TEXT(bv)->sel_cursor = TEXT(bv)->cursor;
UpdateLocal(bv, CURSOR, false);
break;
case LFUN_END:
TEXT(bv)->CursorEnd(bv);
+ TEXT(bv)->ClearSelection();
+ TEXT(bv)->sel_cursor = TEXT(bv)->cursor;
UpdateLocal(bv, CURSOR, false);
break;
case LFUN_BACKSPACE:
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;
}
+int InsetText::DocBook(Buffer const * buf, ostream & os) const
+{
+ LyXParagraph * p = par;
+ unsigned int lines = 0;
+ int desc=0;
+
+ string tmp;
+ while (p) {
+ buf->SimpleDocBookOnePar(os,tmp,p,desc,0);
+ p = p->next;
+ }
+
+ return lines;
+}
+
+
void InsetText::Validate(LaTeXFeatures & features) const
{
LyXParagraph * p = par;
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;
}
bv->text->cursor.par()->next
#endif
);
- if (inset->Editable() == Inset::IS_EDITABLE) {
- UpdatableInset * i = static_cast<UpdatableInset *>(inset);
- i->setOwner(static_cast<UpdatableInset *>(this));
- }
+ inset->setOwner(this);
HideInsetCursor(bv);
TEXT(bv)->InsertInset(bv, inset);
+ if ((cpar(bv)->GetChar(cpos(bv)) != LyXParagraph::META_INSET) ||
+ (cpar(bv)->GetInset(cpos(bv)) != inset))
+ TEXT(bv)->CursorLeft(bv);
TEXT(bv)->selection = 0;
bv->fitCursor(TEXT(bv));
UpdateLocal(bv, CURSOR_PAR, true);
- static_cast<UpdatableInset*>(inset)->Edit(bv, 0, 0, 0);
ShowInsetCursor(bv);
return true;
}
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::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;
+ }
+ LyXParagraph * np;
if (par) {
np = par->next;
delete par;
}
+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) {
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;
}
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
{
- if (cache.find(bv) != cache.end())
+ // 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;
}
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) {
+ for (;p;p = p->next) {
p->deleteInsetsLyXText(bv);
}
}
{
if (!par->next && !par->size()) // resize not neccessary!
return;
- if (cache.find(bv) == cache.end())
+ if ((cache.find(bv) == cache.end()) || !cache[bv])
return;
LyXParagraph * lpar = 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;
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;
}
/// 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) {
+ for (LyXParagraph * p = par; p; p = p->next) {
p->resizeInsetsLyXText(bv);
}
}
void InsetText::removeNewlines()
{
- for(LyXParagraph * p = par; p; p = p->next) {
- for(int i = 0; i < p->Last(); ++i) {
+ for (LyXParagraph * p = par; p; p = p->next) {
+ for (int i = 0; i < p->Last(); ++i) {
if (p->GetChar(i) == LyXParagraph::META_NEWLINE)
p->Erase(i);
}