1 #ifndef _LogPosCtrl_LogPosCtrl_h
2 #define _LogPosCtrl_LogPosCtrl_h
3 
4 #include <CtrlLib/CtrlLib.h>
5 using namespace Upp;
6 
7 #include <PopUpC/PopUpC.h>
8 #include <Gen/VTypes.h>
9 
10 #define LAYOUTFILE <LogPosCtrl/LogPosPopUp.lay>
11 #include <CtrlCore/lay.h>
12 
13 class LogPosPopUp : public WithLogPosPopUpLayout<WithCloserKeys<PopUpC> > {
14 public:
15 	typedef LogPosPopUp CLASSNAME;
16 	LogPosPopUp();
17 
18 	static Rect CtrlRect(Ctrl::LogPos pos, Size sz);
19 	static Rect CtrlRectZ(Ctrl::LogPos pos, Size sz);
20 	static Ctrl::LogPos MakeLogPos(int ax, int ay, const Rect& r, Size sz);
21 	static Ctrl::LogPos MakeLogPos(Ctrl::LogPos p, const Rect& r, Size sz);
22 	static Ctrl::LogPos MakeLogPos(Ctrl::LogPos p, const Ctrl::LogPos& pos, Size sz);
23 	static Ctrl::LogPos MakeLogPos(Ctrl::LogPos p, const Ctrl& c);
24 
25 	virtual void Updated();
26 	virtual Value GetData() const;
27 	virtual void SetData(const Value& v);
28 
29 	Ctrl::LogPos Generate() const; //obsolete
Get()30 	Ctrl::LogPos Get() const { return pos; }
31 	void Set(const Ctrl::LogPos& p);
32 
33 	using PopUpC::PopUp;
PopUp(Ctrl * owner,const Ctrl::LogPos & p)34 	void PopUp(Ctrl* owner, const Ctrl::LogPos& p) { Set(p); Update(); PopUpC::PopUp(owner); }
35 
Serialize(Stream & s)36 	virtual void Serialize(Stream& s) { s % pos; }
37 
38 	Callback WhenSizeChange;
39 	Callback WhenAlignChange;
40 
41 	void XaCB();
42 	void XbCB();
43 	void YaCB();
44 	void YbCB();
45 
LRCB()46 	void LRCB() { XAlign(); DoAlignAction(); }
TBCB()47 	void TBCB() { YAlign(); DoAlignAction(); }
48 
LTCB()49 	void LTCB() { l = true; r = false; t = true; b = false; XAlign(); YAlign(); DoAlignAction(); }
RTCB()50 	void RTCB() { l = false; r = true; t = true; b = false; XAlign(); YAlign(); DoAlignAction(); }
LBCB()51 	void LBCB() { l = true; r = false; t = false; b = true; XAlign(); YAlign(); DoAlignAction(); }
RBCB()52 	void RBCB() { l = false; r = true; t = false; b = true; XAlign(); YAlign(); DoAlignAction(); }
53 
HCCB()54 	void HCCB() { l = false; r = false; XAlign(); DoAlignAction(); }
VCCB()55 	void VCCB() { t = false; b = false; YAlign(); DoAlignAction(); }
CCCB()56 	void CCCB() { l = false; r = false; t = false; b = false; XAlign(); YAlign(); DoAlignAction(); }
57 
HSCB()58 	void HSCB() { l = true; r = true; XAlign(); DoAlignAction(); }
VSCB()59 	void VSCB() { t = true; b = true; YAlign(); DoAlignAction(); }
SSCB()60 	void SSCB() { l = true; r = true; t = true; b = true; XAlign(); YAlign(); DoAlignAction(); }
61 
62 protected:
63 	void XAlign();
64 	void YAlign();
DoAlignAction()65 	void DoAlignAction() { WhenAlignChange(); UpdateAction(); }
66 
67 	Ctrl::LogPos pos;
68 };
69 
70 class LogPosCtrl : public StaticText
71 {
72 public:
73 	typedef LogPosCtrl CLASSNAME;
74 	LogPosCtrl();
75 
76 	virtual void LeftDown(Point p, dword keyflags);
77 	virtual void Updated();
78 
SetBaseSize(const Size & sz)79 	void SetBaseSize(const Size& sz) { bsz = sz; }
ClearBaseSize()80 	void ClearBaseSize() { bsz = Null; }
GetBaseSize()81 	Size GetBaseSize() const { return bsz; }
82 
83 	virtual Value GetData() const;
84 	virtual void SetData(const Value& v);
85 
Get()86 	Ctrl::LogPos Get() const { return pos; }
87 	void Set(const Ctrl::LogPos& p, const Size& sz = Null) { pos = p; bsz = sz; Update(); }
Set(Ctrl & c)88 	void Set(Ctrl& c) { pos = c.GetPos(); bsz = c.GetParent() ? c.GetParent()->GetSize() : Null; Update(); }
89 	void Drop();
90 
Serialize(Stream & s)91 	virtual void Serialize(Stream& s) { s % pos; }
92 
93 	void OnReject();
94 	void OnAccept();
95 	void OnAction();
96 	void OnSizeChange();
97 	void OnAlignChange();
98 
99 	LogPosPopUp lc;
100 
101 protected:
102 	Ctrl::LogPos pos;
103 	bool push;
104 	Size bsz; //base info, for recalculation
105 };
106 
107 #endif
108 
109