QueryDesigner.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5. using FastReport.Forms;
  6. using FastReport.Utils;
  7. namespace FastReport.FastQueryBuilder
  8. {
  9. internal partial class QueryDesigner : BaseForm, IQueryDesigner
  10. {
  11. private Rectangle dragBoxFromMouseDown;
  12. private Point screenOffset;
  13. private PosCounter posC = new PosCounter(10, 10);
  14. private List<Link> links;
  15. private List<Field> groupedFields;
  16. private int tabPrevIndex;
  17. private List<TableView> tablesViews = new List<TableView>();
  18. private BindingSource biSourceQuery = new BindingSource();
  19. private BindingSource biSourceGrouped = new BindingSource();
  20. private BindingSource biSourceLinks = new BindingSource();
  21. public QueryDesigner()
  22. {
  23. InitializeComponent();
  24. tabControl1.SelectedIndex = 0;
  25. posC.maxX = ClientRectangle.Width;
  26. posC.maxY = ClientRectangle.Height;
  27. MyRes res = new MyRes("Forms,QueryBuilder");
  28. Text = res.Get("");
  29. toolStripButton5.ToolTipText = Res.Get("Buttons,OK");
  30. toolStripButton6.ToolTipText = Res.Get("Buttons,Cancel");
  31. tabPage1.Text = res.Get("Designer");
  32. tabPage2.Text = res.Get("Sql");
  33. tabPage3.Text = res.Get("Result");
  34. tabPage4.Text = res.Get("Select");
  35. tabPage5.Text = res.Get("Joins");
  36. tabPage6.Text = res.Get("Group");
  37. dataGridView1.AutoGenerateColumns = false;
  38. dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
  39. dataGridView1.Columns[0].HeaderText = res.Get("Name");
  40. dataGridView1.Columns[0].DataPropertyName = "Name";
  41. dataGridView1.Columns[0].ReadOnly = true;
  42. dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
  43. dataGridView1.Columns[1].HeaderText = res.Get("Alias");
  44. dataGridView1.Columns[1].DataPropertyName = "Alias";
  45. dataGridView1.Columns[1].Width = 80;
  46. dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
  47. dataGridView1.Columns[2].HeaderText = res.Get("Filter");
  48. dataGridView1.Columns[2].DataPropertyName = "Filter";
  49. dataGridView1.Columns[2].Width = 80;
  50. dataGridView1.Columns.Add(new DataGridViewCheckBoxColumn());
  51. dataGridView1.Columns[3].HeaderText = res.Get("Group");
  52. dataGridView1.Columns[3].DataPropertyName = "Group";
  53. dataGridView1.Columns[3].Width = 80;
  54. dataGridView1.Columns.Add(new DataGridViewComboBoxColumn());
  55. dataGridView1.Columns[4].HeaderText = res.Get("Order");
  56. dataGridView1.Columns[4].DataPropertyName = "Order";
  57. dataGridView1.Columns[4].Width = 80;
  58. dataGridView1.Columns.Add(new DataGridViewComboBoxColumn());
  59. dataGridView1.Columns[5].HeaderText = res.Get("Func");
  60. dataGridView1.Columns[5].DataPropertyName = "Func";
  61. dataGridView1.Columns[5].Width = 80;
  62. DataGridViewComboBoxCell cell4 = new DataGridViewComboBoxCell();
  63. cell4.Items.AddRange(new string[] { "", "Asc", "Desc" });
  64. cell4.FlatStyle = FlatStyle.Flat;
  65. dataGridView1.Columns[4].CellTemplate = cell4;
  66. dataGridView1.DataSource = biSourceQuery;
  67. DataGridViewComboBoxCell cell5 = new DataGridViewComboBoxCell();
  68. cell5.Items.AddRange(new string[] { "", "Avg", "Count", "Max", "Min", "Sum" });
  69. cell5.FlatStyle = FlatStyle.Flat;
  70. dataGridView1.Columns[5].CellTemplate = cell5;
  71. dataGridView1.DataSource = biSourceQuery;
  72. groupedList.DataSource = biSourceGrouped;
  73. biSourceGrouped.DataSource = groupedFields;
  74. linkView.AutoGenerateColumns = false;
  75. linkView.DataSource = biSourceLinks;
  76. biSourceLinks.DataSource = links;
  77. linkView.Columns.Add(new DataGridViewTextBoxColumn());
  78. linkView.Columns[0].HeaderText = res.Get("Name");
  79. linkView.Columns[0].DataPropertyName = "Name";
  80. linkView.Columns[0].Width = 300;
  81. linkView.Columns[0].ReadOnly = true;
  82. linkView.Columns.Add(new DataGridViewLinkColumn());
  83. linkView.Columns[1].HeaderText = res.Get("Editor");
  84. linkView.Columns[1].DataPropertyName = "Editor";
  85. linkView.Columns.Add(new DataGridViewLinkColumn());
  86. linkView.Columns[2].HeaderText = res.Get("Delete");
  87. linkView.Columns[2].DataPropertyName = "Delete";
  88. UIUtils.CheckRTL(this);
  89. UpdateDpiDependencies();
  90. }
  91. public override void UpdateDpiDependencies()
  92. {
  93. base.UpdateDpiDependencies();
  94. listView1.SmallImageList = this.GetImages();
  95. toolStrip1.Renderer = Config.DesignerSettings.ToolStripRenderer;
  96. toolStripButton5.Image = GetImage(210);
  97. toolStripButton6.Image = GetImage(212);
  98. button1.Image = GetImage(208);
  99. button2.Image = GetImage(209);
  100. }
  101. #region IQueryDesigner Members
  102. public void DesignQuery()
  103. {
  104. if (OnGetTableList != null)
  105. OnGetTableList(null, null);
  106. ShowDialog();
  107. }
  108. public void DoFillTableList(List<Table> tl)
  109. {
  110. listView1.BeginUpdate();
  111. listView1.Items.Clear();
  112. foreach (Table tbl in tl)
  113. {
  114. ListViewItem itm = new ListViewItem(tbl.Name);
  115. itm.ImageIndex = 222;
  116. itm.Tag = tbl;
  117. listView1.Items.Add(itm);
  118. }
  119. listView1.EndUpdate();
  120. }
  121. public void Clear()
  122. {
  123. foreach (TableView c in tablesViews)
  124. {
  125. c.Dispose();
  126. }
  127. tablesViews.Clear();
  128. splitContainer1.Panel1.Refresh();
  129. }
  130. public TableView DoAddTable(Table table, Point position)
  131. {
  132. TableView tbl = new TableView();
  133. tbl.OnDeleteTable += OnDeleteTable;
  134. table.tableView = tbl;
  135. tbl.Table = table;
  136. tbl.Location = position;
  137. tbl.Parent = splitContainer2.Panel1;
  138. tbl.BringToFront();
  139. tablesViews.Add(tbl);
  140. return tbl;
  141. }
  142. public void DoRefreshLinks()
  143. {
  144. biSourceLinks.DataSource = null;
  145. biSourceLinks.DataSource = links;
  146. }
  147. public List<Link> Links
  148. {
  149. get { return links; }
  150. set { links = value; }
  151. }
  152. public List<Field> Fields
  153. {
  154. get { return (List<Field>)dataGridView1.DataSource; }
  155. set
  156. {
  157. biSourceQuery.DataSource = null;
  158. biSourceQuery.DataSource = value;
  159. UpdateGroupedField();
  160. }
  161. }
  162. public List<Field> Groups
  163. {
  164. get { return groupedFields; }
  165. set { groupedFields = value; }
  166. }
  167. public string SQLText
  168. {
  169. get
  170. { return richTextBox1.Text; }
  171. set
  172. { richTextBox1.Text = value; }
  173. }
  174. public object DataSource
  175. {
  176. get
  177. { return dataGridView2.DataSource; }
  178. set
  179. { dataGridView2.DataSource = value; }
  180. }
  181. public event EventHandler OnOk;
  182. public event EventHandler OnCancel;
  183. public event EventHandler OnGetTableList;
  184. public event AddTableEventHandler OnAddTable;
  185. public event EventHandler OnGenerateSQL;
  186. public event EventHandler OnRunSQL;
  187. #endregion
  188. private void OnDeleteTable(object sender, AddTableEventArgs e)
  189. {
  190. for (int i = links.Count - 1; i >= 0; i--)
  191. {
  192. if ((links[i].from.table == e.table) || (links[i].to.table == e.table))
  193. links.RemoveAt(i);
  194. }
  195. splitContainer1.Panel1.Refresh();
  196. }
  197. private void toolStripButton1_Click(object sender, EventArgs e)
  198. {
  199. if (OnOk != null)
  200. OnOk(sender, e);
  201. }
  202. private void toolStripButton2_Click(object sender, EventArgs e)
  203. {
  204. if (OnCancel != null)
  205. OnCancel(sender, e);
  206. }
  207. private void listView1_DoubleClick(object sender, EventArgs e)
  208. {
  209. ListView _sender = sender as ListView;
  210. if (_sender != null)
  211. {
  212. if ((OnAddTable != null) && (_sender.SelectedItems.Count != 0))
  213. {
  214. AddTableEventArgs ate = new AddTableEventArgs(_sender.SelectedItems[0].Tag as Table, posC.Next);
  215. OnAddTable(sender, ate);
  216. }
  217. }
  218. }
  219. private void listView1_MouseDown(object sender, MouseEventArgs e)
  220. {
  221. if (listView1.GetItemAt(e.X, e.Y) != null)
  222. {
  223. Size dragSize = SystemInformation.DragSize;
  224. dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2),
  225. e.Y - (dragSize.Height / 2)), dragSize);
  226. }
  227. else
  228. dragBoxFromMouseDown = Rectangle.Empty;
  229. }
  230. private void listView1_MouseUp(object sender, MouseEventArgs e)
  231. {
  232. dragBoxFromMouseDown = Rectangle.Empty;
  233. }
  234. private void listView1_MouseMove(object sender, MouseEventArgs e)
  235. {
  236. if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
  237. {
  238. if ((dragBoxFromMouseDown != Rectangle.Empty) &&
  239. !dragBoxFromMouseDown.Contains(e.X, e.Y))
  240. {
  241. screenOffset = SystemInformation.WorkingArea.Location;
  242. listView1.DoDragDrop(listView1.SelectedItems[0], DragDropEffects.Copy);
  243. }
  244. }
  245. }
  246. private void splitContainer2_Panel1_DragOver(object sender, DragEventArgs e)
  247. {
  248. if (e.Data.GetDataPresent(typeof(ListViewItem)))
  249. e.Effect = DragDropEffects.Copy;
  250. else
  251. e.Effect = DragDropEffects.None;
  252. }
  253. private void splitContainer2_Panel1_DragDrop(object sender, DragEventArgs e)
  254. {
  255. ListViewItem _item = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
  256. if (_item != null)
  257. {
  258. if (OnAddTable != null)
  259. {
  260. Point p = (sender as Panel).PointToClient(new Point(e.X, e.Y));
  261. AddTableEventArgs ate = new AddTableEventArgs(_item.Tag as Table, p);
  262. OnAddTable(sender, ate);
  263. }
  264. }
  265. }
  266. private void QueryDesigner_Resize(object sender, EventArgs e)
  267. {
  268. posC.maxX = ClientRectangle.Width;
  269. posC.maxY = ClientRectangle.Height;
  270. }
  271. private void splitContainer2_Panel1_Paint(object sender, PaintEventArgs e)
  272. {
  273. base.OnPaint(e);
  274. foreach (Link link in links)
  275. {
  276. link.Paint(this.splitContainer2.Panel1);
  277. }
  278. }
  279. private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
  280. {
  281. UpdateGroupedField();
  282. }
  283. private void UpdateGroupedField()
  284. {
  285. if (groupedFields == null) return;
  286. List<Field> flds = biSourceQuery.DataSource as List<Field>;
  287. groupedList.BeginUpdate();
  288. biSourceGrouped.DataSource = null;
  289. groupedFields.Clear();
  290. foreach (Field f in flds)
  291. {
  292. if (f.Group)
  293. groupedFields.Add(f);
  294. }
  295. biSourceGrouped.DataSource = groupedFields;
  296. groupedList.EndUpdate();
  297. }
  298. private void button2_Click(object sender, EventArgs e)
  299. {
  300. // move down
  301. if (biSourceGrouped.Count == 0 || biSourceGrouped.Position == biSourceGrouped.Count - 1)
  302. return;
  303. int r = biSourceGrouped.Position;
  304. Field f = groupedFields[r];
  305. groupedFields[r] = groupedFields[r + 1];
  306. groupedFields[r + 1] = f;
  307. biSourceGrouped.DataSource = null;
  308. biSourceGrouped.DataSource = groupedFields;
  309. biSourceGrouped.Position = r + 1;
  310. }
  311. private void button1_Click(object sender, EventArgs e)
  312. {
  313. if (biSourceGrouped.Count == 0 || biSourceGrouped.Position == 0)
  314. return;
  315. // move up
  316. int r = biSourceGrouped.Position;
  317. Field f = groupedFields[r];
  318. groupedFields[r] = groupedFields[r - 1];
  319. groupedFields[r - 1] = f;
  320. biSourceGrouped.DataSource = null;
  321. biSourceGrouped.DataSource = groupedFields;
  322. biSourceGrouped.Position = r - 1;
  323. }
  324. private void linkView_CellContentClick(object sender, DataGridViewCellEventArgs e)
  325. {
  326. if (e.RowIndex == -1)
  327. return;
  328. if (e.ColumnIndex == 1)
  329. {
  330. Link lnk = (Link)biSourceLinks.List[e.RowIndex];
  331. JoinEditorForm frm = new JoinEditorForm();
  332. frm.link = lnk;
  333. frm.ShowDialog();
  334. lnk = frm.link;
  335. }
  336. else if (e.ColumnIndex == 2)
  337. {
  338. links.RemoveAt(e.RowIndex);
  339. linkView.DataSource = null;
  340. linkView.DataSource = biSourceLinks;
  341. splitContainer1.Panel1.Refresh();
  342. }
  343. }
  344. private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
  345. {
  346. switch (e.TabPageIndex)
  347. {
  348. case 1:
  349. if (tabPrevIndex != 2)
  350. {
  351. if (OnGenerateSQL != null)
  352. OnGenerateSQL(sender, e);
  353. }
  354. break;
  355. case 2:
  356. if (OnRunSQL != null)
  357. {
  358. try
  359. {
  360. OnRunSQL(sender, e);
  361. }
  362. catch (Exception exc)
  363. {
  364. MessageBox.Show(exc.Message, Res.Get("Messages,SQLError"), MessageBoxButtons.OK, MessageBoxIcon.Error);
  365. e.Cancel = true;
  366. }
  367. }
  368. break;
  369. default:
  370. break;
  371. }
  372. tabPrevIndex = e.TabPageIndex;
  373. }
  374. private void linkView_DataError(object sender, DataGridViewDataErrorEventArgs e)
  375. {
  376. e.ThrowException = false;
  377. }
  378. }
  379. }