1 #include "CtrlCore.h"
2 
3 namespace Upp {
4 
FramePaint(Draw & draw,const Rect & r)5 void CtrlFrame::FramePaint(Draw& draw, const Rect& r) {}
FrameAdd(Ctrl & ctrl)6 void CtrlFrame::FrameAdd(Ctrl& ctrl) {}
FrameRemove()7 void CtrlFrame::FrameRemove() {}
OverPaint() const8 int CtrlFrame::OverPaint() const { return 0; }
9 
FrameLayout(Rect & r)10 void NullFrameClass::FrameLayout(Rect& r) {}
FramePaint(Draw & draw,const Rect & r)11 void NullFrameClass::FramePaint(Draw& draw, const Rect& r) {}
FrameAddSize(Size & sz)12 void NullFrameClass::FrameAddSize(Size& sz) {}
13 
NullFrame()14 CtrlFrame& NullFrame() { return Single<NullFrameClass>(); }
15 
FrameLayout(Rect & r)16 void BorderFrame::FrameLayout(Rect& r)
17 {
18 	Size sz = r.GetSize();
19 	int n = (int)(intptr_t)*border;
20 	if(sz.cx >= 2 * n && sz.cy >= 2 * n)
21 		r.Deflate(n);
22 }
23 
FrameAddSize(Size & sz)24 void BorderFrame::FrameAddSize(Size& sz)
25 {
26 	sz += 2 * (int)(intptr_t)*border;
27 }
28 
FramePaint(Draw & draw,const Rect & r)29 void BorderFrame::FramePaint(Draw& draw, const Rect& r)
30 {
31 	Size sz = r.GetSize();
32 	int n = (int)(intptr_t)*border;
33 	if(sz.cx >= 2 * n && sz.cy >= 2 * n)
34 		DrawBorder(draw, r.left, r.top, r.Width(), r.Height(), border);
35 }
36 
InsetFrame()37 CtrlFrame& InsetFrame() { static BorderFrame h(InsetBorder()); return h; }
ThinInsetFrame()38 CtrlFrame& ThinInsetFrame() { static BorderFrame h(ThinInsetBorder()); return h; }
ButtonFrame()39 CtrlFrame& ButtonFrame() { static BorderFrame h(ButtonBorder()); return h; }
BlackFrame()40 CtrlFrame& BlackFrame() { static BorderFrame h(BlackBorder()); return h; }
WhiteFrame()41 CtrlFrame& WhiteFrame() { static BorderFrame h(WhiteBorder()); return h; }
OutsetFrame()42 CtrlFrame& OutsetFrame() { static BorderFrame h(OutsetBorder()); return h; }
ThinOutsetFrame()43 CtrlFrame& ThinOutsetFrame() { static BorderFrame h(ThinOutsetBorder()); return h; }
44 
45 CH_COLOR(FieldFrameColor, Blend(SColorHighlight, SColorShadow));
46 
47 class XPFieldFrameCls : public CtrlFrame {
FrameLayout(Rect & r)48 	virtual void FrameLayout(Rect& r)                   { r.Deflate(2); }
FramePaint(Draw & w,const Rect & r)49 	virtual void FramePaint(Draw& w, const Rect& r) {
50 		DrawFrame(w, r, FieldFrameColor());
51 		DrawFrame(w, r.Deflated(1), SColorPaper);
52 	}
FrameAddSize(Size & sz)53 	virtual void FrameAddSize(Size& sz) { sz += 4; }
54 };
55 
56 class XPEditFieldFrameCls : public CtrlFrame {
FrameLayout(Rect & r)57 	virtual void FrameLayout(Rect& r)                   { r.Deflate(1); }
FramePaint(Draw & w,const Rect & r)58 	virtual void FramePaint(Draw& w, const Rect& r) {
59 		DrawFrame(w, r, FieldFrameColor());
60 	}
FrameAddSize(Size & sz)61 	virtual void FrameAddSize(Size& sz) { sz += 2; }
62 };
63 
XPFieldFrame()64 CtrlFrame& XPFieldFrame() { return Single<XPFieldFrameCls>(); }
XPEditFieldFrame()65 CtrlFrame& XPEditFieldFrame() { return Single<XPEditFieldFrameCls>(); }
66 
67 CH_INT(EditFieldIsThin, 0);
68 
FieldFrame()69 CtrlFrame& FieldFrame() { return GUI_GlobalStyle() >= GUISTYLE_XP ? XPFieldFrame() : InsetFrame(); }
70 
71 CH_VALUE(TopSeparator1, SColorShadow());
72 CH_VALUE(TopSeparator2, SColorLight());
73 
74 class TopSeparatorFrameCls : public CtrlFrame {
FrameLayout(Rect & r)75 	virtual void FrameLayout(Rect& r)                   { r.top += 2; }
FramePaint(Draw & w,const Rect & r)76 	virtual void FramePaint(Draw& w, const Rect& r) {
77 		ChPaint(w, r.left, r.top, r.Width(), 1, TopSeparator1());
78 		ChPaint(w, r.left, r.top + 1, r.Width(), 1, TopSeparator2());
79 	}
FrameAddSize(Size & sz)80 	virtual void FrameAddSize(Size& sz) { sz.cy += 2; }
81 };
82 
83 class BottomSeparatorFrameCls : public CtrlFrame {
FrameLayout(Rect & r)84 	virtual void FrameLayout(Rect& r)                   { r.bottom -= 2; }
FramePaint(Draw & w,const Rect & r)85 	virtual void FramePaint(Draw& w, const Rect& r) {
86 		w.DrawRect(r.left, r.bottom - 2, r.Width(), 1, SColorShadow);
87 		w.DrawRect(r.left, r.bottom - 1, r.Width(), 1, SColorLight);
88 	}
FrameAddSize(Size & sz)89 	virtual void FrameAddSize(Size& sz) { sz.cy += 2; }
90 };
91 
92 class LeftSeparatorFrameCls : public CtrlFrame {
FrameLayout(Rect & r)93 	virtual void FrameLayout(Rect& r)                   { r.left += 2; }
FramePaint(Draw & w,const Rect & r)94 	virtual void FramePaint(Draw& w, const Rect& r) {
95 		w.DrawRect(r.left, r.top, 1, r.Height(), SColorShadow);
96 		w.DrawRect(r.left + 1, r.top, 1, r.Height(), SColorLight);
97 	}
FrameAddSize(Size & sz)98 	virtual void FrameAddSize(Size& sz) { sz.cx += 2; }
99 };
100 
101 class RightSeparatorFrameCls : public CtrlFrame {
FrameLayout(Rect & r)102 	virtual void FrameLayout(Rect& r)                   { r.right -= 2; }
FramePaint(Draw & w,const Rect & r)103 	virtual void FramePaint(Draw& w, const Rect& r) {
104 		w.DrawRect(r.right - 2, r.top, 1, r.Height(), SColorShadow);
105 		w.DrawRect(r.right - 1, r.top, 1, r.Height(), SColorLight);
106 	}
FrameAddSize(Size & sz)107 	virtual void FrameAddSize(Size& sz) { sz.cx += 2; }
108 };
109 
BottomSeparatorFrame()110 CtrlFrame& BottomSeparatorFrame() { return Single<BottomSeparatorFrameCls>(); }
TopSeparatorFrame()111 CtrlFrame& TopSeparatorFrame()    { return Single<TopSeparatorFrameCls>(); }
RightSeparatorFrame()112 CtrlFrame& RightSeparatorFrame()  { return Single<RightSeparatorFrameCls>(); }
LeftSeparatorFrame()113 CtrlFrame& LeftSeparatorFrame()   { return Single<LeftSeparatorFrameCls>(); }
114 
115 CH_INT(FrameButtonWidth, DPI(17));
116 CH_INT(ScrollBarArrowSize, FrameButtonWidth());
117 
LayoutFrameLeft(Rect & r,Ctrl * ctrl,int cx)118 void LayoutFrameLeft(Rect& r, Ctrl *ctrl, int cx)
119 {
120 	if(ctrl) {
121 		cx *= ctrl->IsShown();
122 		ctrl->SetFrameRect(r.left, r.top, cx, r.Height());
123 		r.left += cx;
124 	}
125 }
126 
LayoutFrameRight(Rect & r,Ctrl * ctrl,int cx)127 void LayoutFrameRight(Rect& r, Ctrl *ctrl, int cx)
128 {
129 	if(ctrl) {
130 		cx *= ctrl->IsShown();
131 		ctrl->SetFrameRect(r.right - cx, r.top, cx, r.Height());
132 		r.right -= cx;
133 	}
134 }
135 
LayoutFrameTop(Rect & r,Ctrl * ctrl,int cy)136 void LayoutFrameTop(Rect& r, Ctrl *ctrl, int cy)
137 {
138 	if(ctrl) {
139 		cy *= ctrl->IsShown();
140 		ctrl->SetFrameRect(r.left, r.top, r.Width(), cy);
141 		r.top += cy;
142 	}
143 }
144 
LayoutFrameBottom(Rect & r,Ctrl * ctrl,int cy)145 void LayoutFrameBottom(Rect& r, Ctrl *ctrl, int cy)
146 {
147 	if(ctrl) {
148 		cy *= ctrl->IsShown();
149 		ctrl->SetFrameRect(r.left, r.bottom - cy, r.Width(), cy);
150 		r.bottom -= cy;
151 	}
152 }
153 
154 }
155