using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Text; using System.Windows.Controls; using System.Windows.Media; using System.Globalization; using System.Threading; using MultiLayout; using MultiLayout.UiModule; namespace MultiLayout.MainEdit { /// <summary> /// 编辑界面的图表区 /// </summary> public class MeGraphTabItem : INotifyPropertyChanged { public TabItem mTabItem; /// <summary> /// 唯一标识码 /// </summary> public int ID = 0; public string Title { get; set; } = "??"; [PropertyChanged.DoNotCheckEquality] public int ColCnt { get; set; } = 1; [PropertyChanged.DoNotCheckEquality] public int RowCnt { get; set; } = 1; public List<bool> RowDefinitions { get; } = new List<bool>(); public List<bool> ColumnDefinitions { get; } = new List<bool>(); public List<MeGraphComponent> Components = new List<MeGraphComponent>(); public event Action<MeGraphTabItem> RCChanged; public MeGraphTabItem() { RefreshRC(); } bool refresh(List<bool> list, int cnt) { int n = cnt - list.Count(); if (n == 0) return false; if (n > 0) { for (int i = 0; i < n; i++) { list.Add(false); } } else { list.RemoveRange(cnt, -n); } return true; } void RefreshRC() { bool b1 = refresh(RowDefinitions, RowCnt); bool b2 = refresh(ColumnDefinitions, ColCnt); if (b1 || b2) { //把在范围外的控件缩小,或删除 MakeComponentRectVaild(); RCChanged?.Invoke(this); } } public void RefreshRC(int rowcnt, int colcnt) { RowCnt = rowcnt; ColCnt = colcnt; RefreshRC(); } public bool IsComponentRectVaild(System.Drawing.Rectangle rect) { return IsComponentRectVaild(rect, null); } public bool IsComponentRectVaild(System.Drawing.Rectangle rect, MeGraphComponent component) { //判断超出范围 if (!new System.Drawing.Rectangle(0, 0, ColCnt, RowCnt).Contains(rect)) { return false; } //判断是否与其它控件有交集 for (int i = 0; i < Components.Count(); i++) { if (Components[i] == component) continue; if (rect.IntersectsWith(Components[i].Rect)) return false; } return true; } void MakeComponentRectVaild() { System.Drawing.Rectangle total = new System.Drawing.Rectangle(0, 0, ColCnt, RowCnt); for (int i = 0; i < Components.Count(); i++) { System.Drawing.Rectangle r = Components[i].Rect; if (r.IntersectsWith(total)) { r.Intersect(total); Components[i].Rect = r; } else { //删除 Components.RemoveAt(i); i--; continue; } } } /// <summary> /// 获取空的位置 /// </summary> /// <returns></returns> public System.Drawing.Point GetFreeLocal() { //System.Drawing.Point //System.Drawing.Rectangle. for (int y = 0; y < RowCnt; y++) { for (int x = 0; x < ColCnt; x++) { System.Drawing.Point p = new System.Drawing.Point(x, y); bool isContains = false; foreach (MeGraphComponent c in Components) { if (c.Rect.Contains(p)) { isContains = true; break; } } if (!isContains) return p; } } return new System.Drawing.Point(-1, -1); } /// <summary> /// /// </summary> /// <param name="propertyname"></param> protected void NotifyPropertyChanged(string propertyname) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname)); } public event PropertyChangedEventHandler PropertyChanged; } /// <summary> /// 编辑界面的图表区 对应 FlyLayout 的 GraphComponent 信息 /// </summary> public class MeGraphComponent : MeFlyComponent { public System.Drawing.Rectangle Rect { get; set; } public MeGraphTabItem mItem; } /// <summary> /// 组件类型 /// </summary> public class MeComponentType : INotifyPropertyChanged { /// <summary> /// /// </summary> //public string ModuleName { get; set; } /// <summary> /// /// </summary> public IUiModule2 Module { get; set; } /// <summary> /// /// </summary> public Brush Background { get; set; } /// <summary> /// /// </summary> public string Header { get; set; } /// <summary> /// 只能添加一次 /// </summary> public bool IsUnique { get; set; } /// <summary> /// 当只能添加一次,且当前已经添加了,isenable=false /// </summary> public bool IsEnable { get { if (IsUnique && Count > 0) { return false; } else { return true; } } } /// <summary> /// 当前一共添加了多少控件 /// </summary> public int Count { get; set; } public event PropertyChangedEventHandler PropertyChanged; } /// <summary> /// 编辑界面的 组件 对应 FlyLayout 的 FlyComponent 信息 /// </summary> public class MeFlyComponent : INotifyPropertyChanged { /// <summary> /// 唯一标识码 /// </summary> public int ID = 0; /// <summary> /// 对应在grid中的button /// </summary> public Button mButton; public event PropertyChangedEventHandler PropertyChanged; public MeComponentType Type { get; set; } /// <summary> /// 服务容器名称 /// </summary> public string ServiceContainerName { get; set; } } }