]> git.lyx.org Git - lyx.git/blobdiff - src/Text2.cpp
Add quote style information to languages
[lyx.git] / src / Text2.cpp
index b7b9f640880ec7a8d3dfd63f8cdb8ba2a534356f..7ff4a8a22fe9be0cc57f6c4c541fc0edc2c7a119 100644 (file)
@@ -76,16 +76,7 @@ FontInfo Text::layoutFont(pit_type const pit) const
                // In case the default family has been customized
                if (layout.font.family() == INHERIT_FAMILY)
                        lf.setFamily(owner_->buffer().params().getFont().fontInfo().family());
-               // FIXME
-               // It ought to be possible here just to use Inset::getLayout() and skip
-               // the asInsetCollapsable() bit. Unfortunatley, that doesn't work right
-               // now, because Inset::getLayout() will return a default-constructed
-               // InsetLayout, and that e.g. sets the foreground color to red. So we
-               // need to do some work to make that possible.
-               InsetCollapsable const * icp = owner_->asInsetCollapsable();
-               if (!icp)
-                       return lf;
-               FontInfo icf = icp->getLayout().font();
+               FontInfo icf = owner_->getLayout().font();
                icf.realize(lf);
                return icf;
        }
@@ -163,7 +154,7 @@ void Text::setCharFont(pit_type pit,
 
 
 void Text::setInsetFont(BufferView const & bv, pit_type pit,
-               pos_type pos, Font const & font, bool toggleall)
+               pos_type pos, Font const & font)
 {
        Inset * const inset = pars_[pit].getInset(pos);
        LASSERT(inset && inset->resetFontEdit(), /**/);
@@ -176,7 +167,7 @@ void Text::setInsetFont(BufferView const & bv, pit_type pit,
                        CursorSlice cellend = cs;
                        cellend.pit() = cellend.lastpit();
                        cellend.pos() = cellend.lastpos();
-                       text->setFont(bv, cs, cellend, font, toggleall);
+                       text->setFont(bv, cs, cellend, font);
                }
        }
 }
@@ -321,15 +312,67 @@ void Text::setFont(Cursor & cur, Font const & font, bool toggleall)
 
        // Ok, we have a selection.
        cur.recordUndoSelection();
+       Font newfont = font;
+
+       if (toggleall) {        
+               // Toggling behaves as follows: We check the first character of the
+               // selection. If it's (say) got EMPH on, then we set to off; if off,
+               // then to on. With families and the like, we set it to INHERIT, if
+               // we already have it.
+               CursorSlice const & sl = cur.selBegin();
+               Text const & text = *sl.text();
+               Paragraph const & par = text.getPar(sl.pit());
+       
+               // get font at the position
+               Font oldfont = par.getFont(cur.bv().buffer().params(), sl.pos(),
+                       text.outerFont(sl.pit()));
+               FontInfo const & oldfi = oldfont.fontInfo();
+       
+               FontInfo & newfi = newfont.fontInfo();
+       
+               FontFamily newfam = newfi.family();
+               if (newfam !=   INHERIT_FAMILY && newfam != IGNORE_FAMILY &&
+                               newfam == oldfi.family())
+                       newfi.setFamily(INHERIT_FAMILY);
+               
+               FontSeries newser = newfi.series();
+               if (newser == BOLD_SERIES && oldfi.series() == BOLD_SERIES)
+                       newfi.setSeries(INHERIT_SERIES);
+       
+               FontShape newshp = newfi.shape();
+               if (newshp !=   INHERIT_SHAPE && newshp != IGNORE_SHAPE &&
+                               newshp == oldfi.shape())
+                       newfi.setShape(INHERIT_SHAPE);
+
+               ColorCode newcol = newfi.color();
+               if (newcol != Color_none && newcol != Color_inherit 
+                   && newcol != Color_ignore && newcol == oldfi.color())
+                       newfi.setColor(Color_none);
+
+               // ON/OFF ones
+               if (newfi.emph() == FONT_TOGGLE)
+                       newfi.setEmph(oldfi.emph() == FONT_OFF ? FONT_ON : FONT_OFF);
+               if (newfi.underbar() == FONT_TOGGLE)
+                       newfi.setUnderbar(oldfi.underbar() == FONT_OFF ? FONT_ON : FONT_OFF);
+               if (newfi.strikeout() == FONT_TOGGLE)
+                       newfi.setStrikeout(oldfi.strikeout() == FONT_OFF ? FONT_ON : FONT_OFF);
+               if (newfi.uuline() == FONT_TOGGLE)
+                       newfi.setUuline(oldfi.uuline() == FONT_OFF ? FONT_ON : FONT_OFF);
+               if (newfi.uwave() == FONT_TOGGLE)
+                       newfi.setUwave(oldfi.uwave() == FONT_OFF ? FONT_ON : FONT_OFF);
+               if (newfi.noun() == FONT_TOGGLE)
+                       newfi.setNoun(oldfi.noun() == FONT_OFF ? FONT_ON : FONT_OFF);
+               if (newfi.number() == FONT_TOGGLE)
+                       newfi.setNumber(oldfi.number() == FONT_OFF ? FONT_ON : FONT_OFF);
+       }
 
        setFont(cur.bv(), cur.selectionBegin().top(), 
-               cur.selectionEnd().top(), font, toggleall);
+               cur.selectionEnd().top(), newfont);
 }
 
 
 void Text::setFont(BufferView const & bv, CursorSlice const & begin,
-               CursorSlice const & end, Font const & font,
-               bool toggleall)
+               CursorSlice const & end, Font const & font)
 {
        Buffer const & buffer = bv.buffer();
 
@@ -347,11 +390,11 @@ void Text::setFont(BufferView const & bv, CursorSlice const & begin,
                if (inset && inset->resetFontEdit()) {
                        // We need to propagate the font change to all
                        // text cells of the inset (bugs 1973, 6919).
-                       setInsetFont(bv, pit, pos, font, toggleall);
+                       setInsetFont(bv, pit, pos, font);
                }
                TextMetrics const & tm = bv.textMetrics(this);
                Font f = tm.displayFont(pit, pos);
-               f.update(font, language, toggleall);
+               f.update(font, language);
                setCharFont(pit, pos, f, tm.font_);
                // font change may change language... 
                // spell checker has to know that
@@ -445,8 +488,11 @@ void Text::setLabelWidthStringToSequence(pit_type const par_offset,
        depth_type const depth = pars_[offset].getDepth();
        Layout const & layout = pars_[offset].layout();
        for (pit_type pit = offset; pit != end; ++pit) {
-               while (pars_[pit].getDepth() > depth)
+               while (pars_[pit].getDepth() > depth) {
                        ++pit;
+                       if (pit == end)
+                               return;
+               }
                if (pars_[pit].getDepth() < depth)
                        return;
                if (pars_[pit].layout() != layout)
@@ -532,6 +578,9 @@ 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;
 }