Exemple #1
0
void RichTxt::FormatInfo::Combine(const RichPara::Format& fmt)
{
	if(align != fmt.align)
		paravalid &= ~ALIGN;
	if(before != fmt.before)
		paravalid &= ~BEFORE;
	if(lm != fmt.lm)
		paravalid &= ~LM;
	if(indent != fmt.indent)
		paravalid &= ~INDENT;
	if(rm != fmt.rm)
		paravalid &= ~RM;
	if(after != fmt.after)
		paravalid &= ~AFTER;
	if(tabsize != fmt.tabsize)
		paravalid &= ~TABSIZE;
	if(bullet != fmt.bullet)
		paravalid &= ~BULLET;
	if(newpage != fmt.newpage)
		paravalid &= ~NEWPAGE;
	if(keep != fmt.keep)
		paravalid &= ~KEEP;
	if(keepnext != fmt.keepnext)
		paravalid &= ~KEEPNEXT;
	if(orphan != fmt.orphan)
		paravalid &= ~ORPHAN;
	if(label != fmt.label)
		paravalid &= ~LABEL;
	if(NumberingDiffers(*this, fmt))
		paravalid &= ~NUMBERING;
	if(tab.GetCount() != fmt.tab.GetCount()) {
		paravalid &= ~TABS;
		tab.Clear();
	}
	else
		for(int i = 0; i < tab.GetCount(); i++)
			if(tab[i].pos != fmt.tab[i].pos || tab[i].align != fmt.tab[i].align ||
			   tab[i].fillchar != fmt.tab[i].fillchar) {
				paravalid &= ~TABS;
				tab.Clear();
				break;
			}
	if(styleid != fmt.styleid)
		paravalid &= ~STYLE;
	if(linespacing != fmt.linespacing)
		paravalid &= ~SPACING;
	if(ruler != fmt.ruler)
		paravalid &= ~RULER;
	if(rulerink != fmt.rulerink)
		paravalid &= ~RULERINK;
	if(rulerstyle != fmt.rulerstyle)
		paravalid &= ~RULERSTYLE;
}
Exemple #2
0
String RichPara::Pack(const RichPara::Format& style, Array<RichObject>& obj) const
{
	StringStream out;
	dword pattr = 0;
	if(format.align != style.align)             pattr |= 1;
	if(format.before != style.before)           pattr |= 2;
	if(format.lm != style.lm)                   pattr |= 4;
	if(format.indent != style.indent)           pattr |= 8;
	if(format.rm != style.rm)                   pattr |= 0x10;
	if(format.after != style.after)             pattr |= 0x20;
	if(format.bullet != style.bullet)           pattr |= 0x40;
	if(format.keep != style.keep)               pattr |= 0x80;
	if(format.newpage != style.newpage)         pattr |= 0x100;
	if(format.tabsize != style.tabsize)         pattr |= 0x200;
	if(!IsNull(format.label))                   pattr |= 0x400;
	if(format.keepnext != style.keepnext)       pattr |= 0x800;
	if(format.orphan != style.orphan)           pattr |= 0x1000;
	if(NumberingDiffers(format, style))         pattr |= 0x2000;
	if(format.linespacing != style.linespacing) pattr |= 0x4000;
	if(format.tab != style.tab)                 pattr |= 0x8000;
	if(format.ruler != style.ruler)             pattr |= 0x10000;
	if(format.rulerink != style.rulerink)       pattr |= 0x20000;
	out.Put32(pattr);
	if(pattr & 1)      out.Put16(format.align);
	if(pattr & 2)      out.Put16(format.before);
	if(pattr & 4)      out.Put16(format.lm);
	if(pattr & 8)      out.Put16(format.indent);
	if(pattr & 0x10)   out.Put16(format.rm);
	if(pattr & 0x20)   out.Put16(format.after);
	if(pattr & 0x40)   out.Put16(format.bullet);
	if(pattr & 0x80)   out.Put(format.keep);
	if(pattr & 0x100)  out.Put(format.newpage);
	if(pattr & 0x200)  out.Put16(format.tabsize);
	if(pattr & 0x400)  { String t = format.label; out % t; }
	if(pattr & 0x800)  out.Put(format.keepnext);
	if(pattr & 0x1000) out.Put(format.orphan);
	if(pattr & 0x2000) {
		String b = format.before_number, a = format.after_number;
		out % b % a;
		out.Put(format.reset_number);
		out.Put(format.number, 8);
	}
	if(pattr & 0x4000)
		out.Put(format.linespacing);
	if(pattr & 0x8000) {
		int c = 0;
		int i;
		for(i = 0; i < format.tab.GetCount(); i++) {
			if(!IsNull(format.tab[i].pos))
				c++;
		}
		out.Put16(c);
		for(i = 0; i < format.tab.GetCount(); i++) {
			const RichPara::Tab& w = format.tab[i];
			if(!IsNull(w.pos)) {
				out.Put32(w.pos);
				out.Put(w.align);
				out.Put(w.fillchar);
			}
		}
	}
	if(pattr & 0x10000)
		out.Put16(format.ruler);
	if(pattr & 0x20000) {
		Color c = format.rulerink;
		c.Serialize(out);
	}
	obj.Clear();
	CharFormat cf = style;
	if(part.GetCount())
		PackParts(out, style, part, cf, obj);
	else
		Charformat(out, style, format, cf);
	String r = out;
	r.Shrink();
	return r;
}