CsvConnectionEditor.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. using System;
  2. using System.Data;
  3. using System.Text;
  4. using System.Windows.Forms;
  5. using FastReport.Utils;
  6. using System.Globalization;
  7. using System.Collections.Generic;
  8. namespace FastReport.Data.ConnectionEditors
  9. {
  10. internal partial class CsvConnectionEditor : ConnectionEditorBase
  11. {
  12. #region Constants
  13. private const int NUMBER_OF_PREVIEW_STRINGS = 7;
  14. #endregion Constants
  15. #region Fields
  16. private Encoding encoding;
  17. private string separator;
  18. private bool updating;
  19. #endregion Fields
  20. #region Constructors
  21. public CsvConnectionEditor()
  22. {
  23. updating = true;
  24. InitializeComponent();
  25. Localize();
  26. InitCodepagesList();
  27. InitSeparatorsList();
  28. InitCultures();
  29. encoding = Encoding.Default;
  30. separator = ";";
  31. updating = false;
  32. }
  33. #endregion Constructors
  34. #region Private Methods
  35. private void InitCodepagesList()
  36. {
  37. MyRes res = new MyRes("ConnectionEditors,Csv,Codepages");
  38. cbxCodepage.Items.Add(res.Get("Default"));
  39. cbxCodepage.Items.Add(res.Get("ASCII"));
  40. cbxCodepage.Items.Add(res.Get("UTF8"));
  41. cbxCodepage.Items.Add(res.Get("UTF7"));
  42. cbxCodepage.Items.Add(res.Get("UTF32"));
  43. cbxCodepage.Items.Add(res.Get("Unicode"));
  44. cbxCodepage.Items.Add(res.Get("BigEndianUnicode"));
  45. cbxCodepage.SelectedIndex = 0;
  46. }
  47. private void InitSeparatorsList()
  48. {
  49. MyRes res = new MyRes("ConnectionEditors,Csv,Separators");
  50. cbxSeparator.Items.Add(res.Get("Semicolon"));
  51. cbxSeparator.Items.Add(res.Get("Comma"));
  52. cbxSeparator.Items.Add(res.Get("Space"));
  53. cbxSeparator.Items.Add(res.Get("Tab"));
  54. cbxSeparator.Items.Add(res.Get("Other"));
  55. cbxSeparator.SelectedIndex = 0;
  56. }
  57. private void InitCultures()
  58. {
  59. SortedList<string, CultureInfo> cultures = new SortedList<string, CultureInfo>();
  60. foreach (CultureInfo info in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
  61. {
  62. if (!cultures.ContainsKey(info.DisplayName))
  63. cultures.Add(info.DisplayName, info);
  64. }
  65. List<string> locales = new List<string>();
  66. locales.Add(CultureInfo.CurrentCulture.Name);
  67. locales.Add("en-US");
  68. foreach (CultureInfo info in cultures.Values)
  69. {
  70. locales.Add(info.Name);
  71. }
  72. cbxNumberFormat.Items.AddRange(locales.ToArray());
  73. cbxCurrencyFormat.Items.AddRange(locales.ToArray());
  74. cbxDateTimeFormat.Items.AddRange(locales.ToArray());
  75. }
  76. private int GetSelectedIndexByEncoding(Encoding encoding)
  77. {
  78. if (encoding == Encoding.Default)
  79. {
  80. return 0;
  81. }
  82. else if (encoding == Encoding.ASCII)
  83. {
  84. return 1;
  85. }
  86. else if (encoding == Encoding.UTF8)
  87. {
  88. return 2;
  89. }
  90. else if (encoding == Encoding.UTF7)
  91. {
  92. return 3;
  93. }
  94. else if (encoding == Encoding.UTF32)
  95. {
  96. return 4;
  97. }
  98. else if (encoding == Encoding.Unicode)
  99. {
  100. return 5;
  101. }
  102. else if (encoding == Encoding.BigEndianUnicode)
  103. {
  104. return 6;
  105. }
  106. return 0;
  107. }
  108. private Encoding GetEncodingBySelectedIndex(int index)
  109. {
  110. Encoding encoding = Encoding.Default;
  111. switch (index)
  112. {
  113. case 0:
  114. encoding = Encoding.Default;
  115. break;
  116. case 1:
  117. encoding = Encoding.ASCII;
  118. break;
  119. case 2:
  120. encoding = Encoding.UTF8;
  121. break;
  122. case 3:
  123. encoding = Encoding.UTF7;
  124. break;
  125. case 4:
  126. encoding = Encoding.UTF32;
  127. break;
  128. case 5:
  129. encoding = Encoding.Unicode;
  130. break;
  131. case 6:
  132. encoding = Encoding.BigEndianUnicode;
  133. break;
  134. default:
  135. encoding = Encoding.Default;
  136. break;
  137. }
  138. return encoding;
  139. }
  140. private void SetSeparator(string separator)
  141. {
  142. this.separator = separator;
  143. int index = 4;
  144. switch (separator)
  145. {
  146. case ";":
  147. index = 0;
  148. break;
  149. case ",":
  150. index = 1;
  151. break;
  152. case " ":
  153. index = 2;
  154. break;
  155. case "\t":
  156. index = 3;
  157. break;
  158. }
  159. cbxSeparator.SelectedIndex = index;
  160. if (index == 4)
  161. {
  162. tbSeparator.Enabled = true;
  163. tbSeparator.Text = separator;
  164. }
  165. }
  166. private void Localize()
  167. {
  168. MyRes res = new MyRes("ConnectionEditors,Csv");
  169. gbSelectDatabase.Text = res.Get("ConfigureDatabase");
  170. labelSelectCsvFile.Text = res.Get("SelectFile");
  171. labelCodepage.Text = res.Get("Codepage");
  172. labelSeparator.Text = res.Get("Separator");
  173. cbxFieldNames.Text = res.Get("FieldNames");
  174. cbxRemoveQuotes.Text = res.Get("RemoveQuotes");
  175. cbxTryConvertTypes.Text = res.Get("ConvertTypes");
  176. lblNumberFormat.Text = res.Get("NumberFormat");
  177. lblCurrencyFormat.Text = res.Get("CurrencyFormat");
  178. lblDateTimeFormat.Text = res.Get("DateTimeFormat");
  179. tabFilePreview.Text = res.Get("FilePreview");
  180. tabDataPreview.Text = res.Get("DataPreview");
  181. }
  182. public override void UpdateDpiDependencies()
  183. {
  184. base.UpdateDpiDependencies();
  185. tbCsvFile.Image = this.GetImage(1);
  186. int width = this.LogicalToDevice(400);
  187. cbxNumberFormat.DropDownWidth = width;
  188. cbxCurrencyFormat.DropDownWidth = width;
  189. cbxDateTimeFormat.DropDownWidth = width;
  190. }
  191. private void LoadPreview()
  192. {
  193. if (updating)
  194. return;
  195. CsvConnectionStringBuilder builder = new CsvConnectionStringBuilder(GetConnectionString());
  196. List<string> rawLines = CsvUtils.ReadLines(builder, NUMBER_OF_PREVIEW_STRINGS);
  197. DataTable table = CsvUtils.CreateDataTable(builder, rawLines);
  198. if (table != null)
  199. {
  200. for (int i = 0; i < table.Columns.Count; i++)
  201. {
  202. table.Columns[i].ColumnName += " (" + table.Columns[i].DataType.Name + ")";
  203. }
  204. tbFilePreview.Lines = rawLines.ToArray();
  205. dgvTablePreview.AutoGenerateColumns = true;
  206. dgvTablePreview.DataSource = table;
  207. dgvTablePreview.Update();
  208. }
  209. }
  210. #endregion Private Methods
  211. #region Protected Methods
  212. protected override string GetConnectionString()
  213. {
  214. CsvConnectionStringBuilder builder = new CsvConnectionStringBuilder();
  215. builder.CsvFile = tbCsvFile.Text;
  216. builder.Codepage = GetEncodingBySelectedIndex(cbxCodepage.SelectedIndex).CodePage;
  217. builder.Separator = separator;
  218. builder.FieldNamesInFirstString = cbxFieldNames.Checked;
  219. builder.RemoveQuotationMarks = cbxRemoveQuotes.Checked;
  220. builder.ConvertFieldTypes = cbxTryConvertTypes.Checked;
  221. builder.NumberFormat = cbxNumberFormat.SelectedItem.ToString();
  222. builder.CurrencyFormat = cbxCurrencyFormat.SelectedItem.ToString();
  223. builder.DateTimeFormat = cbxDateTimeFormat.SelectedItem.ToString();
  224. return builder.ToString();
  225. }
  226. protected override void SetConnectionString(string value)
  227. {
  228. updating = true;
  229. CsvConnectionStringBuilder builder = new CsvConnectionStringBuilder(value);
  230. tbCsvFile.Text = builder.CsvFile;
  231. cbxCodepage.SelectedIndex = GetSelectedIndexByEncoding(Encoding.GetEncoding(builder.Codepage));
  232. SetSeparator(builder.Separator);
  233. cbxFieldNames.Checked = builder.FieldNamesInFirstString;
  234. cbxRemoveQuotes.Checked = builder.RemoveQuotationMarks;
  235. cbxTryConvertTypes.Checked = builder.ConvertFieldTypes;
  236. cbxNumberFormat.SelectedItem = builder.NumberFormat;
  237. cbxCurrencyFormat.SelectedItem = builder.CurrencyFormat;
  238. cbxDateTimeFormat.SelectedItem = builder.DateTimeFormat;
  239. updating = false;
  240. LoadPreview();
  241. }
  242. #endregion Protected Methods
  243. #region Events Handlers
  244. private void tbCsvFile_ButtonClick(object sender, EventArgs e)
  245. {
  246. using (OpenFileDialog dialog = new OpenFileDialog())
  247. {
  248. dialog.Filter = Res.Get("FileFilters,CsvFile") + "|" + Res.Get("FileFilters,TxtFile") + "|" + Res.Get("FileFilters,AllFiles");
  249. if (dialog.ShowDialog() == DialogResult.OK)
  250. {
  251. tbCsvFile.Text = dialog.FileName;
  252. LoadPreview();
  253. }
  254. }
  255. }
  256. private void cbxEncoding_SelectedIndexChanged(object sender, EventArgs e)
  257. {
  258. encoding = GetEncodingBySelectedIndex(cbxCodepage.SelectedIndex);
  259. LoadPreview();
  260. }
  261. private void cbxSeparator_SelectedIndexChanged(object sender, EventArgs e)
  262. {
  263. if (updating)
  264. return;
  265. if (cbxSeparator.SelectedIndex == cbxSeparator.Items.Count - 1)
  266. {
  267. tbSeparator.Enabled = true;
  268. separator = tbSeparator.Text;
  269. }
  270. else
  271. {
  272. tbSeparator.Enabled = false;
  273. switch (cbxSeparator.SelectedIndex)
  274. {
  275. case 0:
  276. separator = ";";
  277. break;
  278. case 1:
  279. separator = ",";
  280. break;
  281. case 2:
  282. separator = " ";
  283. break;
  284. case 3:
  285. separator = "\t";
  286. break;
  287. default:
  288. separator = ";";
  289. break;
  290. }
  291. }
  292. LoadPreview();
  293. }
  294. private void tbSeparator_TextChanged(object sender, EventArgs e)
  295. {
  296. if (updating)
  297. return;
  298. if (cbxSeparator.SelectedIndex == cbxSeparator.Items.Count - 1)
  299. {
  300. separator = tbSeparator.Text;
  301. LoadPreview();
  302. }
  303. }
  304. private void cbxFieldNames_CheckedChanged(object sender, EventArgs e)
  305. {
  306. LoadPreview();
  307. }
  308. private void cbxRemoveQuotes_CheckedChanged(object sender, EventArgs e)
  309. {
  310. LoadPreview();
  311. }
  312. private void cbxTryConvertTypes_CheckedChanged(object sender, EventArgs e)
  313. {
  314. LoadPreview();
  315. }
  316. private void cbxNumberLocale_SelectedIndexChanged(object sender, EventArgs e)
  317. {
  318. LoadPreview();
  319. }
  320. private CultureInfo cbxFormatDrawItem(object sender, DrawItemEventArgs e)
  321. {
  322. e.DrawBackground();
  323. if (e.Index == -1)
  324. return null;
  325. bool isDropDown = (e.State & DrawItemState.ComboBoxEdit) == 0;
  326. string text = (string)((sender as ComboBox).Items[e.Index]);
  327. CultureInfo culture = CultureInfo.GetCultureInfo(text);
  328. text = e.Index == 0 ? Res.Get("ConnectionEditors,Csv,Codepages,Default") : (isDropDown ? culture.DisplayName : text);
  329. TextRenderer.DrawText(e.Graphics, text, Font, e.Bounds.Location, e.ForeColor);
  330. if (e.Index == 2)
  331. e.Graphics.DrawLine(System.Drawing.Pens.Black, e.Bounds.X, e.Bounds.Y, e.Bounds.Right, e.Bounds.Y);
  332. if (isDropDown)
  333. return culture;
  334. return null;
  335. }
  336. private void cbxNumberFormat_DrawItem(object sender, DrawItemEventArgs e)
  337. {
  338. CultureInfo culture = cbxFormatDrawItem(sender, e);
  339. if (culture != null)
  340. TextRenderer.DrawText(e.Graphics, String.Format(culture.NumberFormat, "{0:n}", -1234.56f), Font, e.Bounds, e.ForeColor, TextFormatFlags.Right);
  341. }
  342. private void cbxCurrencyFormat_DrawItem(object sender, DrawItemEventArgs e)
  343. {
  344. CultureInfo culture = cbxFormatDrawItem(sender, e);
  345. if (culture != null)
  346. TextRenderer.DrawText(e.Graphics, String.Format(culture.NumberFormat, "{0:c}", -1234.56f), Font, e.Bounds, e.ForeColor, TextFormatFlags.Right);
  347. }
  348. private void cbxDateTimeFormat_DrawItem(object sender, DrawItemEventArgs e)
  349. {
  350. CultureInfo culture = cbxFormatDrawItem(sender, e);
  351. if (culture != null)
  352. TextRenderer.DrawText(e.Graphics, String.Format(culture.DateTimeFormat, "{0:d}", new DateTime(2007, 11, 30)), Font, e.Bounds, e.ForeColor, TextFormatFlags.Right);
  353. }
  354. #endregion Events Handlers
  355. }
  356. }