#ifndef RICHEDIT_H #define RICHEDIT_H #include namespace Upp { #define IMAGECLASS RichEditImg #define IMAGEFILE #include class RichRuler : public FrameCtrl { public: virtual void FrameLayout(Rect& r); virtual void FrameAddSize(Size& sz); virtual void Paint(Draw& w); virtual void LeftDown(Point p, dword); virtual void RightDown(Point p, dword); virtual void LeftDouble(Point p, dword); virtual void MouseMove(Point p, dword); virtual void LeftUp(Point, dword); public: struct Marker { int pos, minpos, maxpos; Image image; bool top; bool deletable; bool operator!=(const Marker& m) { return pos != m.pos || minpos != m.minpos || maxpos != m.maxpos || !image.IsSame(m.image) || top != m.top || deletable != m.deletable; } Marker() { top = false; deletable = false; } }; private: int x0, pgcx, numbers, marks; double grid, numbermul; Zoom zoom; int track, pos; int trackdx; int snap; Array marker; int tabpos; int tabsize; int newtabalign; public: Event<> WhenLeftDouble; Event<> WhenLeftDown; Event<> WhenRightDown; Event<> WhenBeginTrack; Event<> WhenTrack; Event<> WhenEndTrack; void SetLayout(int x, int pgcx, Zoom zoom, double grid, int numbers = INT_MAX, double numbermul = 1, int marks = INT_MAX, int snap = 32); void Clear(); void Set(int i, const Marker& m); void SetCount(int n); int GetCount() const { return marker.GetCount(); } const Marker& operator[](int i) { return marker[i]; } int FindMarker(Point p); int GetTrack() { return track; } int GetPos() { return pos; } void SetTabs(int pos, int size); int GetNewTabAlign() { return newtabalign; } RichRuler(); virtual ~RichRuler(); }; enum { UNIT_DOT, UNIT_POINT, UNIT_INCH, UNIT_MM, UNIT_CM, }; class UnitEdit : public EditField, public Convert { public: virtual Value GetData() const; virtual Value Format(const Value& v) const; virtual void SetData(const Value& v); virtual bool Key(dword key, int repcnt); virtual void MouseWheel(Point p, int zdelta, dword keyflags); private: SpinButtons spin; int unit; bool sgn; static String AsText(double d, int unit); static String DotAsText(int dot, int unit); void Spin(int delta); void Read(double& q, int& u) const; public: UnitEdit& SetUnit(int _unit) { unit = _unit; return *this; } void Set(int _unit, int d) { unit = _unit; SetData(d); } UnitEdit& WithSgn(bool b = true); typedef UnitEdit CLASSNAME; UnitEdit(); }; struct FontHeight : public WithDropChoice { virtual bool Key(dword key, int); FontHeight() { MinMax(1, 72); } }; #define LAYOUTFILE #include bool EditRichHeaderFooter(String& header_qtf, String& footer_qtf); class ParaFormatting : public WithParaLayout { public: DropList n[8]; private: UnitEdit tabpos; DropList tabtype; DropList tabfill; bool keepindent; Font font; bool modified; String header_qtf, footer_qtf; RichPara::NumberFormat GetNumbering(); bool IsNumbering(); int ComputeIndent(); void SetMod() { modified = true; } typedef ParaFormatting CLASSNAME; public: void Set(int unit, const RichText::FormatInfo& formatinfo, bool baselevel = false); dword Get(RichText::FormatInfo& formatinfo); void SetFont(Font fnt) { font = fnt; } bool IsChanged() const { return IsModifiedDeep() || modified; } void EnableNumbering(); void SetupIndent(); void EditHdrFtr(); void NewHdrFtr(); void SyncHdrFtr(); ParaFormatting(); }; class StyleManager : public WithStylesLayout { public: ParaFormatting para; FontHeight height; private: int unit; ArrayMap style; Index dirty; EditString name; void EnterStyle(); void SaveStyle(); void SetupFont(); void SetupFont0(); void Create(); void ReloadNextStyles(); void Remove(); void GetFont(Font& font); void Menu(Bar& bar); typedef StyleManager CLASSNAME; public: void Set(const RichText& text, const Uuid& current = Null); void Set(const char *qtf); bool IsChanged() const; void Get(RichText& text); RichText Get(); String GetQTF(); void Setup(const Vector& faces, int aunit = UNIT_DOT); StyleManager(); }; void SetupFaceList(DropList& face); class RichEdit : public Ctrl, private TextArrayOps { public: virtual void Layout(); virtual void Paint(Draw& w); virtual bool Key(dword key, int count); virtual void LeftDown(Point p, dword flags); virtual void MiddleDown(Point p, dword flags); virtual void LeftUp(Point p, dword flags); virtual void LeftDrag(Point p, dword flags); virtual void RightDown(Point p, dword flags); virtual void LeftDouble(Point p, dword flags); virtual void LeftTriple(Point p, dword flags); virtual void MouseMove(Point p, dword flags); virtual void LeftRepeat(Point p, dword flags); virtual void MouseWheel(Point p, int zdelta, dword keyflags); virtual void CancelMode(); virtual Image CursorImage(Point p, dword flags); virtual Value GetData() const; virtual void SetData(const Value& v); virtual void Serialize(Stream& s); virtual void DragAndDrop(Point p, PasteClip& d); virtual void DragRepeat(Point p); virtual void DragLeave(); virtual String GetSelectionData(const String& fmt) const; private: virtual int GetCharAt(int64 i) const { return GetChar((int)i); } virtual int64 GetTotal() const { return GetLength(); } int viewborder; void *context; Size p_size; bool sizetracking; ScrollBar sb; Scroller scroller; RichRuler ruler; RichText text; RichText::FormatInfo formatinfo; int cursor, anchor; bool begtabsel; RichCaret cursorc; RichPos cursorp; RichPos anchorp; int tablesel; Rect cells; int gx; int oselh, osell; int objectpos; int zsc; Rect objectrect; RichHotPos tabmove; int mpos; int undosteps; Rect dropcaret; bool selclick; DropList face; FontHeight height; DataPusher hyperlink; DataPusher label; DataPusher indexentry; FrameRight