File: AutoLayout.h

package info (click to toggle)
codelite 17.0.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 136,204 kB
  • sloc: cpp: 491,547; ansic: 280,393; php: 10,259; sh: 8,930; lisp: 7,664; vhdl: 6,518; python: 6,020; lex: 4,920; yacc: 3,123; perl: 2,385; javascript: 1,715; cs: 1,193; xml: 1,110; makefile: 804; cobol: 741; sql: 709; ruby: 620; f90: 566; ada: 534; asm: 464; fortran: 350; objc: 289; tcl: 258; java: 157; erlang: 61; pascal: 51; ml: 49; awk: 44; haskell: 36
file content (340 lines) | stat: -rw-r--r-- 9,360 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
/***************************************************************
 * Name:      AutoLayout.h
 * Purpose:   Declares class for autolayouting algoriths' provider
 * Author:    Michal Bližňák (michal.bliznak@tiscali.cz)
 * Created:   2010-12-22
 * Copyright: Michal Bližňák
 * License:   wxWidgets license (www.wxwidgets.org)
 * Notes:
 **************************************************************/

#ifndef _WXSFAUTOLAYOUT_H_
#define _WXSFAUTOLAYOUT_H_

#include <wx/wxsf/DiagramManager.h>

#include <wx/hashmap.h>

/*!
 * \brief Base class for all layouting algorithms. The class containts one abstract function modifying
 * shapes' layout and several helper functions.
 */
class WXDLLIMPEXP_SF wxSFLayoutAlgorithm : public wxObject
{
public:
	/*!
	 * \brief Destructor.
	 */
	virtual ~wxSFLayoutAlgorithm() {;}
	/*!
	 * \brief Function performing the layout change. All derived classes must implement it.
	 * \param shapes List of shapes which should be layouted
	 */
	virtual void DoLayout(ShapeList &shapes) = 0;
	
protected:
	/*!
	 * \brief Calculate bounding box surroundig given shapes.
	 * \param shapes List of shapes
	 * \return Bounding box
	 */
	wxRect GetBoundingBox(const ShapeList &shapes);
	/*!
	 * \brief Get overall extent of all given shapes calculated as a sum of their width and height.
	 * \param shapes List of shapes
	 * \return Overall shapes extent
	 */
	wxSize GetShapesExtent(const ShapeList &shapes);
	/*!
	 * \brief Get center point of given shapes.
	 * \param shapes List of shapes
	 * \return Center point
	 */
	wxRealPoint GetShapesCenter(const ShapeList &shapes);
	/*!
	 * \brief Get top-left point of bounding box surrounding given shapes.
	 * \param shapes List of shapes
	 * \return Top-left point of bounding box surrounding given shapes
	 */
	wxRealPoint GetTopLeft(const ShapeList &shapes);
};

WX_DECLARE_HASH_MAP( wxString, wxSFLayoutAlgorithm*, wxStringHash, wxStringEqual, LayoutAlgoritmMap );
	
/*!
 * \brief Class implements automatic diagram layout. The class allows to automatically layout shapes
 * included in diagram manager/shape canvas/list of shapes by using several pre-defined layouting 
 * algorithms. The class should be used as it is.
 */
class WXDLLIMPEXP_SF wxSFAutoLayout
{
public:
	/*!
	 * \brief Constructor.
	 */
	wxSFAutoLayout();
	/*!
	 * \brief Destructor.
	 */
	~wxSFAutoLayout();

	/*!
	 * \brief Layout shapes included in given list.
	 * \param shapes List of shapes
	 * \param algname Algorithm name
	 */
	void Layout(ShapeList &shapes, const wxString& algname);
	/*!
	 * \brief Layout shapes included in given diagram manager.
	 * \param manager Reference to diagram manager
	 * \param algname Algorithm name
	 */
	void Layout(wxSFDiagramManager &manager, const wxString& algname);
	/*!
	 * \brief Layout shapes included in given shape canvas.
	 * \param canvas Pointer to shape canvas
	 * \param algname
	 */
	void Layout(wxSFShapeCanvas *canvas, const wxString& algname);
	
	/*!
	 * \brief Register custom layouting algorithm (class derived from wxSFLayoutAlgorithm).
	 * \param algname Algorithm name
	 * \param alg Pointer to class encapsulating the layouting algorithm
	 * \return TRUE if the algorithm was successfuly registered, otherwise FALSE
	 */
	static bool RegisterLayoutAlgorithm(const wxString& algname, wxSFLayoutAlgorithm *alg);
	/*!
	 * \brief Clean up registered layouting algorithms. Must be called at application deinitialization
	 * if wxSFAutoLayout were used in the program.
	 */
	static void CleanUp();
	
	/*!
	 * \brief Get string list containing names of registered layouting algorithms.
	 * \return List of registered algorithm names.
	 */
	wxArrayString GetRegisteredAlgorithms();
	/*!
	 * \brief Get pointer to registered layouting algorithm.
	 * \param algname Algorithm name
	 * \return Pointer to class encapsulating selected layouting algorithm if registered, otherwise NULL
	 */
	wxSFLayoutAlgorithm *GetAlgorithm(const wxString &algname) { return m_mapAlgorithms[algname]; }
	
protected:
	/*!
	 * \brief Register all pre-defined layouting algorithms. The function is called from wxSFAutoLayout class
	 * constructor.
	 */
	void InitializeAllAlgorithms();
	/*!
	 * \brief Update given shape canvas.
	 * \param canvas
	 */
	void UpdateCanvas(wxSFShapeCanvas *canvas);
	
	static LayoutAlgoritmMap m_mapAlgorithms;
	
};

// pre-defined algorithms //////////////////////////////////////////////////////

/*!
 * \brief Class encapsulating algorithm which layouts all top-most shapes into circle registered under "Circle" name.
 * The algorithm doesn't optimize connection lines crossing.
 */
class wxSFLayoutCircle : public wxSFLayoutAlgorithm
{
public:
	/*!
	 * \brief Constructor.
	 */
	wxSFLayoutCircle() : m_DistanceRatio(1) {;}
	/*!
	 * \brief Destructor.
	 */
	virtual ~wxSFLayoutCircle() {;}
	
	/*!
	 * \brief Function performing the layout change.
	 * \param shapes List of shapes which should be layouted
	 */
	virtual void DoLayout(ShapeList &shapes);
	
	/*!
	 * \brief Set ratio in which calculated distance between shapes will be reduced. Values less than
	 * 1 means that the distance will be smaller, values bigger than 1 means that the distance will be
	 * bigger.
	 * \param DistanceRatio Distance ratio
	 */
	void SetDistanceRatio(double DistanceRatio) {this->m_DistanceRatio = DistanceRatio;}
	/*!
	 * \brief Get distance ratio.
	 * \return Current distance ratio
	 */
	double GetDistanceRatio() const {return m_DistanceRatio;}
	
protected:
	double m_DistanceRatio;
};

/*!
 * \brief Class encapsulating algorithm which layouts all top-most shapes into vertical tree registered under "Vertical Tree" name.
 */
class wxSFLayoutVerticalTree : public wxSFLayoutAlgorithm
{
public:
	/*!
	 * \brief Constructor.
	 */
	wxSFLayoutVerticalTree() : m_HSpace(30), m_VSpace(30) {;}
	/*!
	 * \brief Destructor.
	 */
	virtual ~wxSFLayoutVerticalTree() {;}
	
	/*!
	 * \brief Function performing the layout change.
	 * \param shapes List of shapes which should be layouted
	 */
	virtual void DoLayout(ShapeList &shapes);

	/*!
	 * \brief Set horizontal space between shapes.
	 * \param HSpace Horizontal space in pixels.
	 */
	void SetHSpace(double HSpace) {this->m_HSpace = HSpace;}
	/*!
	 * \brief Set vertical space between shapes.
	 * \param VSpace Vertical space in pixels.
	 */
	void SetVSpace(double VSpace) {this->m_VSpace = VSpace;}
	/*!
	 * \brief Get horizontal space.
	 * \return Horizontal space in pixels.
	 */
	double GetHSpace() const {return m_HSpace;}
	/*!
	 * \brief Get vertical space.
	 * \return Vertical space in pixels.
	 */
	double GetVSpace() const {return m_VSpace;}
	
protected:
	double m_nMinX;
	int m_nCurrMaxWidth;
	
	double m_HSpace;
	double m_VSpace;

	/*!
	 * \brief Process single shape.
	 * \param node Pointer to processed shape.
	 * \param y Vertical position of the shape.
	 */
	void ProcessNode(wxSFShapeBase *node, double y);
};

/*!
 * \brief Class encapsulating algorithm which layouts all top-most shapes into horizontal tree registered under "Horizontal Tree" name.
 */
class wxSFLayoutHorizontalTree : public wxSFLayoutAlgorithm
{
public:
	/*!
	 * \brief Constructor.
	 */
	wxSFLayoutHorizontalTree() : m_HSpace(30), m_VSpace(30) {;}
	/*!
	 * \brief Destructor.
	 */
	virtual ~wxSFLayoutHorizontalTree() {;}
	
	/*!
	 * \brief Function performing the layout change.
	 * \param shapes List of shapes which should be layouted
	 */
	virtual void DoLayout(ShapeList &shapes);
	
	/*!
	 * \brief Set horizontal space between shapes.
	 * \param HSpace Horizontal space in pixels.
	 */
	void SetHSpace(double HSpace) {this->m_HSpace = HSpace;}
	/*!
	 * \brief Set vertical space between shapes.
	 * \param VSpace Vertical space in pixels.
	 */
	void SetVSpace(double VSpace) {this->m_VSpace = VSpace;}
	/*!
	 * \brief Get horizontal space.
	 * \return Horizontal space in pixels.
	 */
	double GetHSpace() const {return m_HSpace;}
	/*!
	 * \brief Get vertical space.
	 * \return Vertical space in pixels.
	 */
	double GetVSpace() const {return m_VSpace;}
	
protected:
	double m_nMinY;
	int m_nCurrMaxHeight;
	
	double m_HSpace;
	double m_VSpace;

	void ProcessNode(wxSFShapeBase *node, double x);
};

/*!
 * \brief Class encapsulating algorithm which layouts all top-most shapes into mesh registered under "Mesh" name.
 * The algorithm doesn't optimize connection lines crossing.
 */
class wxSFLayoutMesh : public wxSFLayoutAlgorithm
{
public:
	/*!
	 * \brief Constructor.
	 */
	wxSFLayoutMesh() : m_HSpace(30), m_VSpace(30) {;}
	/*!
	 * \brief Destructor.
	 */
	virtual ~wxSFLayoutMesh() {;}
	
	/*!
	 * \brief Function performing the layout change.
	 * \param shapes List of shapes which should be layouted
	 */
	virtual void DoLayout(ShapeList &shapes);
	
	/*!
	 * \brief Set horizontal space between shapes.
	 * \param HSpace Horizontal space in pixels.
	 */
	void SetHSpace(double HSpace) {this->m_HSpace = HSpace;}
	/*!
	 * \brief Set vertical space between shapes.
	 * \param VSpace Vertical space in pixels.
	 */
	void SetVSpace(double VSpace) {this->m_VSpace = VSpace;}
	/*!
	 * \brief Get horizontal space.
	 * \return Horizontal space in pixels.
	 */
	double GetHSpace() const {return m_HSpace;}
	/*!
	 * \brief Get vertical space.
	 * \return Vertical space in pixels.
	 */
	double GetVSpace() const {return m_VSpace;}
	
	
protected:
	double m_HSpace;
	double m_VSpace;
};

#endif //_WXSFAUTOLAYOUT_H_