1 #ifndef FORM_VIEW_HPP
2 #define FORM_VIEW_HPP
3 
4 #include <CtrlLib/CtrlLib.h>
5 #include <GridCtrl/GridCtrl.h>
6 using namespace Upp;
7 
8 #include <Form/FormLayout.hpp>
9 
10 #define IMAGECLASS FormViewImg
11 #define IMAGEFILE <FormEditor/FormView.iml>
12 #include <Draw/iml_header.h>
13 
14 class ScrollContainer;
15 
16 class FormView : public Ctrl, public XMLConfig
17 {
18 public:
19 	FormView();
NullCallback()20 	void NullCallback() {}
21 
22 ///////////////////////////////////////////////////////////////////////////////////////////
23 // Draw methods / Прорисовка
24 ///////////////////////////////////////////////////////////////////////////////////////////
25 
26 public:
27 	virtual void Paint(Draw& w);
28 
29 	void DrawRect(Draw& w, const Point& p, const Size& sz, int width, Color clr);
30 	void DrawRect(Draw& w, const Rect& r, int width, Color clr);
31 	void DrawGrid(Draw& w);
32 	void DrawObject(Draw& w, int id, const Color& c = LtGray(), bool springs = true);
33 	void DrawSprings(Draw& w, const Rect& r, dword align, dword valign,
34 		bool drawLeft = true, bool drawTop = true, bool drawRight = true,
35 			bool drawBottom = true, bool centered = true);
36 	void DrawGroupTools(Draw& w, const Rect& r);
37 
38 ///////////////////////////////////////////////////////////////////////////////////////////
39 // Events / События мыши / клавиатуры
40 ///////////////////////////////////////////////////////////////////////////////////////////
41 
42 public:
43 	virtual void LeftDouble(Point p, dword keyflags);
44 	virtual void LeftDown(Point p, dword keyflags);
45 	virtual void LeftDrag(Point p, dword keyflags);
46 	virtual void LeftUp(Point p, dword keyflags);
47 
48 	virtual void RightDown(Point p, dword keyflags);
49 	virtual void RightDrag(Point p, dword keyflags);
50 	virtual void MouseMove(Point p, dword keyflags);
51 	virtual void MouseLeave();
52 
53 	virtual void Layout();
54 
55 	bool ProcessLeftDrag(Point p, dword keyflags);
56 	void ProcessRightDrag(Point p, dword keyflags);
57 
58 ///////////////////////////////////////////////////////////////////////////////////////////
59 // Objects and lays / Работа с объектами / слоями
60 ///////////////////////////////////////////////////////////////////////////////////////////
61 
62 public:
63 	void CreateObject(Point p, const char* type);
64 	void CreateObjectMenu(Bar& bar, int id);
65 
66 	void AlignObjectMenu(Bar& bar);
67 	void AddObjectMenu(Bar& bar, Point p);
68 
69 	void ToggleOutlineDraw(int obj);
70 	bool IsOutlineDraw(int obj);
71 
GetObjectCount()72 	int GetObjectCount() { return IsLayout() ? GetCurrentLayout()->GetObjects().GetCount() : 0; }
GetObjects()73 	Vector<FormObject>* GetObjects() { return IsLayout() ? &(GetCurrentLayout()->GetObjects()) : NULL; }
74 
75 	void New();
GetLayoutCount() const76 	int GetLayoutCount() const { return _Layouts.GetCount(); }
GetLayout(int id)77 	FormLayout* GetLayout(int id) { return IsLayout(id) ? &_Layouts[id] : NULL; }
IsLayout(int id) const78 	bool IsLayout(int id) const { return id >= 0 && id < GetLayoutCount(); }
IsLayout() const79 	bool IsLayout() const { return IsLayout(_Layout); }
GetCurrentLayout()80 	FormLayout* GetCurrentLayout() { return IsLayout() ? (&(_Layouts[_Layout])) : NULL; }
GetCurrentLayout() const81 	const FormLayout* GetCurrentLayout() const { return IsLayout() ? (&(_Layouts[_Layout])) : NULL; }
82 
AddLayout(const String & name)83 	void AddLayout(const String& name) { _Layouts.Add().Set("Form.Name", name);
84 		_Layout = _Layouts.GetCount() - 1; Refresh(); }
SelectLayout(int index)85 	void SelectLayout(int index)
86 	{
87 		if (!IsLayout(index)) return;
88 		_Layout = index;
89 		SetFormSize(_Layouts[index].GetFormSize());
90 		Refresh();
91 	}
92 
93 	int HasLayout(const String& layout);
94 
UpdateLayoutName(int index,const String & name)95 	void UpdateLayoutName(int index, const String& name) { if (!IsLayout(index)) return;
96 		_Layouts[index].Set("Form.Name", name); }
97 
RemoveLayout(int index)98 	bool RemoveLayout(int index)
99 	{
100 		if (!IsLayout(index))
101 			return false;
102 
103 		_Layouts.Remove(index);
104 		int count = GetLayoutCount();
105 		if (count > 0 && _Layout >= count) SelectLayout(count - 1);
106 		if (count ==  0) _Layout = -1;
107 		return true;
108 	}
109 
110 	void MoveUpObject(int id);
111 	void MoveDownObject(int id);
112 	void MoveToTopObject(int id);
113 	void MoveToBottomObject(int id);
114 
115 	void AlignTopSelection();
116 	void AlignLeftSelection();
117 	void AlignRightSelection();
118 	void AlignBottomSelection();
119 
120 	void InvertSelection();
121 	void RemoveSelection();
122 	Vector<int> GetSelected();
123 	int GetSelectedCount();
124 	FormObject* GetObject(int id);
125 
126 	void ToggleSelection(int id);
127 	void ClearSelection();
128 	void AddToSelection(int id);
129 
130 ///////////////////////////////////////////////////////////////////////////////////////////
131 // Methods for FormEdit / Взаимодействие с редактором
132 ///////////////////////////////////////////////////////////////////////////////////////////
133 
134 public:
SetContainer(ScrollContainer & cont)135 	void SetContainer(ScrollContainer& cont) { _container = &cont; }
136 
137 	void SetSprings(dword hAlign, dword vAlign);
138 
ShowFrames()139 	void ShowFrames() { _showInfo = 2; Refresh(); }
ShowInfo()140 	void ShowInfo()   { _showInfo = 1; Refresh(); }
HideInfo()141 	void HideInfo()   { _showInfo = 0; Refresh(); }
142 
UpdateTools()143 	void UpdateTools() { WhenMenuBar(_tools); }
OpenObjectProperties(const Vector<int> & indexes)144 	void OpenObjectProperties(const Vector<int>& indexes) { WhenObjectProperties(indexes); }
DoOpenObjectProperties()145 	void DoOpenObjectProperties() { OpenObjectProperties(GetSelected()); }
146 
147 ///////////////////////////////////////////////////////////////////////////////////////////
148 // Filesystem / Работа с файловой системой
149 ///////////////////////////////////////////////////////////////////////////////////////////
150 
151 public:
152 	void Xmlize(XmlIO xml);
153 	bool SaveAll(const String& file, bool compression);
154 	bool LoadAll(const String& file, bool compression);
155 
156 ///////////////////////////////////////////////////////////////////////////////////////////
157 // Coordinates / Позиционирование элементов / система координат
158 ///////////////////////////////////////////////////////////////////////////////////////////
159 
160 public:
X(int x)161 	int X(int x) { return GetPageRect().TopLeft().x + x; }
Y(int y)162 	int Y(int y) { return GetPageRect().TopLeft().y + y; }
163 
ZoomX(int x)164 	int ZoomX(int x) { return HorzLayoutZoom(x); }
ZoomY(int y)165 	int ZoomY(int y) { return VertLayoutZoom(y); }
166 
DeZoomX(int x)167 	int DeZoomX(int x) { return (int)(1000.0 / HorzLayoutZoom(1000) * x); }
DeZoomY(int y)168 	int DeZoomY(int y) { return (int)(1000.0 / VertLayoutZoom(1000) * y); }
169 
Zoom(Point p)170 	Point Zoom(Point p) { return Point(ZoomX(p.x), ZoomY(p.y)); }
Zoom(Size sz)171 	Size  Zoom(Size sz) { return LayoutZoom(sz); }
Zoom(Rect r)172 	Rect  Zoom(Rect r)  { return Rect( Zoom(r.TopLeft()), Zoom(r.GetSize()) ); }
173 
DeZoom(Point p)174 	Point DeZoom(Point p) { return Point(DeZoomX(p.x), DeZoomY(p.y)); }
DeZoom(Size sz)175 	Size  DeZoom(Size sz) { return Size(DeZoomX(sz.cx), DeZoomY(sz.cy)); }
DeZoom(Rect r)176 	Rect  DeZoom(Rect r)  { return Rect( DeZoom(r.TopLeft()), DeZoom(r.GetSize()) ); }
177 
178 	void SetFormSize(const Size& sz);
GetFormSize()179 	Size GetFormSize() { return GetPageRect().GetSize(); }
GetGridSize()180 	Size GetGridSize() { return Size( GetNumber("Grid.CX", 10), GetNumber("Grid.CY", 10) ); }
181 
SetPageRect(const Rect & r)182 	void SetPageRect(const Rect& r) { if (IsLayout()) GetCurrentLayout()->SetPageRect(r); }
GetPageRect() const183 	Rect GetPageRect() const { return IsLayout() ? GetCurrentLayout()->GetPageRect() : Rect(); }
184 
Offseted(const Rect & r)185 	Rect Offseted(const Rect& r) { return r.Offseted(GetPageRect().TopLeft().x, GetPageRect().TopLeft().y); }
Deoffseted(const Rect & r)186 	Rect Deoffseted(const Rect& r) { return r.Offseted(-GetPageRect().TopLeft().x, -GetPageRect().TopLeft().y); }
187 
Offseted(Point & r)188 	Point Offseted(Point& r) { return Point(X(r.x), Y(r.y)); }
189 
190 	void PointToGrid(Point& p);
191 	void RectToGrid(Rect& r);
192 
193 	int XToGrid(int pos, bool use = true);
194 	int YToGrid(int pos, bool use = true);
195 
196 	void SelectAllInRect(Rect r, bool add = false, bool toggle = false);
197 	bool IsObjectButton(Point p);
198 	dword IsGroupButton(Point p);
199 	bool IsSelected(int id);
200 	int ObjectFromPt(Point p);
201 
202 	Rect GetObjectsRect();
203 	Rect GetSelectionRect();
204 
205 
206 ///////////////////////////////////////////////////////////////////////////////////////////
207 // Variables / Переменные и типы
208 ///////////////////////////////////////////////////////////////////////////////////////////
209 
210 public:
211 	enum { TOOL_NONE, TOOL_LEFT, TOOL_TOP, TOOL_RIGHT, TOOL_BOTTOM };
212 
213 	Callback1<const Vector<int>&> WhenObjectProperties;
214 	Callback1<const Vector<int>&> WhenChildSelected;
215 	Callback1<const Vector<int>&> WhenChildPos;
216 	Callback1<int> WhenChildCount;
217 	Callback1<Bar&> WhenMenuBar;
218 	Callback WhenUpdateLayouts;
219 	Callback WhenChildAllPos;
220 	Callback WhenChildZ;
221 	Callback WhenUpdate;
222 	Callback WhenUpdateTabs;
223 
224 private:
225 	typedef FormView CLASSNAME;
226 	PARAMETER(int, Layout);
227 	PARAMETER(Font, Font);
228 	PARAMETER(dword, HAlign);
229 	PARAMETER(dword, VAlign);
230 	PARAMETER(WithDeepCopy< Vector<FormLayout> >, Layouts);
231 
232 	Image _cursor;
233 
234 	int _leftCur;
235 	int _topCur;
236 	int _rightCur;
237 	int _bottomCur;
238 	Image _toolLeft[3];
239 	Image _toolTop[3];
240 	Image _toolRight[3];
241 	Image _toolBottom[3];
242 
243 	Rect _groupRect;
244 
245 	bool _objectResize;
246 	bool _frameResize;
247 	int _showInfo;
248 
249 	ScrollContainer* _container;
250 
251 	Vector<Color> _colors;
252 	StaticRect _popup;
253 	ToolBar _tools;
254 };
255 
256 #endif // .. FORM_VIEW_HPP
257