Helper.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  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 void AddLabel(string text)
  118. {
  119. Label label = new Label();
  120. label.Parent = controlParent;
  121. label.Text = text;
  122. label.Location = new Point(16, top + 4);
  123. label.AutoSize = true;
  124. }
  125. private static void AddComboBox(string propertyName, bool isDropDownList, string values)
  126. {
  127. ComboBox comboBox = new ComboBox();
  128. comboBox.Parent = controlParent;
  129. comboBox.Location = new Point(128, top);
  130. comboBox.Size = new Size(172, 20);
  131. comboBox.Items.AddRange(values.Split(';'));
  132. comboBox.Items.Insert(0, Res.Get("Forms,ChartEditor,SeriesEditorControl,Appearance,Default"));
  133. comboBox.DropDownStyle = isDropDownList ? ComboBoxStyle.DropDownList : ComboBoxStyle.DropDown;
  134. comboBox.Tag = propertyName;
  135. string editedValue = editedSeries[propertyName];
  136. if (String.IsNullOrEmpty(editedValue))
  137. {
  138. comboBox.SelectedIndex = 0;
  139. }
  140. else
  141. {
  142. if (isDropDownList)
  143. comboBox.SelectedIndex = comboBox.Items.IndexOf(editedValue);
  144. else
  145. comboBox.Text = editedValue;
  146. }
  147. if (isDropDownList)
  148. comboBox.SelectedIndexChanged += new EventHandler(comboBox_SelectedIndexChanged);
  149. else
  150. comboBox.TextChanged += new EventHandler(comboBox_SelectedIndexChanged);
  151. top += 28;
  152. }
  153. private static void AddCheckBox(string propertyName, string text)
  154. {
  155. CheckBox checkBox = new CheckBox();
  156. checkBox.Parent = controlParent;
  157. checkBox.Location = new Point(16, top);
  158. checkBox.Tag = propertyName;
  159. checkBox.Text = text;
  160. checkBox.AutoSize = true;
  161. string editedValue = editedSeries[propertyName];
  162. checkBox.Checked = String.Compare(editedValue, "true", true) == 0;
  163. checkBox.CheckedChanged += new EventHandler(checkBox_CheckedChanged);
  164. top += 28;
  165. }
  166. private static void AddNumericUpDown(string propertyName, int minValue, int maxValue)
  167. {
  168. NumericUpDown upDown = new NumericUpDown();
  169. upDown.Parent = controlParent;
  170. upDown.Location = new Point(128, top);
  171. upDown.Size = new Size(60, 20);
  172. upDown.Tag = propertyName;
  173. upDown.Minimum = minValue;
  174. upDown.Maximum = maxValue;
  175. string editedValue = editedSeries[propertyName];
  176. upDown.Value = String.IsNullOrEmpty(editedValue) ?
  177. minValue : Math.Max(Math.Min(int.Parse(editedValue), maxValue), minValue);
  178. upDown.ValueChanged += new EventHandler(upDown_ValueChanged);
  179. top += 28;
  180. }
  181. private static void AddColorComboBox(string propertyName)
  182. {
  183. ColorComboBox comboBox = new ColorComboBox();
  184. comboBox.Parent = controlParent;
  185. comboBox.Location = new Point(128, top);
  186. comboBox.Size = new Size(172, 20);
  187. comboBox.Tag = propertyName;
  188. comboBox.ShowColorName = true;
  189. string editedValue = editedSeries[propertyName];
  190. if (!String.IsNullOrEmpty(editedValue))
  191. comboBox.Color = (Color)Converter.FromString(typeof(Color), editedValue);
  192. comboBox.ColorSelected += new EventHandler(comboBox_ColorSelected);
  193. top += 28;
  194. }
  195. private static void comboBox_SelectedIndexChanged(object sender, EventArgs e)
  196. {
  197. ComboBox comboBox = sender as ComboBox;
  198. string propertyName = comboBox.Tag.ToString();
  199. if (comboBox.DropDownStyle == ComboBoxStyle.DropDownList)
  200. {
  201. if (comboBox.SelectedIndex == 0)
  202. editedSeries.DeleteCustomProperty(propertyName);
  203. else
  204. editedSeries[propertyName] = comboBox.SelectedItem.ToString();
  205. }
  206. else
  207. {
  208. if (comboBox.Text == comboBox.Items[0].ToString())
  209. editedSeries.DeleteCustomProperty(propertyName);
  210. else
  211. editedSeries[propertyName] = comboBox.Text;
  212. }
  213. if (changeEventHandler != null)
  214. changeEventHandler(sender, e);
  215. }
  216. private static void checkBox_CheckedChanged(object sender, EventArgs e)
  217. {
  218. CheckBox checkBox = sender as CheckBox;
  219. string propertyName = checkBox.Tag.ToString();
  220. editedSeries[propertyName] = checkBox.Checked ? "true" : "false";
  221. if (changeEventHandler != null)
  222. changeEventHandler(sender, e);
  223. }
  224. private static void upDown_ValueChanged(object sender, EventArgs e)
  225. {
  226. NumericUpDown upDown = sender as NumericUpDown;
  227. string propertyName = upDown.Tag.ToString();
  228. editedSeries[propertyName] = upDown.Value.ToString();
  229. if (changeEventHandler != null)
  230. changeEventHandler(sender, e);
  231. }
  232. private static void comboBox_ColorSelected(object sender, EventArgs e)
  233. {
  234. ColorComboBox comboBox = sender as ColorComboBox;
  235. string propertyName = comboBox.Tag.ToString();
  236. if (comboBox.Color == Color.Transparent)
  237. editedSeries.DeleteCustomProperty(propertyName);
  238. else
  239. editedSeries[propertyName] = new ColorConverter().ConvertToString(null,
  240. CultureInfo.InvariantCulture, comboBox.Color.ToArgb());
  241. if (changeEventHandler != null)
  242. changeEventHandler(sender, e);
  243. }
  244. public static void ConstructCustomPropertiesEditor(Control parent, Series series, EventHandler changeEvent)
  245. {
  246. parent.Controls.Clear();
  247. controlParent = new Panel();
  248. controlParent.Dock = DockStyle.Fill;
  249. editedSeries = series;
  250. changeEventHandler = changeEvent;
  251. top = 16;
  252. MyRes res = new MyRes("Forms,ChartEditor,SeriesEditorControl,Appearance");
  253. switch (series.ChartType)
  254. {
  255. case SeriesChartType.Bar:
  256. case SeriesChartType.StackedBar:
  257. case SeriesChartType.StackedBar100:
  258. case SeriesChartType.Column:
  259. case SeriesChartType.StackedColumn:
  260. case SeriesChartType.StackedColumn100:
  261. case SeriesChartType.RangeColumn:
  262. case SeriesChartType.RangeBar:
  263. AddLabel(res.Get("DrawingStyle"));
  264. AddComboBox("DrawingStyle", true, "Emboss;Cylinder;Wedge;LightToDark");
  265. AddLabel(res.Get("PointWidth"));
  266. AddComboBox("PointWidth", false, "0.4;0.6;0.8;1.0");
  267. if (series.ChartType == SeriesChartType.Bar ||
  268. series.ChartType == SeriesChartType.StackedBar ||
  269. series.ChartType == SeriesChartType.StackedBar100 ||
  270. series.ChartType == SeriesChartType.RangeBar)
  271. {
  272. AddLabel(res.Get("LabelsStyle"));
  273. AddComboBox("BarLabelStyle", true, "Left;Right;Center;Outside");
  274. }
  275. if (series.ChartType == SeriesChartType.RangeColumn)
  276. AddCheckBox("DrawSideBySide", res.Get("DrawSideBySide"));
  277. break;
  278. case SeriesChartType.Area:
  279. case SeriesChartType.StackedArea:
  280. case SeriesChartType.StackedArea100:
  281. AddCheckBox("ShowMarkerLines", res.Get("ShowMarkerLines"));
  282. break;
  283. case SeriesChartType.Pie:
  284. case SeriesChartType.Doughnut:
  285. if (series.ChartType == SeriesChartType.Doughnut)
  286. {
  287. AddLabel(res.Get("DoughnutRadius"));
  288. AddNumericUpDown("DoughnutRadius", 0, 99);
  289. }
  290. AddLabel(res.Get("LabelsStyle"));
  291. AddComboBox("PieLabelStyle", true, "Inside;Outside;Disabled");
  292. AddLabel(Res.Get("Forms,ChartEditor,Common,LineColor"));
  293. AddColorComboBox("PieLineColor");
  294. AddLabel(res.Get("DrawingStyle"));
  295. AddComboBox("PieDrawingStyle", true, "SoftEdge;Concave");
  296. break;
  297. case SeriesChartType.Polar:
  298. case SeriesChartType.Radar:
  299. AddLabel(res.Get("DrawingStyle"));
  300. if (series.ChartType == SeriesChartType.Polar)
  301. AddComboBox("PolarDrawingStyle", true, "Marker;Line");
  302. else
  303. AddComboBox("RadarDrawingStyle", true, "Area;Marker;Line");
  304. AddLabel(res.Get("AreaDrawingStyle"));
  305. AddComboBox("AreaDrawingStyle", true, "Circle;Polygon");
  306. AddLabel(res.Get("LabelsStyle"));
  307. AddComboBox("CircularLabelsStyle", true, "Horizontal;Circular;Radial");
  308. break;
  309. case SeriesChartType.Stock:
  310. case SeriesChartType.Candlestick:
  311. AddLabel(res.Get("Markers"));
  312. AddComboBox("ShowOpenClose", true, "Open;Close;Both");
  313. break;
  314. case SeriesChartType.Kagi:
  315. case SeriesChartType.Renko:
  316. case SeriesChartType.PointAndFigure:
  317. case SeriesChartType.ThreeLineBreak:
  318. AddLabel(res.Get("PriceUpColor"));
  319. AddColorComboBox("PriceUpColor");
  320. if (series.ChartType == SeriesChartType.Kagi ||
  321. series.ChartType == SeriesChartType.PointAndFigure)
  322. {
  323. AddLabel(res.Get("ReversalAmount"));
  324. AddComboBox("ReversalAmount", false, "0.6;0.8;1;1.2;1%;2%;4%");
  325. }
  326. if (series.ChartType == SeriesChartType.Renko ||
  327. series.ChartType == SeriesChartType.PointAndFigure)
  328. {
  329. AddLabel(res.Get("BoxSize"));
  330. AddComboBox("BoxSize", false, "0.2;0.5;0.8;1;1.5;2");
  331. }
  332. if (series.ChartType == SeriesChartType.ThreeLineBreak)
  333. {
  334. AddLabel(res.Get("NumberOfLinesInBreak"));
  335. AddComboBox("NumberOfLinesInBreak", false, "1;2;3;4");
  336. }
  337. break;
  338. case SeriesChartType.Pyramid:
  339. AddLabel(res.Get("LabelsStyle"));
  340. AddComboBox("PyramidLabelStyle", true, "OutsideInColumn;Outside;Inside;Disabled");
  341. AddLabel(res.Get("LabelsPlacement"));
  342. AddComboBox("PyramidOutsideLabelPlacement", true, "Left;Right");
  343. AddLabel(res.Get("PointsGap"));
  344. AddNumericUpDown("PyramidPointGap", 0, 1000);
  345. AddLabel(res.Get("MinPointHeight"));
  346. AddNumericUpDown("PyramidMinPointHeight", 0, 1000);
  347. AddLabel(res.Get("ValueType"));
  348. AddComboBox("PyramidValueType", true, "Linear;Surface");
  349. AddLabel(res.Get("ThreeDDrawingStyle"));
  350. AddComboBox("Pyramid3DDrawingStyle", true, "CircularBase;SquareBase");
  351. AddLabel(res.Get("ThreeDRotation"));
  352. AddNumericUpDown("Pyramid3DRotationAngle", -10, 10);
  353. break;
  354. case SeriesChartType.Funnel:
  355. AddLabel(res.Get("FunnelStyle"));
  356. AddComboBox("FunnelStyle", true, "YIsHeight;YIsWidth");
  357. AddLabel(res.Get("LabelsStyle"));
  358. AddComboBox("FunnelLabelStyle", true, "OutsideInColumn;Outside;Inside;Disabled");
  359. AddLabel(res.Get("LabelsPlacement"));
  360. AddComboBox("FunnelOutsideLabelPlacement", true, "Left;Right");
  361. AddLabel(res.Get("PointsGap"));
  362. AddNumericUpDown("FunnelPointGap", 0, 1000);
  363. AddLabel(res.Get("MinPointHeight"));
  364. AddNumericUpDown("FunnelMinPointHeight", 0, 1000);
  365. AddLabel(res.Get("ThreeDDrawingStyle"));
  366. AddComboBox("Funnel3DDrawingStyle", true, "CircularBase;SquareBase");
  367. AddLabel(res.Get("ThreeDRotation"));
  368. AddNumericUpDown("Funnel3DRotationAngle", -10, 10);
  369. break;
  370. case SeriesChartType.Spline:
  371. case SeriesChartType.SplineRange:
  372. case SeriesChartType.SplineArea:
  373. AddLabel(res.Get("LineTension"));
  374. AddComboBox("LineTension", false, "0.2;0.4;0.8;1.2");
  375. if (series.ChartType == SeriesChartType.SplineArea)
  376. AddCheckBox("ShowMarkerLines", res.Get("ShowMarkerLines"));
  377. break;
  378. default:
  379. AddLabel(res.Get("NoSettings"));
  380. break;
  381. }
  382. controlParent.Parent = parent;
  383. controlParent.Scale(new SizeF(parent.DpiMultiplier(), parent.DpiMultiplier()));
  384. }
  385. }
  386. }