#include "CutAndPaste.h"
#include "DispatchResult.h"
#include "ErrorList.h"
-#include "FuncRequest.h"
#include "Language.h"
#include "Layout.h"
#include "Lexer.h"
-#include "LyXFunc.h"
+#include "LyX.h"
#include "LyXRC.h"
#include "Paragraph.h"
-#include "paragraph_funcs.h"
#include "ParagraphParameters.h"
#include "TextClass.h"
#include "TextMetrics.h"
-#include "VSpace.h"
#include "insets/InsetCollapsable.h"
// 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 = pars_[pit].inInset().asInsetCollapsable();
+ InsetCollapsable const * icp = owner_->asInsetCollapsable();
if (!icp)
return lf;
FontInfo icf = icp->getLayout().font();
FontInfo font = layout.font;
// Realize with the fonts of lesser depth.
- //font.realize(outerFont(pit, paragraphs()));
+ //font.realize(outerFont(pit));
font.realize(owner_->buffer().params().getFont().fontInfo());
return font;
while (!layoutfont.resolved() &&
tp != pit_type(paragraphs().size()) &&
pars_[tp].getDepth()) {
- tp = outerHook(tp, paragraphs());
+ tp = outerHook(tp);
if (tp != pit_type(paragraphs().size()))
layoutfont.realize(pars_[tp].layout().font);
}
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->noFontChange(), /**/);
+ LASSERT(inset && inset->resetFontEdit(), /**/);
CursorSlice::idx_type endidx = inset->nargs();
for (CursorSlice cs(*inset); cs.idx() != endidx; ++cs.idx()) {
CursorSlice cellend = cs;
cellend.pit() = cellend.lastpit();
cellend.pos() = cellend.lastpos();
- text->setFont(bv, cs, cellend, font, toggleall);
+ text->setFont(bv, cs, cellend, font);
}
}
}
pit_type undopit = undoSpan(end - 1);
recUndo(cur, start, undopit - 1);
setLayout(start, end, layout);
- cur.buffer()->updateLabels();
+ cur.forceBufferUpdate();
}
}
// this handles the counter labels, and also fixes up
// depth values for follow-on (child) paragraphs
- cur.buffer()->updateLabels();
+ cur.forceBufferUpdate();
}
// 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();
pit_type const pit = dit.pit();
pos_type const pos = dit.pos();
Inset * inset = pars_[pit].getInset(pos);
- if (inset && inset->noFontChange()) {
+ if (inset && inset->resetFontEdit()) {
// We need to propagate the font change to all
- // text cells of the inset (bug 1973).
- // FIXME: This should change, see documentation
- // of noFontChange in Inset.h
- setInsetFont(bv, pit, pos, font, toggleall);
+ // text cells of the inset (bugs 1973, 6919).
+ 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
+ pars_[pit].requestSpellCheck(pos);
}
}
}
+void Text::setLabelWidthStringToSequence(pit_type const par_offset,
+ docstring const & s)
+{
+ pit_type offset = par_offset;
+ // Find first of same layout in sequence
+ while (!isFirstInSequence(offset)) {
+ offset = depthHook(offset, pars_[offset].getDepth());
+ }
+
+ // now apply label width string to every par
+ // in sequence
+ pit_type const end = pars_.size();
+ 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) {
+ ++pit;
+ if (pit == end)
+ return;
+ }
+ if (pars_[pit].getDepth() < depth)
+ return;
+ if (pars_[pit].layout() != layout)
+ return;
+ pars_[pit].setLabelWidthString(s);
+ }
+}
+
+
void Text::setParagraphs(Cursor & cur, docstring arg, bool merge)
{
LASSERT(cur.text(), /**/);
// Do this only once for a selected range of paragraphs
// of the same layout and depth.
if (par.getDepth() != priordepth || par.layout() != priorlayout)
- setLabelWidthStringToSequence(pit, pars_,
- params.labelWidthString());
+ setLabelWidthStringToSequence(pit, params.labelWidthString());
par.params().apply(params, par.layout());
priordepth = par.getDepth();
priorlayout = par.layout();
// Do this only once for a selected range of paragraphs
// of the same layout and depth.
if (par.getDepth() != priordepth || par.layout() != priorlayout)
- setLabelWidthStringToSequence(pit, pars_,
- par.params().labelWidthString());
+ setLabelWidthStringToSequence(pit,
+ par.params().labelWidthString());
par.params().apply(p, par.layout());
priordepth = par.getDepth();
priorlayout = par.layout();
}
-// needed to insert the selection
-void Text::insertStringAsLines(Cursor & cur, docstring const & str)
-{
- cur.buffer()->insertStringAsLines(pars_, cur.pit(), cur.pos(),
- cur.current_font, str, autoBreakRows_);
-}
-
-
-// turn double CR to single CR, others are converted into one
-// blank. Then insertStringAsLines is called
-void Text::insertStringAsParagraphs(Cursor & cur, docstring const & str)
-{
- docstring linestr = str;
- bool newline_inserted = false;
-
- for (string::size_type i = 0, siz = linestr.size(); i < siz; ++i) {
- if (linestr[i] == '\n') {
- if (newline_inserted) {
- // we know that \r will be ignored by
- // insertStringAsLines. Of course, it is a dirty
- // trick, but it works...
- linestr[i - 1] = '\r';
- linestr[i] = '\n';
- } else {
- linestr[i] = ' ';
- newline_inserted = true;
- }
- } else if (isPrintable(linestr[i])) {
- newline_inserted = false;
- }
- }
- insertStringAsLines(cur, linestr);
-}
-
-
bool Text::setCursor(Cursor & cur, pit_type par, pos_type pos,
bool setfont, bool boundary)
{
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;
}
// None of these should happen, but we're scaredy-cats
if (pos < 0) {
- lyxerr << "dont like -1" << endl;
+ lyxerr << "don't like -1" << endl;
LASSERT(false, /**/);
}
if (pos > para.size()) {
- lyxerr << "dont like 1, pos: " << pos
+ lyxerr << "don't like 1, pos: " << pos
<< " size: " << para.size()
<< " par: " << par << endl;
LASSERT(false, /**/);
bool Text::cursorBackward(Cursor & cur)
{
// Tell BufferView to test for FitCursor in any case!
- cur.updateFlags(Update::FitCursor);
+ cur.screenUpdateFlags(Update::FitCursor);
// not at paragraph start?
if (cur.pos() > 0) {
bool Text::cursorForward(Cursor & cur)
{
// Tell BufferView to test for FitCursor in any case!
- cur.updateFlags(Update::FitCursor);
+ cur.screenUpdateFlags(Update::FitCursor);
// not at paragraph end?
if (cur.pos() != cur.lastpos()) {
}
}
- // don't delete anything if this is the only remaining paragraph within the given range
- // note: Text::acceptOrRejectChanges() sets the cursor to 'first' after calling DEPM
+ // don't delete anything if this is the only remaining paragraph
+ // within the given range. Note: Text::acceptOrRejectChanges()
+ // sets the cursor to 'first' after calling DEPM
if (first == last)
continue;