int InsetText::ascent(BufferView * bv, LyXFont const &) const
{
- bool clear = false;
- if (!lt) {
- lt = getLyXText(bv);
- clear = true;
- }
- insetAscent = lt->firstRow()->ascent_of_text() + TEXT_TO_INSET_OFFSET;
- if (clear)
- lt = 0;
+ insetAscent = getLyXText(bv)->firstRow()->ascent_of_text() +
+ TEXT_TO_INSET_OFFSET;
return insetAscent;
}
int InsetText::descent(BufferView * bv, LyXFont const &) const
{
- bool clear = false;
- if (!lt) {
- lt = getLyXText(bv);
- clear = true;
- }
- insetDescent = lt->height - lt->firstRow()->ascent_of_text() +
+ LyXText * llt = getLyXText(bv);
+ insetDescent = llt->height - llt->firstRow()->ascent_of_text() +
TEXT_TO_INSET_OFFSET;
- if (clear)
- lt = 0;
return insetDescent;
}
} else if (need_update != INIT) {
need_update = NONE;
}
-
if (clear)
lt = 0;
}
lt = getLyXText(bv);
clear = true;
}
-#if 0
- int oldw = insetWidth;
- insetWidth = lt->width + (2 * TEXT_TO_INSET_OFFSET);
- if (oldw != insetWidth) {
- resizeLyXText(bv);
- need_update |= FULL;
- if (clear)
- lt = 0;
- in_update = false;
- return;
- }
-#endif
if ((need_update & CURSOR_PAR) && (lt->status() == LyXText::UNCHANGED) &&
the_locking_inset)
{
void InsetText::setUpdateStatus(BufferView * bv, int what) const
{
- bool clear = false;
- if (!lt) {
- lt = getLyXText(bv);
- clear = true;
- }
+ // this does nothing dangerous so use only a localized buffer
+ LyXText * llt = getLyXText(bv);
+
need_update |= what;
// we have to redraw us full if our LyXText NEEDS_MORE_REFRES or
// if we don't break row so that we only have one row to update!
- if ((lt->status() == LyXText::NEED_MORE_REFRESH) ||
+ if ((llt->status() == LyXText::NEED_MORE_REFRESH) ||
(!autoBreakRows &&
- (lt->status() == LyXText::NEED_VERY_LITTLE_REFRESH)))
+ (llt->status() == LyXText::NEED_VERY_LITTLE_REFRESH)))
{
need_update |= FULL;
- } else if (lt->status() == LyXText::NEED_VERY_LITTLE_REFRESH) {
+ } else if (llt->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 & CURSOR && !(need_update & SELECTION)) {
- if (lt->selection.set())
+ if (llt->selection.set())
need_update = FULL;
- lt->clearSelection();
+ llt->clearSelection();
}
- if (clear)
- lt = 0;
}
void InsetText::updateLocal(BufferView * bv, int what, bool mark_dirty) const
{
+ if (!autoBreakRows && par->next())
+ collapseParagraphs(bv->buffer()->params);
bool clear = false;
if (!lt) {
lt = getLyXText(bv);
}
lt->fullRebreak(bv);
setUpdateStatus(bv, what);
- if (((need_update != CURSOR) && (need_update != NONE)) ||
- (lt->status() != LyXText::UNCHANGED) || lt->selection.set())
- {
+ bool flag = (((need_update != CURSOR) && (need_update != NONE)) ||
+ (lt->status() != LyXText::UNCHANGED) || lt->selection.set());
+ if (clear)
+ lt = 0;
+ if (flag)
bv->updateInset(const_cast<InsetText *>(this), mark_dirty);
- }
if (need_update == CURSOR)
need_update = NONE;
bv->owner()->showState();
bv->owner()->setLayout(cpar(bv)->getLayout());
old_par = cpar(bv);
}
- if (clear)
- lt = 0;
}
lt = getLyXText(bv);
clear = true;
}
-
if (!checkAndActivateInset(bv, x, tmp_y, button))
lt->setCursorFromCoordinates(bv, x - drawTextXOffset,
y + insetAscent);
lt->clearSelection();
finishUndo();
- showInsetCursor(bv);
- updateLocal(bv, CURSOR, false);
-
// If the inset is empty set the language of the current font to the
// language to the surronding text (if different).
if (par->size() == 0 && !par->next() &&
- bv->getParentLanguage(this) != lt->current_font.language()) {
+ bv->getParentLanguage(this) != lt->current_font.language())
+ {
LyXFont font(LyXFont::ALL_IGNORE);
font.setLanguage(bv->getParentLanguage(this));
setFont(bv, font, false);
}
+ showInsetCursor(bv);
if (clear)
lt = 0;
+ updateLocal(bv, CURSOR, false);
}
}
lt->clearSelection();
finishUndo();
- showInsetCursor(bv);
- updateLocal(bv, CURSOR, false);
-
// If the inset is empty set the language of the current font to the
// language to the surronding text (if different).
if (par->size() == 0 && !par->next() &&
font.setLanguage(bv->getParentLanguage(this));
setFont(bv, font, false);
}
+ showInsetCursor(bv);
if (clear)
lt = 0;
+ updateLocal(bv, CURSOR, false);
}
bv->owner()->setLayout(bv->text->cursor.par()->getLayout());
// hack for deleteEmptyParMech
lt->setCursor(bv, par, 0);
- updateLocal(bv, code, false);
if (clear)
lt = 0;
+ updateLocal(bv, code, false);
}
void InsetText::lockInset(BufferView * bv, UpdatableInset * inset)
bool InsetText::updateInsetInInset(BufferView * bv, Inset * inset)
{
+ if (!autoBreakRows && par->next())
+ collapseParagraphs(bv->buffer()->params);
+ if (inset == this)
+ return true;
bool clear = false;
if (!lt) {
lt = getLyXText(bv);
return found;
}
if (the_locking_inset != inset) {
-#if 0
- lt->updateInset(bv, the_locking_inset);
- setUpdateStatus(bv, CURSOR_PAR);
-#endif
bool found = the_locking_inset->updateInsetInInset(bv, inset);
if (clear)
lt = 0;
lt = 0;
if (found) {
setUpdateStatus(bv, CURSOR_PAR);
-#if 0
- updateLocal(bv, CURSOR_PAR, false);
-#endif
if (cpar(bv) == inset_par && cpos(bv) == inset_pos) {
inset_x = cx(bv) - top_x + drawTextXOffset;
inset_y = cy(bv) + drawTextYOffset;
{
no_selection = true;
+ // use this to check mouse motion for selection!
+ mouse_x = x;
+ mouse_y = y;
+
int tmp_x = x - drawTextXOffset;
int tmp_y = y + insetAscent - getLyXText(bv)->first;
Inset * inset = bv->checkInsetHit(getLyXText(bv), tmp_x, tmp_y);
if (lt->selection.set()) {
lt->clearSelection();
+ if (clear)
+ lt = 0;
updateLocal(bv, FULL, false);
} else {
lt->clearSelection();
+ if (clear)
+ lt = 0;
}
bv->owner()->setLayout(cpar(bv)->getLayout());
old_par = cpar(bv);
localDispatch(bv, LFUN_PASTESELECTION,
"paragraph");
}
- if (clear)
- lt = 0;
} else {
- lt->clearSelection();
+ getLyXText(bv)->clearSelection();
}
showInsetCursor(bv);
no_selection = false;
void InsetText::insetMotionNotify(BufferView * bv, int x, int y, int state)
{
- if (no_selection)
+ if (no_selection || ((mouse_x == x) && (mouse_y == y)))
return;
if (the_locking_inset) {
the_locking_inset->insetMotionNotify(bv, x - inset_x,
hideInsetCursor(bv);
LyXCursor cur = lt->cursor;
lt->setCursorFromCoordinates(bv, x - drawTextXOffset, y + insetAscent);
- if (cur == lt->cursor)
+ if (cur == lt->cursor) {
+ if (clear)
+ lt = 0;
return;
+ }
lt->setSelection(bv);
- if (lt->toggle_cursor.par() != lt->toggle_end_cursor.par() ||
- lt->toggle_cursor.pos() != lt->toggle_end_cursor.pos())
- {
+ bool flag = (lt->toggle_cursor.par() != lt->toggle_end_cursor.par() ||
+ lt->toggle_cursor.pos() != lt->toggle_end_cursor.pos());
+ if (clear)
+ lt = 0;
+ if (flag) {
updateLocal(bv, SELECTION, false);
}
showInsetCursor(bv);
- if (clear)
- lt = 0;
}
lt = getLyXText(bv);
clear = true;
}
+ int updwhat = 0;
+ int updflag = false;
switch (action) {
// Normal chars
case LFUN_SELFINSERT:
}
}
lt->selection.cursor = lt->cursor;
- updateLocal(bv, CURSOR_PAR, true);
+ updwhat = CURSOR_PAR;
+ updflag = true;
result = DISPATCHED_NOUPDATE;
break;
// --- Cursor Movements -----------------------------------
finishUndo();
moveRight(bv, false, true);
lt->setSelection(bv);
- updateLocal(bv, SELECTION, false);
+ updwhat = SELECTION;
break;
case LFUN_RIGHT:
result = moveRight(bv);
finishUndo();
- updateLocal(bv, CURSOR, false);
+ updwhat = CURSOR;
break;
case LFUN_LEFTSEL:
finishUndo();
moveLeft(bv, false, true);
lt->setSelection(bv);
- updateLocal(bv, SELECTION, false);
+ updwhat = SELECTION;
break;
case LFUN_LEFT:
finishUndo();
result = moveLeft(bv);
- updateLocal(bv, CURSOR, false);
+ updwhat = CURSOR;
break;
case LFUN_DOWNSEL:
finishUndo();
moveDown(bv);
lt->setSelection(bv);
- updateLocal(bv, SELECTION, false);
+ updwhat = SELECTION;
break;
case LFUN_DOWN:
finishUndo();
result = moveDown(bv);
- updateLocal(bv, CURSOR, false);
+ updwhat = CURSOR;
break;
case LFUN_UPSEL:
finishUndo();
moveUp(bv);
lt->setSelection(bv);
- updateLocal(bv, SELECTION, false);
+ updwhat = SELECTION;
break;
case LFUN_UP:
finishUndo();
result = moveUp(bv);
- updateLocal(bv, CURSOR, false);
+ updwhat = CURSOR;
break;
case LFUN_HOME:
finishUndo();
lt->cursorHome(bv);
- updateLocal(bv, CURSOR, false);
+ updwhat = CURSOR;
break;
case LFUN_END:
lt->cursorEnd(bv);
- updateLocal(bv, CURSOR, false);
+ updwhat = CURSOR;
break;
case LFUN_BACKSPACE: {
setUndo(bv, Undo::DELETE,
lt->cutSelection(bv);
else
lt->backspace(bv);
- updateLocal(bv, CURSOR_PAR, true);
+ updwhat = CURSOR_PAR;
+ updflag = true;
}
break;
} else {
lt->Delete(bv);
}
- updateLocal(bv, CURSOR_PAR, true);
+ updwhat = CURSOR_PAR;
+ updflag = true;
}
break;
setUndo(bv, Undo::DELETE,
lt->cursor.par(), lt->cursor.par()->next());
lt->cutSelection(bv);
- updateLocal(bv, CURSOR_PAR, true);
+ updwhat = CURSOR_PAR;
+ updflag = true;
}
break;
case LFUN_COPY:
finishUndo();
lt->copySelection(bv);
- updateLocal(bv, CURSOR_PAR, false);
+ updwhat = CURSOR_PAR;
break;
case LFUN_PASTESELECTION:
{
} else {
lt->insertStringAsLines(bv, clip);
}
- updateLocal(bv, CURSOR_PAR, true);
+ updwhat = CURSOR_PAR;
+ updflag = true;
break;
}
case LFUN_PASTE: {
setUndo(bv, Undo::INSERT,
lt->cursor.par(), lt->cursor.par()->next());
lt->pasteSelection(bv);
- updateLocal(bv, CURSOR_PAR, true);
+ updwhat = CURSOR_PAR;
+ updflag = true;
}
break;
break;
}
lt->breakParagraph(bv, 0);
- updateLocal(bv, FULL, true);
+ updwhat = FULL;
+ updflag = true;
break;
case LFUN_BREAKPARAGRAPHKEEPLAYOUT:
if (!autoBreakRows) {
break;
}
lt->breakParagraph(bv, 1);
- updateLocal(bv, FULL, true);
+ updwhat = FULL;
+ updflag = true;
break;
case LFUN_BREAKLINE: {
setUndo(bv, Undo::INSERT,
lt->cursor.par(), lt->cursor.par()->next());
lt->insertChar(bv, Paragraph::META_NEWLINE);
- updateLocal(bv, CURSOR_PAR, true);
+ updwhat = CURSOR_PAR;
+ updflag = true;
}
break;
cur_layout = layout.second;
lt->setLayout(bv, layout.second);
bv->owner()->setLayout(cpar(bv)->getLayout());
- updateLocal(bv, CURSOR_PAR, true);
+ updwhat = CURSOR_PAR;
+ updflag = true;
}
} else {
// reset the layout box
}
if (cur_spacing != new_spacing || cur_value != new_value) {
par->params().spacing(Spacing(new_spacing, new_value));
- updateLocal(bv, CURSOR_PAR, true);
+ updwhat = CURSOR_PAR;
+ updflag = true;
}
}
break;
break;
}
+ if (clear)
+ lt = 0;
+ if (updwhat > 0)
+ updateLocal(bv, updwhat, updflag);
/// If the action has deleted all text in the inset, we need to change the
// language to the language of the surronding text.
if (!was_empty && par->size() == 0 && !par->next()) {
showInsetCursor(bv);
} else
bv->unlockInset(this);
- if (clear)
- lt = 0;
return result;
}
clear = true;
}
lt->insertInset(bv, inset);
-#if 0
- if ((!cpar(bv)->isInset(cpos(bv))) ||
- (cpar(bv)->getInset(cpos(bv)) != inset))
- lt->cursorLeft(bv);
-#endif
bv->fitCursor();
- updateLocal(bv, CURSOR_PAR|CURSOR, true);
-// showInsetCursor(bv);
if (clear)
lt = 0;
+ updateLocal(bv, CURSOR_PAR|CURSOR, true);
return true;
}
if (selectall)
lt->clearSelection();
bv->fitCursor();
- if (selectall || lt->selection.set())
+ bool flag = (selectall || lt->selection.set());
+ if (clear)
+ lt = 0;
+ if (flag)
updateLocal(bv, FULL, true);
else
updateLocal(bv, CURSOR_PAR, true);
- if (clear)
- lt = 0;
}
int InsetText::cx(BufferView * bv) const
{
- bool clear = false;
- if (!lt) {
- lt = getLyXText(bv);
- clear = true;
- }
- int x = lt->cursor.x() + top_x + TEXT_TO_INSET_OFFSET;
+ // we do nothing dangerous so we use a local cache
+ LyXText * llt = getLyXText(bv);
+ int x = llt->cursor.x() + top_x + TEXT_TO_INSET_OFFSET;
if (the_locking_inset) {
- LyXFont font = lt->getFont(bv->buffer(),
- lt->cursor.par(),
- lt->cursor.pos());
+ LyXFont font = llt->getFont(bv->buffer(), llt->cursor.par(),
+ llt->cursor.pos());
if (font.isVisibleRightToLeft())
x -= the_locking_inset->width(bv, font);
}
- if (clear)
- lt = 0;
return x;
}
}
do_resize = 0;
// lyxerr << "InsetText::resizeLyXText\n";
- if (!par->next() && !par->size()) // no data, resize not neccessary!
+ if (!par->next() && !par->size()) { // no data, resize not neccessary!
+ // we have to do this as a fixed width may have changed!
+ LyXText * t = getLyXText(bv);
+ saveLyXTextState(t);
+ t->init(bv, true);
+ restoreLyXTextState(bv, t);
return;
+ }
// one endless line, resize normally not necessary
if (!force && getMaxWidth(bv, this) < 0)
return;
return owner()->checkInsertChar(font);
return true;
}
+
+
+void InsetText::collapseParagraphs(BufferParams const & bparams) const
+{
+ while(par->next()) {
+ if (!par->isSeparator(par->size()-1))
+ par->insertChar(par->size()-1, ' ');
+ par->pasteParagraph(bparams);
+ }
+ reinitLyXText();
+}