}
BufferView * bv = &cur.bv();
- TextMetrics * tm = &bv->textMetrics(this);
- if (!tm->contains(cur.pit())) {
+ TextMetrics & tm = bv->textMetrics(this);
+ if (!tm.contains(cur.pit())) {
lyx::dispatch(FuncRequest(LFUN_SCREEN_SHOW_CURSOR));
- tm = &bv->textMetrics(this);
+ tm = bv->textMetrics(this);
}
// FIXME: We use the update flag to indicates wether a singlePar or a
if (cur.selection())
cutSelection(cur, false);
else
- tm->deleteLineForward(cur);
+ tm.deleteLineForward(cur);
finishChange(cur, false);
break;
case LFUN_LINE_BEGIN:
case LFUN_LINE_BEGIN_SELECT:
needsUpdate |= cur.selHandle(cmd.action() == LFUN_LINE_BEGIN_SELECT);
- needsUpdate |= tm->cursorHome(cur);
+ needsUpdate |= tm.cursorHome(cur);
break;
case LFUN_LINE_END:
case LFUN_LINE_END_SELECT:
needsUpdate |= cur.selHandle(cmd.action() == LFUN_LINE_END_SELECT);
- needsUpdate |= tm->cursorEnd(cur);
+ needsUpdate |= tm.cursorEnd(cur);
break;
case LFUN_SECTION_SELECT: {
pit_type prev = pit > 0 ? depthHook(pit, par.getDepth()) : pit;
if (prev < pit && cur.pos() == par.beginOfBody()
&& !par.size() && !par.isEnvSeparator(cur.pos())
+ && !par.layout().keepempty
&& !par.layout().isCommand()
&& pars_[prev].layout() != par.layout()
&& pars_[prev].layout().isEnvironment()
case LFUN_SERVER_GET_XY:
cur.message(from_utf8(
- convert<string>(tm->cursorX(cur.top(), cur.boundary()))
- + ' ' + convert<string>(tm->cursorY(cur.top(), cur.boundary()))));
+ convert<string>(tm.cursorX(cur.top(), cur.boundary()))
+ + ' ' + convert<string>(tm.cursorY(cur.top(), cur.boundary()))));
break;
case LFUN_SERVER_SET_XY: {
lyxerr << "SETXY: Could not parse coordinates in '"
<< to_utf8(cmd.argument()) << endl;
else
- tm->setCursorFromCoordinates(cur, x, y);
+ tm.setCursorFromCoordinates(cur, x, y);
break;
}
case LFUN_MOUSE_TRIPLE:
if (cmd.button() == mouse_button::button1) {
- tm->cursorHome(cur);
+ tm.cursorHome(cur);
cur.resetAnchor();
- tm->cursorEnd(cur);
+ tm.cursorEnd(cur);
cur.setSelection();
bv->cursor() = cur;
}
int const wh = bv->workHeight();
int const y = max(0, min(wh - 1, cmd.y()));
- tm->setCursorFromCoordinates(cur, cmd.x(), y);
+ tm.setCursorFromCoordinates(cur, cmd.x(), y);
cur.setTargetX(cmd.x());
// Don't allow selecting a separator inset
if (cur.pos() && cur.paragraph().isEnvSeparator(cur.pos() - 1))
break;
}
} else {
- cur.message(_("Invalid argument (must be a positive number)!"));
+ cur.message(_("Invalid argument (must be a non-negative number)!"));
break;
}
}
// Set the freefont using the contents of \param data dispatched from
// the frontends and apply it at the current cursor location.
case LFUN_TEXTSTYLE_UPDATE: {
- Font font;
+ Font font(ignore_font, ignore_language);
bool toggle;
if (font.fromString(to_utf8(cmd.argument()), toggle)) {
docstring const props = font.stateText(&bv->buffer().params(), true);
for (DocIterator it = cur.selectionBegin(); ; it.forwardPar()) {
pos_type const beg = it.pos();
pos_type end;
- bool const in_last_par = (it.pit() == cur.selectionEnd().pit());
+ bool const in_last_par = (it.pit() == cur.selectionEnd().pit() &&
+ it.idx() == cur.selectionEnd().idx());
if (in_last_par)
end = cur.selectionEnd().pos();
else
case LFUN_ACCENT_UMLAUT:
case LFUN_ACCENT_UNDERBAR:
case LFUN_ACCENT_UNDERDOT:
- case LFUN_FONT_DEFAULT:
case LFUN_FONT_FRAK:
case LFUN_FONT_SIZE:
case LFUN_FONT_STATE:
enable = !cur.paragraph().isPassThru();
break;
+ case LFUN_FONT_DEFAULT: {
+ Font font(inherit_font, ignore_language);
+ BufferParams const & bp = cur.buffer()->masterParams();
+ if (cur.selection()) {
+ enable = false;
+ // Check if we have a non-default font attribute
+ // in the selection range.
+ DocIterator const from = cur.selectionBegin();
+ DocIterator const to = cur.selectionEnd();
+ for (DocIterator dit = from ; dit != to && !dit.atEnd(); ) {
+ if (!dit.inTexted()) {
+ dit.forwardPos();
+ continue;
+ }
+ Paragraph const & par = dit.paragraph();
+ pos_type const pos = dit.pos();
+ Font tmp = par.getFontSettings(bp, pos);
+ if (tmp.fontInfo() != font.fontInfo()
+ || tmp.language() != bp.language) {
+ enable = true;
+ break;
+ }
+ dit.forwardPos();
+ }
+ break;
+ }
+ // Disable if all is default already.
+ enable = (cur.current_font.fontInfo() != font.fontInfo()
+ || cur.current_font.language() != bp.language);
+ break;
+ }
+
case LFUN_TEXTSTYLE_APPLY:
enable = !freeFonts.empty();
break;