using FastReport.Forms; using FastReport.Utils; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace FastReport.FastQueryBuilder { internal partial class QueryDesigner : BaseForm, IQueryDesigner { private Workspace workspace; private FieldsView fieldsView; private DataBaseView dataBaseView; public QueryDesigner() { InitializeComponent(); CanSaveRestoreState = true; #if AVALONIA toolStrip1.BorderThickness = toolStrip2.BorderThickness = new Padding(0); #endif workspace = new Workspace(); workspace.Dock = DockStyle.Fill; workspace.Parent = splitContainer2.Panel1; fieldsView = new FieldsView(); fieldsView.Dock = DockStyle.Fill; fieldsView.Parent = splitContainer2.Panel2; dataBaseView = new DataBaseView(); dataBaseView.Dock = DockStyle.Fill; dataBaseView.Parent = splitContainer1.Panel2; dataBaseView.DoubleClick += dataBaseView_DoubleClick; UpdateButtonsState(); Localize(); UIUtils.CheckRTL(this); UpdateDpiDependencies(); } public override void Localize() { base.Localize(); MyRes res = new MyRes("Forms,QueryBuilder"); Text = res.Get(""); btnOk.ToolTipText = Res.Get("Buttons,OK"); btnCancel.ToolTipText = Res.Get("Buttons,Cancel"); btnDesign.Text = res.Get("Designer"); btnResult.Text = res.Get("Result"); btnRunSql.Text = res.Get("Run"); } protected override void SaveState() { base.SaveState(); Storage.SetDip("VerticalSplitter", splitContainer1.SplitterDistance); Storage.SetDip("HorizontalSplitter", splitContainer2.SplitterDistance); } protected override void RestoreState() { base.RestoreState(); splitContainer1.SplitterDistance = Storage.GetDip("VerticalSplitter", 600, 100, splitContainer1.Width - 100); splitContainer2.SplitterDistance = Storage.GetDip("HorizontalSplitter", 350, 100, splitContainer2.Height - 70); } public override void UpdateDpiDependencies() { base.UpdateDpiDependencies(); toolStrip1.Height = toolStrip2.Height = this.LogicalToDevice(28); toolStrip1.Renderer = toolStrip2.Renderer = Config.DesignerSettings.ToolStripRenderer; toolStrip1.Font = toolStrip2.Font = Font; btnDesign.Image = GetImage(68); btnResult.Image = GetImage(54); btnOk.Image = GetImage(210); btnCancel.Image = GetImage(212); btnRunSql.Image = GetImage(3); btnOk.Size = btnCancel.Size = this.LogicalToDevice(new Size(23, 23)); workspace.UpdateDpiDependencies(); dataBaseView.UpdateDpiDependencies(); tbSql.Font = this.LogicalToDevice(Storage.GetFont("QueryWindow", DrawUtils.FixedFont), true); dgvResult.RowTemplate.Height = this.LogicalToDevice(19); } #region Public Members public void DesignQuery() { OnGetTableList?.Invoke(this, EventArgs.Empty); ShowDialog(); } public void DoFillTableList(List tl) => dataBaseView.FillTableList(tl); public void Clear() => workspace.Clear(); public ITableView DoAddTable(Table table, Point position) => workspace.DoAddTable(table, position); public List Links { get => workspace.Links; set => workspace.Links = value; } public List Fields { get => fieldsView.Fields; set => fieldsView.Fields = value; } public List Groups { get => fieldsView.Groups; set => fieldsView.Groups = value; } public string SQLText { get => tbSql.Text; set => tbSql.Text = value; } public object DataSource { get => dgvResult.DataSource; set => dgvResult.DataSource = value; } public event EventHandler OnOk; public event EventHandler OnCancel; public event EventHandler OnGetTableList; public event AddTableEventHandler OnAddTable { add => workspace.OnAddTable += value; remove => workspace.OnAddTable -= value; } public event EventHandler OnGenerateSQL; public event EventHandler OnRunSQL; #endregion private void dataBaseView_DoubleClick(object sender, EventArgs e) { workspace.AddTable(dataBaseView.SelectedTable); } private void btnOk_Click(object sender, EventArgs e) { OnOk?.Invoke(sender, e); } private void btnCancel_Click(object sender, EventArgs e) { OnCancel?.Invoke(sender, e); } private void btnDesign_Click(object sender, EventArgs e) { pageControl1.ActivePageIndex = 0; tbSql.Text = ""; UpdateButtonsState(); } private void btnResult_Click(object sender, EventArgs e) { pageControl1.ActivePageIndex = 1; UpdateButtonsState(); // to finish editing in the fields grid tbSql.Focus(); OnGenerateSQL?.Invoke(sender, e); } private void UpdateButtonsState() { btnDesign.Checked = pageControl1.ActivePageIndex == 0; btnResult.Checked = pageControl1.ActivePageIndex == 1; } private void btnRunSql_Click(object sender, EventArgs e) { try { OnRunSQL?.Invoke(sender, e); dgvResult.ColumnHeadersVisible = true; } catch (Exception exc) { FRMessageBox.Error(exc.Message); } } } }