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