#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: Callback WhenLeftDouble; Callback WhenLeftDown; Callback WhenRightDown; Callback WhenBeginTrack; Callback WhenTrack; Callback 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); 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); }; #define LAYOUTFILE #include class RichEdit : public Ctrl { 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 RightDown(Point p, dword flags); virtual void LeftDouble(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); private: Size p_size; bool sizetracking; ScrollBar sb; Scroller scroller; RichRuler ruler; RichText text; RichText::FormatInfo formatinfo; int cursor, anchor; RichCaret cursorc; RichPos cursorp; RichPos anchorp; int tablesel; Rect cells; int gx; int oselh, osell; int objectpos; Rect objectrect; RichHotPos tabmove; int mpos; int undosteps; DropList face; FontHeight height; DataPusher hyperlink; DataPusher label; DataPusher indexentry; FrameRight