using System; using System.Drawing; using System.Windows.Forms; namespace FastReport.FastQueryBuilder { internal class FqbCheckedListBox : CheckedListBox { private Rectangle dragBoxFromMouseDown; public event EventHandler VertScrollValueChanged; protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (SelectedItem != 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; } protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if ((e.Button & MouseButtons.Left) == MouseButtons.Left) { if ((dragBoxFromMouseDown != Rectangle.Empty) && !dragBoxFromMouseDown.Contains(e.X, e.Y)) { DoDragDrop(SelectedItem, DragDropEffects.Copy); } } } protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); dragBoxFromMouseDown = Rectangle.Empty; } #if WPF private System.Windows.Controls.ScrollViewer scrollViewer; internal Rectangle GetItemRectangle(int pos) { if (scrollViewer != null) pos -= (int)scrollViewer.ContentVerticalOffset; return new Rectangle(0, (pos) * ItemHeight, Width, ItemHeight); } public FqbCheckedListBox() { control.Loaded += (s, e) => { scrollViewer = control.GetChildOfType(); scrollViewer.ScrollChanged += (s, e) => VertScrollValueChanged?.Invoke(this, EventArgs.Empty); }; } #endif #if AVALONIA private Avalonia.Controls.ScrollViewer scrollViewer; internal Rectangle GetItemRectangle(int pos) { int y = pos * ItemHeight; if (scrollViewer != null) y -= (int)(scrollViewer.Offset.Y / DpiScale); return new Rectangle(0, y, Width, ItemHeight); } public FqbCheckedListBox() { control.Loaded += (s, e) => { scrollViewer = Avalonia.VisualTree.VisualExtensions.FindDescendantOfType(control); scrollViewer.ScrollChanged += (s, e) => VertScrollValueChanged?.Invoke(this, EventArgs.Empty); }; } #endif #if !MONO private const int WM_VSCROLL = 0x115; protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == WM_VSCROLL) { VertScrollValueChanged?.Invoke(this, EventArgs.Empty); } } #endif } }