using System;
using System.Windows.Forms;
using System.Drawing;
using FastReport.Utils;
using System.ComponentModel;
namespace FastReport.Controls
{
internal class ParametersComboBox : UserControl
{
private TextBox textBox;
private Button comboButton;
private Report report;
private DataColumnDropDown dropDown;
private Timer timer;
private int closedTicks;
private int dpi;
public event EventHandler DropDownOpening;
public new event EventHandler TextChanged;
///
public override string Text
{
get { return textBox.Text; }
set { textBox.Text = value; }
}
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Report Report
{
get { return report; }
set
{
report = value;
dropDown.CreateNodes(value);
}
}
private void FTextBox_TextChanged(object sender, EventArgs e)
{
if (TextChanged != null)
TextChanged(this, EventArgs.Empty);
}
private void FDropDown_ColumnSelected(object sender, EventArgs e)
{
Text = String.IsNullOrEmpty(dropDown.Column) ? "" : dropDown.Column;
timer.Start();
}
private void FDropDown_Closed(object sender, ToolStripDropDownClosedEventArgs e)
{
closedTicks = Environment.TickCount;
}
private void FComboButton_Click(object sender, EventArgs e)
{
if (Math.Abs(Environment.TickCount - closedTicks) < 100)
return;
DropDownOpening?.Invoke(this, EventArgs.Empty);
dropDown.Column = Text;
dropDown.SetSize(Width, 250);
dropDown.Owner = this;
dropDown.Show(this, new Point(RightToLeft == RightToLeft.Yes ? Width : 0, Height));
}
private void FTimer_Tick(object sender, EventArgs e)
{
FindForm().BringToFront();
textBox.Focus();
textBox.Select(Text.Length, 0);
timer.Stop();
}
private void LayoutControls()
{
int _1 = (int)Math.Round(this.LogicalToDevice(1f));
int _2 = _1 + _1;
int btnWidth = Height - _2;
if (comboButton != null)
comboButton.SetBounds(RightToLeft == RightToLeft.Yes ? _1 : Width - btnWidth - _1, _1, btnWidth, btnWidth);
if (textBox != null)
textBox.SetBounds(RightToLeft == RightToLeft.Yes ? Height : 3, (Height - textBox.PreferredHeight) / 2, Width - Height - 3, textBox.PreferredHeight);
}
protected override void OnPaint(PaintEventArgs e)
{
if (dpi != this.Dpi())
{
UpdateImages();
dpi = this.Dpi();
}
Graphics g = e.Graphics;
g.FillRectangle(Enabled ? SystemBrushes.Window : SystemBrushes.Control, DisplayRectangle);
if (Enabled)
this.DrawVisualStyleBorder(g, new Rectangle(0, 0, Width - 1, Height - 1));
else
g.DrawRectangle(SystemPens.InactiveBorder, new Rectangle(0, 0, Width - 1, Height - 1));
}
private void UpdateImages()
{
#if AVALONIA
// doing this in the render code will result in InvalidOp exception
Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(() =>
{
comboButton.Image = this.GetImage(182);
});
#else
comboButton.Image = this.GetImage(182);
#endif
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (timer != null)
timer.Dispose();
timer = null;
}
base.Dispose(disposing);
}
///
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
LayoutControls();
}
///
protected override void OnLayout(LayoutEventArgs e)
{
base.OnLayout(e);
LayoutControls();
}
public ParametersComboBox()
{
comboButton = new Button();
comboButton.FlatStyle = FlatStyle.Flat;
comboButton.FlatAppearance.BorderSize = 0;
comboButton.Click += new EventHandler(FComboButton_Click);
Controls.Add(comboButton);
textBox = new TextBox();
textBox.BorderStyle = BorderStyle.None;
textBox.TextChanged += new EventHandler(FTextBox_TextChanged);
Controls.Add(textBox);
dropDown = new DataColumnDropDown();
dropDown.DataTree.ShowColumns = false;
dropDown.DataTree.ShowDataSources = false;
dropDown.DataTree.ShowRelations = false;
dropDown.DataTree.ShowParameters = true;
dropDown.ColumnSelected += new EventHandler(FDropDown_ColumnSelected);
dropDown.Closed += new ToolStripDropDownClosedEventHandler(FDropDown_Closed);
timer = new Timer();
timer.Interval = 50;
timer.Tick += new EventHandler(FTimer_Tick);
// prevent autoscale of child controls
AutoScaleMode = AutoScaleMode.None;
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
}
}
}