class RichTxt : DeepCopyOption { public: enum { BOLD = 0x00000001, ITALIC = 0x00000002, UNDERLINE = 0x00000004, FACE = 0x00000008, HEIGHT = 0x00000010, LANGUAGE = 0x00000020, INK = 0x00000040, PAPER = 0x00000080, LINK = 0x00000100, SSCRIPT = 0x00000200, CAPITALS = 0x00000400, STRIKEOUT = 0x00000800, LANG = 0x00001000, INDEXENTRY = 0x00002000, DASHED = 0x00004000, NOAA = 0x00008000, }; enum { ALIGN = 0x80000000, BEFORE = 0x40000000, LM = 0x20000000, INDENT = 0x10000000, RM = 0x08000000, AFTER = 0x04000000, TABSIZE = 0x02000000, BULLET = 0x01000000, NEWPAGE = 0x00800000, KEEP = 0x00400000, TABS = 0x00200000, STYLE = 0x00100000, LABEL = 0x00080000, KEEPNEXT = 0x00040000, ORPHAN = 0x00020000, NUMBERING = 0x00010000, SPACING = 0x00008000, RULER = 0x00004000, RULERINK = 0x00002000, }; struct FormatInfo : RichPara::Format { dword charvalid; dword paravalid; void Set(const RichPara::Format& fmt); void Set(const RichPara::CharFormat& fmt); void Combine(const RichPara::CharFormat& fmt); void Combine(const RichPara::Format& fmt); void Combine(const FormatInfo& fmt); void ApplyTo(RichPara::CharFormat& fmt) const; void ApplyTo(RichPara::Format& fmt) const; }; class Formating { Vector styleid; Vector format; friend class RichText; friend class RichTxt; }; protected: struct Para : DeepCopyOption { Uuid styleid; int length; String content; Array object; mutable int cx; mutable int cy; mutable int ruler; mutable int before; mutable Vector linecy; mutable int after; mutable bool newpage; mutable bool keep; mutable bool keepnext; mutable bool orphan; mutable int numbering; mutable Bits spellerrors; mutable bool checked; mutable bool haspos; One number; Para(const Para& src, int); Para() { length = 0; cx = -1; numbering = -1; checked = false; haspos = false; } }; struct Part : MoveableAndDeepCopyOption< Part, Any> { Part(const Part& src, int); Part(); }; Vector part; mutable int length; mutable int tabcount; mutable Rect rect; mutable Vector py; enum { NONE, SPARA, PARA, FROM, ALL }; int r_type; int r_parti; int r_paraocx; int r_paraocy; bool r_keep; bool r_keepnext; bool r_newpage; void Init(); void Invalidate(); void SetRefresh(int parai); void SetRefreshFrom(int parai); void RefreshAll() { SetRefreshFrom(0); } void ParaRemove(int parai, int pos, int count); void ParaInsert(int parai, int pos, const RichPara& p); RichPara ParaCopy(int parai, int pos, int count) const; void Put(int i, const RichPara& p, const RichStyle& s); void Put(int i, const RichPara& p, const RichStyles& s); void Sync0(const Para& pp, int parti, const RichContext& rc) const; inline void Sync(int parti, const RichContext& rc) const { int cx = rc.page.Width(); ASSERT(part[parti].Is()); const Para& pp = part[parti].Get(); if(pp.cx == cx) return; Sync0(pp, parti, rc); } bool BreaksPage(PageY py, const Para& pp, int i, const Rect& page) const; PageY GetNextPageY(int parti, const RichContext& rc) const; PageY GetPartPageY(int parti, RichContext rc) const; struct ParaOp { virtual bool operator()(RichTxt::Para& p) = 0; virtual ~ParaOp() {} }; bool Update(ParaOp& op); RichTxt& GetText0(int& pos, bool update); RichTxt& GetUpdateText(int& pos); const RichTxt& GetConstText(int& pos) const; RichTable& GetTable0(int table, bool update); RichTable& GetUpdateTable(int table); const RichTable& GetConstTable(int table) const; RichTxt& GetTableUpdateText(int table, const RichStyles& style, int& pi); void CombineFormat(FormatInfo& f, int pi, int pi2, bool& first, const RichStyles& style) const; static void ApplyStyle(const FormatInfo& fi, RichPara& pa, const RichStyles& style); static void Apply(const FormatInfo& fi, RichPara& pa, const RichStyles& style); void ApplyFormat(const FormatInfo& f, int pi, int pi2, const RichStyles& style); void SaveFormat(Formating& f, int p1, int p2, const RichStyles& style) const; void RestoreFormat(int pi, const Formating& info, int& ii, const RichStyles& style); void GetAllLanguages(Index& all) const; friend class RichTable; friend class RichText; friend class RichCell; int ComputeLength() const; void GetRichPos(int pos, RichPos& rp, int ti, int maxlevel, const RichStyles& st) const; RichPara::Format GetFirstFormat(const RichStyles& st) const; PageY GetTop(RichContext rc) const; PageY GetHeight(RichContext rc) const; int GetWidth(const RichStyles& st) const; void Paint(PageDraw& w, RichContext rc, const PaintInfo& pi) const; RichCaret GetCaret(int pos, RichContext rc) const; int GetPos(int x, PageY y, RichContext rc) const; int GetVertMove(int pos, int gx, RichContext rc, int dir) const; RichHotPos GetHotPos(int x, PageY y, int tolerance, RichContext rc) const; void GatherValPos(Vector& f, RichContext rc, int pos, int type) const; bool EvaluateFields(const RichStyles& s, VectorMap& vars); void ApplyZoom(Zoom z, const RichStyles& ostyle, const RichStyles& zstyle); public: enum ValPosType { LABELS, INDEXENTRIES }; int GetPartCount() const { return part.GetCount(); } bool IsPara(int i) const { return part[i].Is(); } bool IsTable(int i) const; int GetPartLength(int pi) const; int FindPart(int& pos) const; int GetPartPos(int pi) const; RichPara Get(int i, const RichStyles& s) const; RichPara Get(int i, const Uuid& styleid, const RichStyles& s) const; RichPara Get(int i, const RichStyle& style) const; Uuid GetParaStyle(int i) const { return part[i].Get().styleid; } void SetParaStyle(int i, const Uuid& si); const RichTable& GetTable(int i) const; int GetLength() const; int GetTableCount() const; bool IsEmpty() const; RichCellPos GetCellPos(int table, int row, int column) const; RichCellPos GetCellPos(int table, Point p) const; void Clear(); void ClearSpelling(); void SetPick(int parti, pick_ RichTable& table); void CatPick(pick_ RichTable& table) { SetPick(GetPartCount(), table); } void Set(int parai, const RichPara& p, const RichStyles& s); void Insert(int parai, const RichPara& p, const RichStyles& s); void Cat(const RichPara& p, const RichStyles& s) { Set(GetPartCount(), p, s); } void RemovePart(int parti); void Normalize(); Vector GetAllLanguages() const; WString GetPlainText() const; struct UpdateIterator { enum { CONTINUE = 0, STOP = 1, UPDATE = 2 }; virtual int operator()(int pos, RichPara& para) = 0; virtual ~UpdateIterator() {} }; bool Iterate(UpdateIterator& r, int gpos, const RichStyles& s); struct Iterator { virtual bool operator()(int pos, const RichPara& para) = 0; virtual ~Iterator() {} }; bool Iterate(Iterator& r, int gpos, const RichStyles& s) const; RichTxt(const RichTxt& src, int); RichTxt(); #ifdef _DEBUG void Dump(); #endif };