// COPYRIGHT (C) Tom. ALL RIGHTS RESERVED.
// THE AntdUI PROJECT IS AN WINFORM LIBRARY LICENSED UNDER THE Apache-2.0 License.
// LICENSED UNDER THE Apache License, VERSION 2.0 (THE "License")
// YOU MAY NOT USE THIS FILE EXCEPT IN COMPLIANCE WITH THE License.
// YOU MAY OBTAIN A COPY OF THE LICENSE AT
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE
// DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
// SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND
// LIMITATIONS UNDER THE License.
// GITEE: https://gitee.com/antdui/AntdUI
// GITHUB: https://github.com/AntdUI/AntdUI
// CSDN: https://blog.csdn.net/v_132
// QQ: 17379620
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Design;
using System.Windows.Forms;
namespace AntdUI
{
///
/// Dropdown 选择器
///
/// 向下弹出的列表。
[Description("Dropdown 下拉菜单")]
[ToolboxItem(true)]
[DefaultEvent("SelectedValueChanged")]
public class Dropdown : Button, SubLayeredForm
{
#region 属性
///
/// 列表自动宽度
///
[Description("列表自动宽度"), Category("行为"), DefaultValue(true)]
public bool ListAutoWidth { get; set; } = true;
///
/// 触发下拉的行为
///
[Description("触发下拉的行为"), Category("行为"), DefaultValue(Trigger.Click)]
public Trigger Trigger { get; set; } = Trigger.Click;
///
/// 菜单弹出位置
///
[Description("菜单弹出位置"), Category("行为"), DefaultValue(TAlignFrom.BL)]
public TAlignFrom Placement { get; set; } = TAlignFrom.BL;
///
/// 列表最多显示条数
///
[Description("列表最多显示条数"), Category("行为"), DefaultValue(4)]
public int MaxCount { get; set; } = 4;
///
/// 下拉箭头是否显示
///
[Description("下拉箭头是否显示"), Category("外观"), DefaultValue(false)]
public bool DropDownArrow { get; set; } = false;
///
/// 点击到最里层(无节点才能点击)
///
[Description("点击到最里层(无节点才能点击)"), Category("行为"), DefaultValue(false)]
public bool ClickEnd { get; set; } = false;
#region 数据
BaseCollection? items;
///
/// 数据
///
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor", typeof(UITypeEditor))]
[Description("集合"), Category("数据")]
public BaseCollection Items
{
get
{
items ??= new BaseCollection();
return items;
}
set => items = value;
}
///
/// SelectedValue 属性值更改时发生
///
[Description("SelectedValue 属性值更改时发生"), Category("行为")]
public event ObjectNEventHandler? SelectedValueChanged = null;
internal void DropDownChange(object value)
{
SelectedValueChanged?.Invoke(this, new ObjectNEventArgs(value));
select_x = 0;
subForm = null;
}
#endregion
#endregion
#region 动画
LayeredFormSelectDown? subForm = null;
public ILayeredForm? SubForm() => subForm;
ITask? ThreadExpand = null;
bool expand = false;
bool Expand
{
get => expand;
set
{
if (expand == value) return;
expand = value;
if (ShowArrow && Config.Animation)
{
ThreadExpand?.Dispose();
var t = Animation.TotalFrames(10, 100);
if (value)
{
ThreadExpand = new ITask((i) =>
{
ArrowProg = Animation.Animate(i, t, 2F, AnimationType.Ball) - 1F;
Invalidate();
return true;
}, 10, t, () =>
{
ArrowProg = 1;
Invalidate();
});
}
else
{
ThreadExpand = new ITask((i) =>
{
ArrowProg = -(Animation.Animate(i, t, 2F, AnimationType.Ball) - 1F);
Invalidate();
return true;
}, 10, t, () =>
{
ArrowProg = -1;
Invalidate();
});
}
}
else ArrowProg = value ? 1F : -1F;
}
}
#endregion
#region 鼠标
protected override void OnMouseClick(MouseEventArgs e)
{
if (Trigger == Trigger.Click)
{
ClickDown();
return;
}
base.OnMouseClick(e);
}
protected override void OnMouseEnter(EventArgs e)
{
if (Trigger == Trigger.Hover && subForm == null) ClickDown();
base.OnMouseEnter(e);
}
protected override void OnLostFocus(EventArgs e)
{
subForm?.IClose();
base.OnLostFocus(e);
}
internal int select_x = 0;
void ClickDown()
{
if (items != null && items.Count > 0)
{
if (subForm == null)
{
var objs = new List