using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using FastReport.Forms;
using FastReport.Utils;
namespace FastReport.FastQueryBuilder
{
internal partial class QueryDesigner : BaseForm, IQueryDesigner
{
private Rectangle dragBoxFromMouseDown;
private Point screenOffset;
private PosCounter posC = new PosCounter(10, 10);
private List links;
private List groupedFields;
private int tabPrevIndex;
private List tablesViews = new List();
private BindingSource biSourceQuery = new BindingSource();
private BindingSource biSourceGrouped = new BindingSource();
private BindingSource biSourceLinks = new BindingSource();
public QueryDesigner()
{
InitializeComponent();
tabControl1.SelectedIndex = 0;
posC.maxX = ClientRectangle.Width;
posC.maxY = ClientRectangle.Height;
MyRes res = new MyRes("Forms,QueryBuilder");
Text = res.Get("");
toolStripButton5.ToolTipText = Res.Get("Buttons,OK");
toolStripButton6.ToolTipText = Res.Get("Buttons,Cancel");
tabPage1.Text = res.Get("Designer");
tabPage2.Text = res.Get("Sql");
tabPage3.Text = res.Get("Result");
tabPage4.Text = res.Get("Select");
tabPage5.Text = res.Get("Joins");
tabPage6.Text = res.Get("Group");
dataGridView1.AutoGenerateColumns = false;
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
dataGridView1.Columns[0].HeaderText = res.Get("Name");
dataGridView1.Columns[0].DataPropertyName = "Name";
dataGridView1.Columns[0].ReadOnly = true;
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
dataGridView1.Columns[1].HeaderText = res.Get("Alias");
dataGridView1.Columns[1].DataPropertyName = "Alias";
dataGridView1.Columns[1].Width = 80;
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
dataGridView1.Columns[2].HeaderText = res.Get("Filter");
dataGridView1.Columns[2].DataPropertyName = "Filter";
dataGridView1.Columns[2].Width = 80;
dataGridView1.Columns.Add(new DataGridViewCheckBoxColumn());
dataGridView1.Columns[3].HeaderText = res.Get("Group");
dataGridView1.Columns[3].DataPropertyName = "Group";
dataGridView1.Columns[3].Width = 80;
dataGridView1.Columns.Add(new DataGridViewComboBoxColumn());
dataGridView1.Columns[4].HeaderText = res.Get("Order");
dataGridView1.Columns[4].DataPropertyName = "Order";
dataGridView1.Columns[4].Width = 80;
dataGridView1.Columns.Add(new DataGridViewComboBoxColumn());
dataGridView1.Columns[5].HeaderText = res.Get("Func");
dataGridView1.Columns[5].DataPropertyName = "Func";
dataGridView1.Columns[5].Width = 80;
DataGridViewComboBoxCell cell4 = new DataGridViewComboBoxCell();
cell4.Items.AddRange(new string[] { "", "Asc", "Desc" });
cell4.FlatStyle = FlatStyle.Flat;
dataGridView1.Columns[4].CellTemplate = cell4;
dataGridView1.DataSource = biSourceQuery;
DataGridViewComboBoxCell cell5 = new DataGridViewComboBoxCell();
cell5.Items.AddRange(new string[] { "", "Avg", "Count", "Max", "Min", "Sum" });
cell5.FlatStyle = FlatStyle.Flat;
dataGridView1.Columns[5].CellTemplate = cell5;
dataGridView1.DataSource = biSourceQuery;
groupedList.DataSource = biSourceGrouped;
biSourceGrouped.DataSource = groupedFields;
linkView.AutoGenerateColumns = false;
linkView.DataSource = biSourceLinks;
biSourceLinks.DataSource = links;
linkView.Columns.Add(new DataGridViewTextBoxColumn());
linkView.Columns[0].HeaderText = res.Get("Name");
linkView.Columns[0].DataPropertyName = "Name";
linkView.Columns[0].Width = 300;
linkView.Columns[0].ReadOnly = true;
linkView.Columns.Add(new DataGridViewLinkColumn());
linkView.Columns[1].HeaderText = res.Get("Editor");
linkView.Columns[1].DataPropertyName = "Editor";
linkView.Columns.Add(new DataGridViewLinkColumn());
linkView.Columns[2].HeaderText = res.Get("Delete");
linkView.Columns[2].DataPropertyName = "Delete";
UIUtils.CheckRTL(this);
UpdateDpiDependencies();
}
public override void UpdateDpiDependencies()
{
base.UpdateDpiDependencies();
listView1.SmallImageList = this.GetImages();
toolStrip1.Renderer = Config.DesignerSettings.ToolStripRenderer;
toolStripButton5.Image = GetImage(210);
toolStripButton6.Image = GetImage(212);
button1.Image = GetImage(208);
button2.Image = GetImage(209);
}
#region IQueryDesigner Members
public void DesignQuery()
{
if (OnGetTableList != null)
OnGetTableList(null, null);
ShowDialog();
}
public void DoFillTableList(List tl)
{
listView1.BeginUpdate();
listView1.Items.Clear();
foreach (Table tbl in tl)
{
ListViewItem itm = new ListViewItem(tbl.Name);
itm.ImageIndex = 222;
itm.Tag = tbl;
listView1.Items.Add(itm);
}
listView1.EndUpdate();
}
public void Clear()
{
foreach (TableView c in tablesViews)
{
c.Dispose();
}
tablesViews.Clear();
splitContainer1.Panel1.Refresh();
}
public TableView DoAddTable(Table table, Point position)
{
TableView tbl = new TableView();
tbl.OnDeleteTable += OnDeleteTable;
table.tableView = tbl;
tbl.Table = table;
tbl.Location = position;
tbl.Parent = splitContainer2.Panel1;
tbl.BringToFront();
tablesViews.Add(tbl);
return tbl;
}
public void DoRefreshLinks()
{
biSourceLinks.DataSource = null;
biSourceLinks.DataSource = links;
}
public List Links
{
get { return links; }
set { links = value; }
}
public List Fields
{
get { return (List)dataGridView1.DataSource; }
set
{
biSourceQuery.DataSource = null;
biSourceQuery.DataSource = value;
UpdateGroupedField();
}
}
public List Groups
{
get { return groupedFields; }
set { groupedFields = value; }
}
public string SQLText
{
get
{ return richTextBox1.Text; }
set
{ richTextBox1.Text = value; }
}
public object DataSource
{
get
{ return dataGridView2.DataSource; }
set
{ dataGridView2.DataSource = value; }
}
public event EventHandler OnOk;
public event EventHandler OnCancel;
public event EventHandler OnGetTableList;
public event AddTableEventHandler OnAddTable;
public event EventHandler OnGenerateSQL;
public event EventHandler OnRunSQL;
#endregion
private void OnDeleteTable(object sender, AddTableEventArgs e)
{
for (int i = links.Count - 1; i >= 0; i--)
{
if ((links[i].from.table == e.table) || (links[i].to.table == e.table))
links.RemoveAt(i);
}
splitContainer1.Panel1.Refresh();
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
if (OnOk != null)
OnOk(sender, e);
}
private void toolStripButton2_Click(object sender, EventArgs e)
{
if (OnCancel != null)
OnCancel(sender, e);
}
private void listView1_DoubleClick(object sender, EventArgs e)
{
ListView _sender = sender as ListView;
if (_sender != null)
{
if ((OnAddTable != null) && (_sender.SelectedItems.Count != 0))
{
AddTableEventArgs ate = new AddTableEventArgs(_sender.SelectedItems[0].Tag as Table, posC.Next);
OnAddTable(sender, ate);
}
}
}
private void listView1_MouseDown(object sender, MouseEventArgs e)
{
if (listView1.GetItemAt(e.X, e.Y) != null)
{
Size dragSize = SystemInformation.DragSize;
dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2),
e.Y - (dragSize.Height / 2)), dragSize);
}
else
dragBoxFromMouseDown = Rectangle.Empty;
}
private void listView1_MouseUp(object sender, MouseEventArgs e)
{
dragBoxFromMouseDown = Rectangle.Empty;
}
private void listView1_MouseMove(object sender, MouseEventArgs e)
{
if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
{
if ((dragBoxFromMouseDown != Rectangle.Empty) &&
!dragBoxFromMouseDown.Contains(e.X, e.Y))
{
screenOffset = SystemInformation.WorkingArea.Location;
listView1.DoDragDrop(listView1.SelectedItems[0], DragDropEffects.Copy);
}
}
}
private void splitContainer2_Panel1_DragOver(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(ListViewItem)))
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.None;
}
private void splitContainer2_Panel1_DragDrop(object sender, DragEventArgs e)
{
ListViewItem _item = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
if (_item != null)
{
if (OnAddTable != null)
{
Point p = (sender as Panel).PointToClient(new Point(e.X, e.Y));
AddTableEventArgs ate = new AddTableEventArgs(_item.Tag as Table, p);
OnAddTable(sender, ate);
}
}
}
private void QueryDesigner_Resize(object sender, EventArgs e)
{
posC.maxX = ClientRectangle.Width;
posC.maxY = ClientRectangle.Height;
}
private void splitContainer2_Panel1_Paint(object sender, PaintEventArgs e)
{
base.OnPaint(e);
foreach (Link link in links)
{
link.Paint(this.splitContainer2.Panel1);
}
}
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
UpdateGroupedField();
}
private void UpdateGroupedField()
{
if (groupedFields == null) return;
List flds = biSourceQuery.DataSource as List;
groupedList.BeginUpdate();
biSourceGrouped.DataSource = null;
groupedFields.Clear();
foreach (Field f in flds)
{
if (f.Group)
groupedFields.Add(f);
}
biSourceGrouped.DataSource = groupedFields;
groupedList.EndUpdate();
}
private void button2_Click(object sender, EventArgs e)
{
// move down
if (biSourceGrouped.Count == 0 || biSourceGrouped.Position == biSourceGrouped.Count - 1)
return;
int r = biSourceGrouped.Position;
Field f = groupedFields[r];
groupedFields[r] = groupedFields[r + 1];
groupedFields[r + 1] = f;
biSourceGrouped.DataSource = null;
biSourceGrouped.DataSource = groupedFields;
biSourceGrouped.Position = r + 1;
}
private void button1_Click(object sender, EventArgs e)
{
if (biSourceGrouped.Count == 0 || biSourceGrouped.Position == 0)
return;
// move up
int r = biSourceGrouped.Position;
Field f = groupedFields[r];
groupedFields[r] = groupedFields[r - 1];
groupedFields[r - 1] = f;
biSourceGrouped.DataSource = null;
biSourceGrouped.DataSource = groupedFields;
biSourceGrouped.Position = r - 1;
}
private void linkView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == -1)
return;
if (e.ColumnIndex == 1)
{
Link lnk = (Link)biSourceLinks.List[e.RowIndex];
JoinEditorForm frm = new JoinEditorForm();
frm.link = lnk;
frm.ShowDialog();
lnk = frm.link;
}
else if (e.ColumnIndex == 2)
{
links.RemoveAt(e.RowIndex);
linkView.DataSource = null;
linkView.DataSource = biSourceLinks;
splitContainer1.Panel1.Refresh();
}
}
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
switch (e.TabPageIndex)
{
case 1:
if (tabPrevIndex != 2)
{
if (OnGenerateSQL != null)
OnGenerateSQL(sender, e);
}
break;
case 2:
if (OnRunSQL != null)
{
try
{
OnRunSQL(sender, e);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message, Res.Get("Messages,SQLError"), MessageBoxButtons.OK, MessageBoxIcon.Error);
e.Cancel = true;
}
}
break;
default:
break;
}
tabPrevIndex = e.TabPageIndex;
}
private void linkView_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
e.ThrowException = false;
}
}
}