#include "Language.h"
#include "LaTeXFeatures.h"
#include "LayoutFile.h"
+#include "Length.h"
#include "Lexer.h"
#include "LyX.h"
#include "LyXAction.h"
case LFUN_KEYMAP_PRIMARY:
case LFUN_KEYMAP_SECONDARY:
case LFUN_KEYMAP_TOGGLE:
+ case LFUN_INSET_SELECT_ALL:
flag.setEnabled(true);
break;
case LFUN_BUFFER_PARAMS_APPLY: {
DocumentClassConstPtr olddc = buffer_.params().documentClassPtr();
- cur.recordUndoFullDocument();
+ cur.recordUndoBufferParams();
istringstream ss(to_utf8(cmd.argument()));
Lexer lex;
lex.setStream(ss);
}
case LFUN_LAYOUT_MODULES_CLEAR: {
- cur.recordUndoFullDocument();
+ // FIXME: this modifies the document in cap::switchBetweenClasses
+ // without calling recordUndo. Fix this before using
+ // recordUndoBufferParams().
+ cur.recordUndoFullBuffer();
buffer_.params().clearLayoutModules();
makeDocumentClass();
dr.screenUpdate(Update::Force);
"conflicts with installed modules.");
break;
}
- cur.recordUndoFullDocument();
+ // FIXME: this modifies the document in cap::switchBetweenClasses
+ // without calling recordUndo. Fix this before using
+ // recordUndoBufferParams().
+ cur.recordUndoFullBuffer();
buffer_.params().addLayoutModule(argument);
makeDocumentClass();
dr.screenUpdate(Update::Force);
break;
// Save the old, possibly modular, layout for use in conversion.
- cur.recordUndoFullDocument();
+ // FIXME: this modifies the document in cap::switchBetweenClasses
+ // without calling recordUndo. Fix this before using
+ // recordUndoBufferParams().
+ cur.recordUndoFullBuffer();
buffer_.params().setBaseClass(argument);
makeDocumentClass();
dr.screenUpdate(Update::Force);
}
+ case LFUN_INSET_SELECT_ALL:
+ if (cur.depth() > 1
+ && cur.selBegin().at_begin()
+ && cur.selEnd().at_end()) {
+ // All the contents of the inset if selected.
+ // Select the inset from outside.
+ cur.pop();
+ cur.resetAnchor();
+ cur.setSelection(true);
+ cur.posForward();
+ } else if (cur.selBegin().idx() != cur.selEnd().idx()
+ || (cur.depth() > 1
+ && cur.selBegin().at_cell_begin()
+ && cur.selEnd().at_cell_end())) {
+ // At least one complete cell is selected.
+ // Select all cells
+ cur.idx() = 0;
+ cur.pos() = 0;
+ cur.resetAnchor();
+ cur.setSelection(true);
+ cur.idx() = cur.lastidx();
+ cur.pos() = cur.lastpos();
+ } else {
+ // select current cell
+ cur.pit() = 0;
+ cur.pos() = 0;
+ cur.resetAnchor();
+ cur.setSelection(true);
+ cur.pit() = cur.lastpit();
+ cur.pos() = cur.lastpos();
+ }
+ dr.screenUpdate(Update::Force);
+ break;
+
+
// This would be in Buffer class if only Cursor did not
// require a bufferview
case LFUN_INSET_FORALL: {
if (!newL || oldL == newL)
break;
if (oldL->rightToLeft() == newL->rightToLeft()) {
- cur.recordUndoFullDocument();
+ cur.recordUndoFullBuffer();
buffer_.changeLanguage(oldL, newL);
cur.setCurrentFont();
dr.forceBufferUpdate();
// Set the row on which the cursor lives.
setCurrentRowSlice(rowSlice);
+ /** FIXME: the code below adds an extraneous computation of inset
+ * positions, and can therefore be bad for performance (think for
+ * example about a very large tabular inset. Redawing the row
+ * where it is means redrawing the whole screen).
+ *
+ * The bug that this fixes is the following: assume that there is
+ * a very large math inset. Upon entering the inset, when pressing
+ * `End', the row is not scrolled and the cursor is not visible. I
+ * am not sure why the extra row computation fixes the problem,
+ * actually.
+ *
+ * A proper fix should be found and this code should be removed.
+ */
// Force the recomputation of inset positions
bool const drawing = pi.pain.isDrawingEnabled();
pi.pain.setDrawingEnabled(false);
// No need to care about vertical position.
- RowPainter rp(pi, buffer().text(), d->cursor_.bottom().pit(), row, 0, 0);
+ RowPainter rp(pi, buffer().text(), d->cursor_.bottom().pit(), row,
+ -d->horiz_scroll_offset_, 0);
rp.paintText();
pi.pain.setDrawingEnabled(drawing);
+ /** END of bad code */
// Current x position of the cursor in pixels
int const cur_x = getPos(d->cursor_).x_;
// Horizontal scroll offset of the cursor row in pixels
int offset = d->horiz_scroll_offset_;
- int const MARGIN = 10;
+ int const MARGIN = Length(2, Length::EM).inPixels(workWidth());
if (cur_x < offset + MARGIN) {
// scroll right
offset = cur_x - MARGIN;
} else if (cur_x > offset + workWidth() - MARGIN) {
// scroll left
offset = cur_x - workWidth() + MARGIN;
- } else if(offset > 0
- && row.width() - offset < workWidth()){
- offset = row.width() - workWidth();
}
+ if (offset < row.left_margin || row.width() <= workWidth())
+ offset = 0;
+
if (offset != d->horiz_scroll_offset_)
- LYXERR0("Offset is now " << offset);
+ LYXERR(Debug::PAINTING, "Horiz. scroll offset changed from "
+ << d->horiz_scroll_offset_ << " to " << offset);
if (d->update_strategy_ == NoScreenUpdate
&& (offset != d->horiz_scroll_offset_
|| !d->last_row_slice_.empty())) {
// FIXME: if one uses SingleParUpdate, then home/end
// will not work on long rows. Why?
- d->update_strategy_ = FullScreenUpdate;//DecorationUpdate;
+ d->update_strategy_ = FullScreenUpdate;
}
d->horiz_scroll_offset_ = offset;
case NoScreenUpdate:
// If no screen painting is actually needed, only some the different
// coordinates of insets and paragraphs needs to be updated.
+ LYXERR(Debug::PAINTING, "Strategy: NoScreenUpdate");
pi.full_repaint = true;
pi.pain.setDrawingEnabled(false);
tm.draw(pi, 0, y);
case SingleParUpdate:
pi.full_repaint = false;
+ LYXERR(Debug::PAINTING, "Strategy: SingleParUpdate");
// In general, only the current row of the outermost paragraph
// will be redrawn. Particular cases where selection spans
// multiple paragraph are correctly detected in TextMetrics.
// because of the single backing pixmap.
case FullScreenUpdate:
+
+ LYXERR(Debug::PAINTING,
+ ((d->update_strategy_ == FullScreenUpdate)
+ ? "Strategy: FullScreenUpdate"
+ : "Strategy: DecorationUpdate"));
+
// The whole screen, including insets, will be refreshed.
pi.full_repaint = true;