namespace lyx {
-Text::Text()
- : autoBreakRows_(false)
-{}
-
-
-bool Text::isMainText(Buffer const & buffer) const
+bool Text::isMainText() const
{
- return &buffer.text() == this;
+ return &owner_->buffer().text() == this;
}
// Note that this is supposed to return a fully realized font.
-FontInfo Text::layoutFont(Buffer const & buffer, pit_type const pit) const
+FontInfo Text::layoutFont(pit_type const pit) const
{
Layout const & layout = pars_[pit].layout();
FontInfo lf = layout.resfont;
// In case the default family has been customized
if (layout.font.family() == INHERIT_FAMILY)
- lf.setFamily(buffer.params().getFont().fontInfo().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
FontInfo font = layout.font;
// Realize with the fonts of lesser depth.
//font.realize(outerFont(pit, paragraphs()));
- font.realize(buffer.params().getFont().fontInfo());
+ font.realize(owner_->buffer().params().getFont().fontInfo());
return font;
}
// Note that this is supposed to return a fully realized font.
-FontInfo Text::labelFont(Buffer const & buffer, Paragraph const & par) const
+FontInfo Text::labelFont(Paragraph const & par) const
{
+ Buffer const & buffer = owner_->buffer();
Layout const & layout = par.layout();
if (!par.getDepth()) {
}
-void Text::setCharFont(Buffer const & buffer, pit_type pit,
+void Text::setCharFont(pit_type pit,
pos_type pos, Font const & fnt, Font const & display_font)
{
+ Buffer const & buffer = owner_->buffer();
Font font = fnt;
Layout const & layout = pars_[pit].layout();
// Inside inset, apply the inset's font attributes if any
// (charstyle!)
- if (!isMainText(buffer))
+ if (!isMainText())
layoutfont.realize(display_font.fontInfo());
layoutfont.realize(buffer.params().getFont().fontInfo());
}
-void Text::setLayout(Buffer const & buffer, pit_type start, pit_type end,
+void Text::setLayout(pit_type start, pit_type end,
docstring const & layout)
{
LASSERT(start != end, /**/);
+ Buffer const & buffer = owner_->buffer();
BufferParams const & bp = buffer.params();
Layout const & lyxlayout = bp.documentClass()[layout];
pit_type end = cur.selEnd().pit() + 1;
pit_type undopit = undoSpan(end - 1);
recUndo(cur, start, undopit - 1);
- setLayout(*cur.buffer(), start, end, layout);
+ setLayout(start, end, layout);
cur.buffer()->updateLabels();
}
FontInfo layoutfont;
pit_type pit = cur.pit();
if (cur.pos() < pars_[pit].beginOfBody())
- layoutfont = labelFont(*cur.buffer(), pars_[pit]);
+ layoutfont = labelFont(pars_[pit]);
else
- layoutfont = layoutFont(*cur.buffer(), pit);
+ layoutfont = layoutFont(pit);
// Update current font
cur.real_current_font.update(font,
TextMetrics const & tm = bv.textMetrics(this);
Font f = tm.displayFont(pit, pos);
f.update(font, language, toggleall);
- setCharFont(buffer, pit, pos, f, tm.font_);
+ setCharFont(pit, pos, f, tm.font_);
}
}
//FIXME UNICODE
string const argument = to_utf8(arg);
+ depth_type priordepth = -1;
+ Layout priorlayout;
for (pit_type pit = cur.selBegin().pit(), end = cur.selEnd().pit();
pit <= end; ++pit) {
Paragraph & par = pars_[pit];
ParagraphParameters params = par.params();
params.read(argument, merge);
- // changes to label width string apply to all
- // paragraph with same layout in a sequence
- setLabelWidthStringToSequence(pit, pars_,
- params.labelWidthString());
+ // Changes to label width string apply to all paragraphs
+ // with same layout in a sequence.
+ // 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());
par.params().apply(params, par.layout());
+ priordepth = par.getDepth();
+ priorlayout = par.layout();
}
}
pit_type undopit = undoSpan(cur.selEnd().pit());
recUndo(cur, cur.selBegin().pit(), undopit - 1);
+ depth_type priordepth = -1;
+ Layout priorlayout;
for (pit_type pit = cur.selBegin().pit(), end = cur.selEnd().pit();
pit <= end; ++pit) {
Paragraph & par = pars_[pit];
- // changes to label width string apply to all
- // paragraph with same layout in a sequence
- setLabelWidthStringToSequence(pit, pars_,
- par.params().labelWidthString());
+ // Changes to label width string apply to all paragraphs
+ // with same layout in a sequence.
+ // 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());
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)
+void Text::insertStringAsLines(DocIterator const & dit, docstring const & str,
+ Font const & font)
{
- cur.buffer()->insertStringAsLines(pars_, cur.pit(), cur.pos(),
- cur.current_font, str, autoBreakRows_);
+ BufferParams const & bparams = owner_->buffer().params();
+ pit_type pit = dit.pit();
+ pos_type pos = dit.pos();
+
+ // insert the string, don't insert doublespace
+ bool space_inserted = true;
+ for (docstring::const_iterator cit = str.begin();
+ cit != str.end(); ++cit) {
+ Paragraph & par = pars_[pit];
+ if (*cit == '\n') {
+ if (autoBreakRows_ && (!par.empty() || par.allowEmpty())) {
+ lyx::breakParagraph(bparams, pars_, pit, pos,
+ par.layout().isEnvironment());
+ ++pit;
+ pos = 0;
+ space_inserted = true;
+ } else {
+ continue;
+ }
+ // do not insert consecutive spaces if !free_spacing
+ } else if ((*cit == ' ' || *cit == '\t') &&
+ space_inserted && !par.isFreeSpacing()) {
+ continue;
+ } else if (*cit == '\t') {
+ if (!par.isFreeSpacing()) {
+ // tabs are like spaces here
+ par.insertChar(pos, ' ', font, bparams.trackChanges);
+ ++pos;
+ space_inserted = true;
+ } else {
+ par.insertChar(pos, *cit, font, bparams.trackChanges);
+ ++pos;
+ space_inserted = true;
+ }
+ } else if (!isPrintable(*cit)) {
+ // Ignore unprintables
+ continue;
+ } else {
+ // just insert the character
+ par.insertChar(pos, *cit, font, bparams.trackChanges);
+ ++pos;
+ space_inserted = (*cit == ' ');
+ }
+ }
}
// turn double CR to single CR, others are converted into one
// blank. Then insertStringAsLines is called
-void Text::insertStringAsParagraphs(Cursor & cur, docstring const & str)
+void Text::insertStringAsParagraphs(DocIterator const & dit, docstring const & str,
+ Font const & font)
{
docstring linestr = str;
bool newline_inserted = false;
newline_inserted = false;
}
}
- insertStringAsLines(cur, linestr);
+ insertStringAsLines(dit, linestr, font);
}