1 #ifndef _ScatterCtrl_Properties_h_
2 #define _ScatterCtrl_Properties_h_
3 
4 namespace Upp {
5 
6 #define  LAYOUTFILE <ScatterCtrl/ScatterCtrl.lay>
7 #include <CtrlCore/lay.h>
8 
9 #define IMAGECLASS ScatterImgP
10 #define IMAGEFILE <ScatterCtrl/ScatterCtrl.iml>
11 #include <Draw/iml_header.h>
12 
13 
14 class FontSelect : public WithFontSelector<TopWindow> {
15 public:
16 	Event<Font> WhenAction;
17 
FontSelect()18 	FontSelect() {
19 		CtrlLayoutExit(*this, t_("Font"));
20 		FrameLess(true);
21 
22 		face.WhenAction = [=]{Select();};
23 		height.WhenAction = [=]{Select();};
24 		bold.WhenAction = [=]{Select();};
25 		italic.WhenAction = [=]{Select();};
26 		naa.WhenAction = [=]{Select();};
27 		face.Clear();
28 		Upp::Index<String> fni;
29 		for(int i = 0; i < Font::GetFaceCount(); i++) {
30 			if(Font::GetFaceInfo(i)) {
31 				String n = Font::GetFaceName(i);
32 				if(fni.Find(n) < 0) {
33 					fni.Add(n);
34 					face.Add(i, n);
35 				}
36 			}
37 		}
38 		face.SetIndex(0);
39 		height.ClearList();
40 		for(int i = 6; i < 64; i++)
41 			height.Add(i);
42 		Select();
43 	}
Set(Font f)44 	void Set(Font f) {
45 		int fi = f.GetFace();
46 		if(!face.HasKey(fi)) {
47 			fi = face.FindValue(f.GetFaceName());
48 			if(fi < 0)
49 				fi = Font::COURIER;
50 			else
51 				fi = face.GetKey(fi);
52 		}
53 		face.SetData(fi);
54 		Select();
55 		height.SetData(f.GetHeight());
56 		for(int i = 0; i < height.GetCount(); i++) {
57 			int q = height.GetKey(i);
58 			if(f.GetHeight() <= q) {
59 				height.SetData(q);
60 				break;
61 			}
62 		}
63 		bold = f.IsBold();
64 		italic = f.IsItalic();
65 		naa = f.IsNonAntiAliased();
66 	}
Get()67 	Font Get() {
68 		Font f(face.GetData(), height.GetData());
69 		f.Bold(bold);
70 		f.Italic(italic);
71 		f.NonAntiAliased(naa);
72 		return f;
73 	}
Execute(Ctrl & _parent)74 	void Execute(Ctrl &_parent) {
75 		Open(this);
76 		Rect rec = GetRect();
77 		Size sz = rec.GetSize();
78 		rec.left = _parent.GetScreenRect().left;
79 		rec.top = _parent.GetScreenRect().bottom;
80 		rec.right = rec.left + sz.cx;
81 		rec.bottom = rec.top + sz.cy;
82 		SetRect(rec);
83 		Run();
84 	}
85 
86 private:
Select()87 	void Select() {WhenAction(Get());}
88 };
89 
90 
91 class MeasuresTab : public WithMeasures<StaticRect> {
92 public:
93 	void Init(ScatterCtrl &scatter);
94 	void Change();
95 
96 private:
97 	ScatterCtrl *pscatter;
98 };
99 
100 class TextsTab : public WithTexts<StaticRect> {
101 public:
102 	void Init(ScatterCtrl &scatter);
103 	void DoShowText();
104 
105 private:
106 	ScatterCtrl *pscatter;
107 
108 	void Change();
109 	void OnFontTitle();
110 	void OnChangeFontTitle(Font font);
111 	void OnFontLabel();
112 	void OnChangeFontLabel(Font font);
113 };
114 
115 class LegendTab : public WithLegend<StaticRect> {
116 public:
117 	void Init(ScatterCtrl &scatter);
118 
119 private:
120 	ScatterCtrl *pscatter;
121 
122 	void Change();
123 	void ChangeAnchor(Option *op);
124 };
125 
126 class SeriesTab : public Splitter {
127 public:
SeriesTab()128 	SeriesTab() : dashCount(DashStyle::GetCount()) {}
~SeriesTab()129 	virtual ~SeriesTab() noexcept {DashStyle::UnregisterFrom(dashCount);}
130 	void Init(ScatterCtrl& scatter);
131 
132 private:
133 	ScatterCtrl *pscatter;
134 	int dashCount;
135 
136 	void Change();
137 	void ChangeMark();
138 	void UpdateFields();
139 	void OnMoveUp();
140 	void OnMoveDown();
141 	void OnDelete();
142 
143 	void Init0();
144 
145 	WithSeriesLeft<StaticRect> left;
146 	WithSeriesRight<StaticRect> right;
147 };
148 
149 class GeneralTab : public WithGeneral<StaticRect> {
150 public:
151 	void Init(ScatterCtrl &scatter);
152 
153 private:
154 	ScatterCtrl *pscatter;
155 
156 	void Change();
157 	void ChangeAll();
158 };
159 
160 class DataDlg : public WithData<TopWindow> {
161 public:
162 	void Init(ScatterCtrl& scatter);
~DataDlg()163 	virtual ~DataDlg() noexcept {};
164 
165 	void OnTab();
166 	void OnArrayBar(Bar &menu);
167 	void ArrayCopy();
168 	void ArraySelect();
169 	void ArraySaveToFile(String fileName);
170 
171 	class DataSourceX : public Convert {
172 	public:
173 		Value Format(const Value& q) const;
174 		ScatterDraw *pscatter;
175 		int index;
176 	} dataSourceX;
177 
178 	class DataSourceY : public Convert {
179 	public:
180 		Value Format(const Value& q) const;
181 		ScatterDraw *pscatter;
182 		int index;
183 	};
184 	Upp::Array<DataSourceY> dataSourceYArr;
185 
186 private:
187 	ScatterCtrl *pscatter;
188 
189 	Upp::Array <WithDataSeries <StaticRect> > series;
190 };
191 
192 class PropertiesDlg : public WithProperties<TopWindow> {
193 public:
194 	void Init(ScatterCtrl& scatter);
~PropertiesDlg()195 	virtual ~PropertiesDlg() noexcept {};
196 
197 	void Set(int tab);
198 	void OnTab();
199 	void Perform();
Close()200 	virtual void Close() {
201 		if (pscatter->GetCount() == 0)
202 			RejectBreak(IDOK);
203 		TopWindow::Close();
204 	}
205 
206 private:
207 	ScatterCtrl* pscatter;
208 	MeasuresTab measures;
209 	TextsTab texts;
210 	LegendTab legend;
211 	SeriesTab series;
212 	GeneralTab general;
213 };
214 
215 class ProcessingTab : public WithProcessingTab<StaticRect> {
216 public:
217 	ProcessingTab();
~ProcessingTab()218 	virtual ~ProcessingTab() noexcept {};
219 
Init(ScatterCtrl & scatter)220 	void Init(ScatterCtrl& scatter) {pscatter = &scatter;}
221 	void UpdateField(const String name, int id);
222 	void OnFFT();
223 	void OnOp();
224 	void OnAutoSensSector();
225 	void OnShowEquation();
226 	void UpdateEquations();
227 	void OnFromTo();
228 	void OnOperation();
229 	void OnSet();
230 	void OnUpdateSensitivity();
231 	void OnFit();
232 	void OnHist();
233 
234 private:
235 	ScatterCtrl* pscatter;
236 	int id;
237 
238 	WithProcessingTabFitLeft<StaticRect> tabFitLeft;
239 	WithProcessingTabFitRight<StaticRect> tabFitRight;
240 	CtrlScroll tabFitRightScroll;
241 	Splitter splitterTabFit;
242 	WithProcessingTabFrequencyLeft<StaticRect> tabFreqLeft;
243 	WithProcessingTabFrequencyRight<StaticRect> tabFreqRight;
244 	CtrlScroll tabFreqRightScroll;
245 	Splitter splitterTabFreq;
246 	WithProcessingTabOpLeft<StaticRect> tabOpLeft;
247 	WithProcessingTabOpRight<StaticRect> tabOpRight;
248 	Splitter splitterTabOp;
249 	WithProcessingTabBestFitLeft<StaticRect> tabBestFitLeft;
250 	WithProcessingTabBestFitRight<StaticRect> tabBestFitRight;
251 	Splitter splitterTabBestFit;
252 	WithProcessingTabHistogramLeft<StaticRect> tabHistLeft;
253 	WithProcessingTabHistogramRight<StaticRect> tabHistRight;
254 	Splitter splitterTabHist;
255 
256 	void ArrayCopy();
257 	void ArraySelect();
258 	void OnArrayBar(Bar &menu);
259 	Upp::Array<ExplicitEquation> equationTypes;
260 	UserEquation *userEquation;
261 	//GridCtrlSource ds;
262 
263 	bool avgFirst, linearFirst, cuadraticFirst, cubicFirst, sinusFirst, sinusTendFirst, splineFirst;
264 	double r2Linear, r2Cuadratic, r2Cubic, r2Sinus, r2SinusTend;
265 	bool tabFreqFirst, tabOpFirst, tabBestFitFirst, tabHistFirst;
266 
267 	Vector<Pointf> fft;
268 	AvgEquation average;
269 	LinearEquation linear;
270 	PolynomialEquation2 cuadratic;
271 	PolynomialEquation3 cubic;
272 	SinEquation sinus, sinusTend;
273 	SplineEquation spline;
274 	Vector<Pointf> derivative;
275 	Vector<Pointf> sg;
276 	Vector<Pointf> upperEnvelope, lowerEnvelope;
277 	Vector<Pointf> movAvg, secAvg, cumAvg;
278 	DataXRange dataXRange;
279 	bool exclamationOpened;
280 	double newWidthMax, newWidthMin, newWidthMovAvg, mpm;
281 
282 	Histogram histogram;
283 };
284 
285 class ProcessingDlg : public TopWindow {
286 public:
287 	void Init(ScatterCtrl& scatter);
~ProcessingDlg()288 	virtual ~ProcessingDlg() noexcept {};
289 
290 private:
291 	ScatterCtrl *pscatter;
292 	Upp::Array<ProcessingTab> tabs;
293 	WithProcessingLeft<StaticRect> list;
294 	WithProcessingRight<StaticRect> right;
295 	Splitter splitter;
296 
297 	void UpdateFields();
298 };
299 
300 }
301 
302 #endif
303