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