]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
Rename TextMetrics::dimension() to dim()
[lyx.git] / src / Text3.cpp
index b4bfd4442b8232159840148a735fb9c61b5cf361..b78c8d1bc384debbfb63f5283c6d134d7f2c9f70 100644 (file)
@@ -639,10 +639,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        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
@@ -735,7 +735,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                if (cur.selection())
                        cutSelection(cur, false);
                else
-                       tm->deleteLineForward(cur);
+                       tm.deleteLineForward(cur);
                finishChange(cur, false);
                break;
 
@@ -941,13 +941,13 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        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: {
@@ -1255,6 +1255,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                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()
@@ -1529,8 +1530,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
        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: {
@@ -1542,7 +1543,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        lyxerr << "SETXY: Could not parse coordinates in '"
                               << to_utf8(cmd.argument()) << endl;
                else
-                       tm->setCursorFromCoordinates(cur, x, y);
+                       tm.setCursorFromCoordinates(cur, x, y);
                break;
        }
 
@@ -1760,9 +1761,9 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
        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;
                }
@@ -1837,7 +1838,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                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))
@@ -2390,7 +2391,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        // 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);
@@ -3233,7 +3234,8 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                        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
@@ -3387,7 +3389,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        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:
@@ -3400,6 +3401,38 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                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;