]> git.lyx.org Git - lyx.git/blobdiff - src/Text2.cpp
#9130 Text in main work area isn't rendered with high resolution
[lyx.git] / src / Text2.cpp
index f4bcc12499e18360eabc57ede3e99fa862e36c64..9f247a55435ff951b38245dcb26b21e15843ee8e 100644 (file)
@@ -194,7 +194,7 @@ void Text::setLayout(pit_type start, pit_type end,
 // set layout over selection and make a total rebreak of those paragraphs
 void Text::setLayout(Cursor & cur, docstring const & layout)
 {
-       LBUFERR(this == cur.text(), _("Invalid cursor."));
+       LBUFERR(this == cur.text());
 
        pit_type start = cur.selBegin().pit();
        pit_type end = cur.selEnd().pit() + 1;
@@ -218,7 +218,7 @@ static bool changeDepthAllowed(Text::DEPTH_CHANGE type,
 
 bool Text::changeDepthAllowed(Cursor & cur, DEPTH_CHANGE type) const
 {
-       LBUFERR(this == cur.text(), _("Invalid cursor."));
+       LBUFERR(this == cur.text());
        // this happens when selecting several cells in tabular (bug 2630)
        if (cur.selBegin().idx() != cur.selEnd().idx())
                return false;
@@ -238,7 +238,7 @@ bool Text::changeDepthAllowed(Cursor & cur, DEPTH_CHANGE type) const
 
 void Text::changeDepth(Cursor & cur, DEPTH_CHANGE type)
 {
-       LBUFERR(this == cur.text(), _("Invalid cursor."));
+       LBUFERR(this == cur.text());
        pit_type const beg = cur.selBegin().pit();
        pit_type const end = cur.selEnd().pit() + 1;
        cur.recordUndoSelection();
@@ -318,7 +318,7 @@ void Text::setFont(Cursor & cur, Font const & font, bool toggleall)
                        newfi.setSeries(INHERIT_SERIES);
        
                FontShape newshp = newfi.shape();
-               if (newshp !=   INHERIT_SHAPE && newshp != IGNORE_SHAPE &&
+               if (newshp != INHERIT_SHAPE && newshp != IGNORE_SHAPE &&
                                newshp == oldfi.shape())
                        newfi.setShape(INHERIT_SHAPE);
 
@@ -383,21 +383,21 @@ void Text::setFont(BufferView const & bv, CursorSlice const & begin,
 
 bool Text::cursorTop(Cursor & cur)
 {
-       LBUFERR(this == cur.text(), _("Invalid cursor."));
+       LBUFERR(this == cur.text());
        return setCursor(cur, 0, 0);
 }
 
 
 bool Text::cursorBottom(Cursor & cur)
 {
-       LBUFERR(this == cur.text(), _("Invalid cursor."));
+       LBUFERR(this == cur.text());
        return setCursor(cur, cur.lastpit(), boost::prior(paragraphs().end())->size());
 }
 
 
 void Text::toggleFree(Cursor & cur, Font const & font, bool toggleall)
 {
-       LBUFERR(this == cur.text(), _("Invalid cursor."));
+       LBUFERR(this == cur.text());
        // If the mask is completely neutral, tell user
        if (font.fontInfo() == ignore_font && font.language() == ignore_language) {
                // Could only happen with user style
@@ -429,7 +429,7 @@ void Text::toggleFree(Cursor & cur, Font const & font, bool toggleall)
 
 docstring Text::getStringToIndex(Cursor const & cur)
 {
-       LBUFERR(this == cur.text(), _("Invalid cursor."));
+       LBUFERR(this == cur.text());
 
        if (cur.selection())
                return cur.selectionAsString(false);
@@ -480,9 +480,9 @@ void Text::setLabelWidthStringToSequence(Cursor const & cur,
 }
 
 
-void Text::setParagraphs(Cursor & cur, docstring arg, bool merge) 
+void Text::setParagraphs(Cursor & cur, docstring arg, bool merge)
 {
-       LBUFERR(cur.text(), _("Uninitalized cursor."));
+       LBUFERR(cur.text());
 
        //FIXME UNICODE
        string const argument = to_utf8(arg);
@@ -508,9 +508,9 @@ void Text::setParagraphs(Cursor & cur, docstring arg, bool merge)
 }
 
 
-void Text::setParagraphs(Cursor & cur, ParagraphParameters const & p) 
+void Text::setParagraphs(Cursor & cur, ParagraphParameters const & p)
 {
-       LBUFERR(cur.text(), _("Uninitalized cursor."));
+       LBUFERR(cur.text());
 
        depth_type priordepth = -1;
        Layout priorlayout;
@@ -536,10 +536,10 @@ void Text::setParagraphs(Cursor & cur, ParagraphParameters const & p)
 // this really should just insert the inset and not move the cursor.
 void Text::insertInset(Cursor & cur, Inset * inset)
 {
-       LBUFERR(this == cur.text(), _("Invalid cursor."));
-       LBUFERR(inset, _("Uninitialized Text."));
+       LBUFERR(this == cur.text());
+       LBUFERR(inset);
        cur.paragraph().insertInset(cur.pos(), inset, cur.current_font,
-               Change(cur.buffer()->params().trackChanges
+               Change(cur.buffer()->params().track_changes
                ? Change::INSERTED : Change::UNCHANGED));
 }
 
@@ -551,9 +551,6 @@ bool Text::setCursor(Cursor & cur, pit_type par, pos_type pos,
        bool const update_needed = !tm.contains(par);
        Cursor old = cur;
        setCursorIntern(cur, par, pos, setfont, boundary);
-       // FIXME There is a chance that we'll miss a screen update here.
-       // If so, then do DEPM and then check if cur wants an update and
-       // go ahead and do it, if so.
        return cur.bv().checkDepm(cur, old) || update_needed;
 }
 
@@ -585,7 +582,7 @@ void Text::setCursor(CursorSlice & cur, pit_type par, pos_type pos)
 void Text::setCursorIntern(Cursor & cur,
                              pit_type par, pos_type pos, bool setfont, bool boundary)
 {
-       LBUFERR(this == cur.text(), _("Invalid cursor."));
+       LBUFERR(this == cur.text());
        cur.boundary(boundary);
        setCursor(cur.top(), par, pos);
        if (setfont)
@@ -595,8 +592,6 @@ void Text::setCursorIntern(Cursor & cur,
 
 bool Text::checkAndActivateInset(Cursor & cur, bool front)
 {
-       if (cur.selection())
-               return false;
        if (front && cur.pos() == cur.lastpos())
                return false;
        if (!front && cur.pos() == 0)
@@ -604,6 +599,8 @@ bool Text::checkAndActivateInset(Cursor & cur, bool front)
        Inset * inset = front ? cur.nextInset() : cur.prevInset();
        if (!inset || !inset->editable())
                return false;
+       if (cur.selection() && cur.realAnchor().find(inset) == -1)
+               return false;
        /*
         * Apparently, when entering an inset we are expected to be positioned
         * *before* it in the containing paragraph, regardless of the direction
@@ -620,8 +617,6 @@ bool Text::checkAndActivateInset(Cursor & cur, bool front)
 
 bool Text::checkAndActivateInsetVisual(Cursor & cur, bool movingForward, bool movingLeft)
 {
-       if (cur.selection())
-               return false;
        if (cur.pos() == -1)
                return false;
        if (cur.pos() == cur.lastpos())
@@ -630,6 +625,8 @@ bool Text::checkAndActivateInsetVisual(Cursor & cur, bool movingForward, bool mo
        Inset * inset = par.isInset(cur.pos()) ? par.getInset(cur.pos()) : 0;
        if (!inset || !inset->editable())
                return false;
+       if (cur.selection() && cur.realAnchor().find(inset) == -1)
+               return false;
        inset->edit(cur, movingForward, 
                movingLeft ? Inset::ENTRY_DIRECTION_RIGHT : Inset::ENTRY_DIRECTION_LEFT);
        return true;
@@ -659,6 +656,7 @@ bool Text::cursorBackward(Cursor & cur)
                                cur.textRow().pos() == cur.pos() &&
                                !cur.paragraph().isLineSeparator(cur.pos() - 1) &&
                                !cur.paragraph().isNewline(cur.pos() - 1) &&
+                               !cur.paragraph().isEnvSeparator(cur.pos() - 1) &&
                                !cur.paragraph().isSeparator(cur.pos() - 1)) {
                        return setCursor(cur, cur.pit(), cur.pos(), true, true);
                }
@@ -672,8 +670,14 @@ bool Text::cursorBackward(Cursor & cur)
        }
 
        // move to the previous paragraph or do nothing
-       if (cur.pit() > 0)
-               return setCursor(cur, cur.pit() - 1, getPar(cur.pit() - 1).size(), true, false);
+       if (cur.pit() > 0) {
+               Paragraph & par = getPar(cur.pit() - 1);
+               pos_type lastpos = par.size();
+               if (lastpos > 0 && par.isEnvSeparator(lastpos - 1))
+                       return setCursor(cur, cur.pit() - 1, lastpos - 1, true, false);
+               else
+                       return setCursor(cur, cur.pit() - 1, lastpos, true, false);
+       }
        return false;
 }
 
@@ -737,12 +741,19 @@ bool Text::cursorForward(Cursor & cur)
                        bool sep2 = cur.paragraph().isSeparator(cur.pos()+1);
                }
 #endif
-               if (cur.textRow().endpos() == cur.pos() + 1 &&
-                   cur.textRow().endpos() != cur.lastpos() &&
-                               !cur.paragraph().isNewline(cur.pos()) &&
-                               !cur.paragraph().isLineSeparator(cur.pos()) &&
-                               !cur.paragraph().isSeparator(cur.pos())) {
-                       return setCursor(cur, cur.pit(), cur.pos() + 1, true, true);
+               if (cur.textRow().endpos() == cur.pos() + 1) {
+                       if (cur.paragraph().isEnvSeparator(cur.pos()) &&
+                           cur.pos() + 1 == cur.lastpos() &&
+                           cur.pit() != cur.lastpit()) {
+                               // move to next paragraph
+                               return setCursor(cur, cur.pit() + 1, 0, true, false);
+                       } else if (cur.textRow().endpos() != cur.lastpos() &&
+                                  !cur.paragraph().isNewline(cur.pos()) &&
+                                  !cur.paragraph().isEnvSeparator(cur.pos()) &&
+                                  !cur.paragraph().isLineSeparator(cur.pos()) &&
+                                  !cur.paragraph().isSeparator(cur.pos())) {
+                               return setCursor(cur, cur.pit(), cur.pos() + 1, true, true);
+                       }
                }
                
                // in front of RTL boundary? Stay on this side of the boundary because:
@@ -776,7 +787,13 @@ bool Text::cursorDownParagraph(Cursor & cur)
 {
        bool updated = false;
        if (cur.pit() != cur.lastpit())
-               updated = setCursor(cur, cur.pit() + 1, 0);
+               if (lyxrc.mac_like_cursor_movement)
+                       if (cur.pos() == cur.lastpos())
+                               updated = setCursor(cur, cur.pit() + 1, getPar(cur.pit() + 1).size());
+                       else
+                               updated = setCursor(cur, cur.pit(), cur.lastpos());
+               else
+                       updated = setCursor(cur, cur.pit() + 1, 0);
        else
                updated = setCursor(cur, cur.pit(), cur.lastpos());
        return updated;
@@ -852,7 +869,7 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur,
                    && oldpar.isLineSeparator(old.pos() - 1)
                    && !oldpar.isDeleted(old.pos() - 1)
                    && !oldpar.isDeleted(old.pos())) {
-                       oldpar.eraseChar(old.pos() - 1, cur.buffer()->params().trackChanges);
+                       oldpar.eraseChar(old.pos() - 1, cur.buffer()->params().track_changes);
 // FIXME: This will not work anymore when we have multiple views of the same buffer
 // In this case, we will have to correct also the cursors held by
 // other bufferviews. It will probably be easier to do that in a more
@@ -907,7 +924,7 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur,
                return true;
        }
 
-       if (oldpar.stripLeadingSpaces(cur.buffer()->params().trackChanges)) {
+       if (oldpar.stripLeadingSpaces(cur.buffer()->params().track_changes)) {
                need_anchor_change = true;
                // We return true here because the Paragraph contents changed and
                // we need a redraw before further action is processed.