Helper.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Drawing;
  5. using FastReport.DataVisualization.Charting;
  6. using System.Windows.Forms;
  7. using FastReport.Controls;
  8. using FastReport.Utils;
  9. using System.Globalization;
  10. namespace FastReport.MSChart
  11. {
  12. internal static class Helper
  13. {
  14. private static void AssignGridAppearance(Grid destGrid, Grid srcGrid)
  15. {
  16. destGrid.LineColor = srcGrid.LineColor;
  17. destGrid.LineDashStyle = srcGrid.LineDashStyle;
  18. destGrid.LineWidth = srcGrid.LineWidth;
  19. }
  20. private static void AssignTickMarkAppearance(TickMark destTick, TickMark srcTick)
  21. {
  22. destTick.LineColor = srcTick.LineColor;
  23. destTick.LineDashStyle = srcTick.LineDashStyle;
  24. destTick.LineWidth = srcTick.LineWidth;
  25. destTick.Size = srcTick.Size;
  26. destTick.TickMarkStyle = srcTick.TickMarkStyle;
  27. }
  28. public static void AssignAxisAppearance(Axis destAxis, Axis srcAxis)
  29. {
  30. destAxis.LineColor = srcAxis.LineColor;
  31. destAxis.LineDashStyle = srcAxis.LineDashStyle;
  32. destAxis.LineWidth = srcAxis.LineWidth;
  33. destAxis.LabelStyle.Font = srcAxis.LabelStyle.Font.Clone() as Font;
  34. destAxis.LabelStyle.ForeColor = srcAxis.LabelStyle.ForeColor;
  35. AssignGridAppearance(destAxis.MajorGrid, srcAxis.MajorGrid);
  36. AssignGridAppearance(destAxis.MinorGrid, srcAxis.MinorGrid);
  37. AssignTickMarkAppearance(destAxis.MajorTickMark, srcAxis.MajorTickMark);
  38. AssignTickMarkAppearance(destAxis.MinorTickMark, srcAxis.MinorTickMark);
  39. }
  40. public static void AssignChartAreaAppearance(ChartArea destArea, ChartArea srcArea)
  41. {
  42. AssignAxisAppearance(destArea.AxisX, srcArea.AxisX);
  43. AssignAxisAppearance(destArea.AxisX2, srcArea.AxisX2);
  44. AssignAxisAppearance(destArea.AxisY, srcArea.AxisY);
  45. AssignAxisAppearance(destArea.AxisY2, srcArea.AxisY2);
  46. destArea.BackColor = srcArea.BackColor;
  47. destArea.BackSecondaryColor = srcArea.BackSecondaryColor;
  48. destArea.BackGradientStyle = srcArea.BackGradientStyle;
  49. destArea.BackHatchStyle = srcArea.BackHatchStyle;
  50. destArea.BorderColor = srcArea.BorderColor;
  51. destArea.BorderDashStyle = srcArea.BorderDashStyle;
  52. destArea.BorderWidth = srcArea.BorderWidth;
  53. destArea.ShadowColor = srcArea.ShadowColor;
  54. destArea.ShadowOffset = srcArea.ShadowOffset;
  55. }
  56. private static void AssignLegendAppearance(Legend destLegend, Legend srcLegend)
  57. {
  58. destLegend.BackColor = srcLegend.BackColor;
  59. destLegend.BackSecondaryColor = srcLegend.BackSecondaryColor;
  60. destLegend.BackGradientStyle = srcLegend.BackGradientStyle;
  61. destLegend.BackHatchStyle = srcLegend.BackHatchStyle;
  62. destLegend.BorderColor = srcLegend.BorderColor;
  63. destLegend.BorderDashStyle = srcLegend.BorderDashStyle;
  64. destLegend.BorderWidth = srcLegend.BorderWidth;
  65. }
  66. public static void AssignChartAppearance(Chart destChart, Chart srcChart)
  67. {
  68. destChart.BackColor = srcChart.BackColor;
  69. destChart.BackSecondaryColor = srcChart.BackSecondaryColor;
  70. destChart.BackGradientStyle = srcChart.BackGradientStyle;
  71. destChart.BackHatchStyle = srcChart.BackHatchStyle;
  72. destChart.BorderSkin.SkinStyle = srcChart.BorderSkin.SkinStyle;
  73. destChart.BorderlineColor = srcChart.BorderlineColor;
  74. destChart.BorderlineDashStyle = srcChart.BorderlineDashStyle;
  75. destChart.BorderlineWidth = srcChart.BorderlineWidth;
  76. destChart.Palette = srcChart.Palette;
  77. if (srcChart.ChartAreas.Count > 0)
  78. {
  79. ChartArea srcChartDefaultArea = srcChart.ChartAreas[0];
  80. for (int i = 0; i < destChart.ChartAreas.Count; i++)
  81. {
  82. ChartArea srcChartArea = srcChartDefaultArea;
  83. if (i < srcChart.ChartAreas.Count)
  84. srcChartArea = srcChart.ChartAreas[i];
  85. AssignChartAreaAppearance(destChart.ChartAreas[i], srcChartArea);
  86. }
  87. }
  88. if (srcChart.Legends.Count > 0 && destChart.Legends.Count > 0)
  89. {
  90. AssignLegendAppearance(destChart.Legends[0], srcChart.Legends[0]);
  91. }
  92. }
  93. public static string[] GetYValuesNames(SeriesChartType chartType)
  94. {
  95. MyRes res = new MyRes("Forms,ChartEditor,SeriesEditorControl,Data,SeriesValues");
  96. switch (chartType)
  97. {
  98. case SeriesChartType.Stock:
  99. case SeriesChartType.Candlestick:
  100. return new string[] { res.Get("High"), res.Get("Low"), res.Get("Open"), res.Get("Close") };
  101. case SeriesChartType.Range:
  102. case SeriesChartType.RangeBar:
  103. case SeriesChartType.RangeColumn:
  104. case SeriesChartType.SplineRange:
  105. return new string[] { res.Get("RangeBegin"), res.Get("RangeEnd") };
  106. case SeriesChartType.Bubble:
  107. return new string[] { res.Get("YValue"), res.Get("Size") };
  108. case SeriesChartType.PointAndFigure:
  109. return new string[] { res.Get("YValue1"), res.Get("YValue2") };
  110. }
  111. return new string[] { res.Get("YValue") };
  112. }
  113. private static Control controlParent;
  114. private static Series editedSeries;
  115. private static EventHandler changeEventHandler;
  116. private static int top;
  117. private static float scaleFactor;
  118. private static void AddLabel(string text)
  119. {
  120. Label label = new Label();
  121. label.Parent = controlParent;
  122. label.Text = text;
  123. label.Location = new Point(16, top + 4);
  124. label.AutoSize = true;
  125. }
  126. private static void AddComboBox(string propertyName, bool isDropDownList, string values)
  127. {
  128. ComboBox comboBox = new ComboBox();
  129. comboBox.Parent = controlParent;
  130. comboBox.Location = new Point(128, top);
  131. comboBox.Size = new Size(172, 20);
  132. comboBox.Items.AddRange(values.Split(';'));
  133. comboBox.Items.Insert(0, Res.Get("Forms,ChartEditor,SeriesEditorControl,Appearance,Default"));
  134. comboBox.DropDownStyle = isDropDownList ? ComboBoxStyle.DropDownList : ComboBoxStyle.DropDown;
  135. comboBox.Tag = propertyName;
  136. string editedValue = editedSeries[propertyName];
  137. if (String.IsNullOrEmpty(editedValue))
  138. {
  139. comboBox.SelectedIndex = 0;
  140. }
  141. else
  142. {
  143. if (isDropDownList)
  144. comboBox.SelectedIndex = comboBox.Items.IndexOf(editedValue);
  145. else
  146. comboBox.Text = editedValue;
  147. }
  148. if (isDropDownList)
  149. comboBox.SelectedIndexChanged += new EventHandler(comboBox_SelectedIndexChanged);
  150. else
  151. comboBox.TextChanged += new EventHandler(comboBox_SelectedIndexChanged);
  152. top += 28;
  153. }
  154. private static void AddCheckBox(string propertyName, string text)
  155. {
  156. CheckBox checkBox = new CheckBox();
  157. checkBox.Parent = controlParent;
  158. checkBox.Location = new Point(16, top);
  159. checkBox.Tag = propertyName;
  160. checkBox.Text = text;
  161. checkBox.AutoSize = true;
  162. string editedValue = editedSeries[propertyName];
  163. checkBox.Checked = String.Compare(editedValue, "true", true) == 0;
  164. checkBox.CheckedChanged += new EventHandler(checkBox_CheckedChanged);
  165. top += 28;
  166. }
  167. private static void AddNumericUpDown(string propertyName, int minValue, int maxValue)
  168. {
  169. NumericUpDown upDown = new NumericUpDown();
  170. upDown.Parent = controlParent;
  171. upDown.Location = new Point(128, top);
  172. upDown.Size = new Size(60, 20);
  173. upDown.Tag = propertyName;
  174. upDown.Minimum = minValue;
  175. upDown.Maximum = maxValue;
  176. string editedValue = editedSeries[propertyName];
  177. upDown.Value = String.IsNullOrEmpty(editedValue) ?
  178. minValue : Math.Max(Math.Min(int.Parse(editedValue), maxValue), minValue);
  179. upDown.ValueChanged += new EventHandler(upDown_ValueChanged);
  180. top += 28;
  181. }
  182. private static void AddColorComboBox(string propertyName)
  183. {
  184. ColorComboBox comboBox = new ColorComboBox();
  185. comboBox.Parent = controlParent;
  186. comboBox.Location = new Point(128, top);
  187. comboBox.Size = new Size(172, 20);
  188. comboBox.Tag = propertyName;
  189. comboBox.ShowColorName = true;
  190. string editedValue = editedSeries[propertyName];
  191. if (!String.IsNullOrEmpty(editedValue))
  192. comboBox.Color = (Color)Converter.FromString(typeof(Color), editedValue);
  193. comboBox.ColorSelected += new EventHandler(comboBox_ColorSelected);
  194. top += 28;
  195. }
  196. private static void comboBox_SelectedIndexChanged(object sender, EventArgs e)
  197. {
  198. ComboBox comboBox = sender as ComboBox;
  199. string propertyName = comboBox.Tag.ToString();
  200. if (comboBox.DropDownStyle == ComboBoxStyle.DropDownList)
  201. {
  202. if (comboBox.SelectedIndex == 0)
  203. editedSeries.DeleteCustomProperty(propertyName);
  204. else
  205. editedSeries[propertyName] = comboBox.SelectedItem.ToString();
  206. }
  207. else
  208. {
  209. if (comboBox.Text == comboBox.Items[0].ToString())
  210. editedSeries.DeleteCustomProperty(propertyName);
  211. else
  212. editedSeries[propertyName] = comboBox.Text;
  213. }
  214. if (changeEventHandler != null)
  215. changeEventHandler(sender, e);
  216. }
  217. private static void checkBox_CheckedChanged(object sender, EventArgs e)
  218. {
  219. CheckBox checkBox = sender as CheckBox;
  220. string propertyName = checkBox.Tag.ToString();
  221. editedSeries[propertyName] = checkBox.Checked ? "true" : "false";
  222. if (changeEventHandler != null)
  223. changeEventHandler(sender, e);
  224. }
  225. private static void upDown_ValueChanged(object sender, EventArgs e)
  226. {
  227. NumericUpDown upDown = sender as NumericUpDown;
  228. string propertyName = upDown.Tag.ToString();
  229. editedSeries[propertyName] = upDown.Value.ToString();
  230. if (changeEventHandler != null)
  231. changeEventHandler(sender, e);
  232. }
  233. private static void comboBox_ColorSelected(object sender, EventArgs e)
  234. {
  235. ColorComboBox comboBox = sender as ColorComboBox;
  236. string propertyName = comboBox.Tag.ToString();
  237. if (comboBox.Color == Color.Transparent)
  238. editedSeries.DeleteCustomProperty(propertyName);
  239. else
  240. editedSeries[propertyName] = new ColorConverter().ConvertToString(null,
  241. CultureInfo.InvariantCulture, comboBox.Color);
  242. if (changeEventHandler != null)
  243. changeEventHandler(sender, e);
  244. }
  245. public static void ConstructCustomPropertiesEditor(Control parent, Series series,
  246. EventHandler changeEvent)
  247. {
  248. controlParent = parent;
  249. editedSeries = series;
  250. changeEventHandler = changeEvent;
  251. top = 16;
  252. while (parent.Controls.Count > 0)
  253. {
  254. parent.Controls[0].Dispose();
  255. }
  256. MyRes res = new MyRes("Forms,ChartEditor,SeriesEditorControl,Appearance");
  257. switch (series.ChartType)
  258. {
  259. case SeriesChartType.Bar:
  260. case SeriesChartType.StackedBar:
  261. case SeriesChartType.StackedBar100:
  262. case SeriesChartType.Column:
  263. case SeriesChartType.StackedColumn:
  264. case SeriesChartType.StackedColumn100:
  265. case SeriesChartType.RangeColumn:
  266. case SeriesChartType.RangeBar:
  267. AddLabel(res.Get("DrawingStyle"));
  268. AddComboBox("DrawingStyle", true, "Emboss;Cylinder;Wedge;LightToDark");
  269. AddLabel(res.Get("PointWidth"));
  270. AddComboBox("PointWidth", false, "0.4;0.6;0.8;1.0");
  271. if (series.ChartType == SeriesChartType.Bar ||
  272. series.ChartType == SeriesChartType.StackedBar ||
  273. series.ChartType == SeriesChartType.StackedBar100 ||
  274. series.ChartType == SeriesChartType.RangeBar)
  275. {
  276. AddLabel(res.Get("LabelsStyle"));
  277. AddComboBox("BarLabelStyle", true, "Left;Right;Center;Outside");
  278. }
  279. if (series.ChartType == SeriesChartType.RangeColumn)
  280. AddCheckBox("DrawSideBySide", res.Get("DrawSideBySide"));
  281. break;
  282. case SeriesChartType.Area:
  283. case SeriesChartType.StackedArea:
  284. case SeriesChartType.StackedArea100:
  285. AddCheckBox("ShowMarkerLines", res.Get("ShowMarkerLines"));
  286. break;
  287. case SeriesChartType.Pie:
  288. case SeriesChartType.Doughnut:
  289. if (series.ChartType == SeriesChartType.Doughnut)
  290. {
  291. AddLabel(res.Get("DoughnutRadius"));
  292. AddNumericUpDown("DoughnutRadius", 0, 99);
  293. }
  294. AddLabel(res.Get("LabelsStyle"));
  295. AddComboBox("PieLabelStyle", true, "Inside;Outside;Disabled");
  296. AddLabel(Res.Get("Forms,ChartEditor,Common,LineColor"));
  297. AddColorComboBox("PieLineColor");
  298. AddLabel(res.Get("DrawingStyle"));
  299. AddComboBox("PieDrawingStyle", true, "SoftEdge;Concave");
  300. break;
  301. case SeriesChartType.Polar:
  302. case SeriesChartType.Radar:
  303. AddLabel(res.Get("DrawingStyle"));
  304. if (series.ChartType == SeriesChartType.Polar)
  305. AddComboBox("PolarDrawingStyle", true, "Marker;Line");
  306. else
  307. AddComboBox("RadarDrawingStyle", true, "Area;Marker;Line");
  308. AddLabel(res.Get("AreaDrawingStyle"));
  309. AddComboBox("AreaDrawingStyle", true, "Circle;Polygon");
  310. AddLabel(res.Get("LabelsStyle"));
  311. AddComboBox("CircularLabelsStyle", true, "Horizontal;Circular;Radial");
  312. break;
  313. case SeriesChartType.Stock:
  314. case SeriesChartType.Candlestick:
  315. AddLabel(res.Get("Markers"));
  316. AddComboBox("ShowOpenClose", true, "Open;Close;Both");
  317. break;
  318. case SeriesChartType.Kagi:
  319. case SeriesChartType.Renko:
  320. case SeriesChartType.PointAndFigure:
  321. case SeriesChartType.ThreeLineBreak:
  322. AddLabel(res.Get("PriceUpColor"));
  323. AddColorComboBox("PriceUpColor");
  324. if (series.ChartType == SeriesChartType.Kagi ||
  325. series.ChartType == SeriesChartType.PointAndFigure)
  326. {
  327. AddLabel(res.Get("ReversalAmount"));
  328. AddComboBox("ReversalAmount", false, "0.6;0.8;1;1.2;1%;2%;4%");
  329. }
  330. if (series.ChartType == SeriesChartType.Renko ||
  331. series.ChartType == SeriesChartType.PointAndFigure)
  332. {
  333. AddLabel(res.Get("BoxSize"));
  334. AddComboBox("BoxSize", false, "0.2;0.5;0.8;1;1.5;2");
  335. }
  336. if (series.ChartType == SeriesChartType.ThreeLineBreak)
  337. {
  338. AddLabel(res.Get("NumberOfLinesInBreak"));
  339. AddComboBox("NumberOfLinesInBreak", false, "1;2;3;4");
  340. }
  341. break;
  342. case SeriesChartType.Pyramid:
  343. AddLabel(res.Get("LabelsStyle"));
  344. AddComboBox("PyramidLabelStyle", true, "OutsideInColumn;Outside;Inside;Disabled");
  345. AddLabel(res.Get("LabelsPlacement"));
  346. AddComboBox("PyramidOutsideLabelPlacement", true, "Left;Right");
  347. AddLabel(res.Get("PointsGap"));
  348. AddNumericUpDown("PyramidPointGap", 0, 1000);
  349. AddLabel(res.Get("MinPointHeight"));
  350. AddNumericUpDown("PyramidMinPointHeight", 0, 1000);
  351. AddLabel(res.Get("ValueType"));
  352. AddComboBox("PyramidValueType", true, "Linear;Surface");
  353. AddLabel(res.Get("ThreeDDrawingStyle"));
  354. AddComboBox("Pyramid3DDrawingStyle", true, "CircularBase;SquareBase");
  355. AddLabel(res.Get("ThreeDRotation"));
  356. AddNumericUpDown("Pyramid3DRotationAngle", -10, 10);
  357. break;
  358. case SeriesChartType.Funnel:
  359. AddLabel(res.Get("FunnelStyle"));
  360. AddComboBox("FunnelStyle", true, "YIsHeight;YIsWidth");
  361. AddLabel(res.Get("LabelsStyle"));
  362. AddComboBox("FunnelLabelStyle", true, "OutsideInColumn;Outside;Inside;Disabled");
  363. AddLabel(res.Get("LabelsPlacement"));
  364. AddComboBox("FunnelOutsideLabelPlacement", true, "Left;Right");
  365. AddLabel(res.Get("PointsGap"));
  366. AddNumericUpDown("FunnelPointGap", 0, 1000);
  367. AddLabel(res.Get("MinPointHeight"));
  368. AddNumericUpDown("FunnelMinPointHeight", 0, 1000);
  369. AddLabel(res.Get("ThreeDDrawingStyle"));
  370. AddComboBox("Funnel3DDrawingStyle", true, "CircularBase;SquareBase");
  371. AddLabel(res.Get("ThreeDRotation"));
  372. AddNumericUpDown("Funnel3DRotationAngle", -10, 10);
  373. break;
  374. case SeriesChartType.Spline:
  375. case SeriesChartType.SplineRange:
  376. case SeriesChartType.SplineArea:
  377. AddLabel(res.Get("LineTension"));
  378. AddComboBox("LineTension", false, "0.2;0.4;0.8;1.2");
  379. if (series.ChartType == SeriesChartType.SplineArea)
  380. AddCheckBox("ShowMarkerLines", res.Get("ShowMarkerLines"));
  381. break;
  382. default:
  383. AddLabel(res.Get("NoSettings"));
  384. break;
  385. }
  386. parent.Scale(new SizeF(scaleFactor, scaleFactor));
  387. }
  388. static Helper()
  389. {
  390. using (Bitmap bmp = new Bitmap(1, 1))
  391. using (Graphics g = Graphics.FromImage(bmp))
  392. {
  393. scaleFactor = g.DpiX / 96f;
  394. }
  395. }
  396. }
  397. }