using System.Data;
|
|
|
namespace HydroUI
|
{
|
public partial class PropertyForm : UserControl
|
{
|
private IBaseViewModel _selectedObject;
|
private MapObjectType _selectedType= MapObjectType.全部;
|
private List<SelectionSet> selectionSets;
|
public SelectionSet selectionSet=new SelectionSet();
|
private Form fr = null;
|
public PropertyForm()
|
{
|
InitializeComponent();
|
}
|
public void SetEnabled(bool isReadOnly)
|
{
|
_isEnable = isReadOnly;
|
}
|
|
public void SetWindows(Form mg)
|
{
|
if (mg.WindowState == FormWindowState.Maximized)
|
{
|
//this.StartPosition = FormStartPosition.Manual; //设置窗体位置由程序控制
|
this.Height = mg.Height-50;
|
this.Location = new Point(mg.Left + mg.Width -this.Width, mg.Top+50); //设置新窗体位置,当前窗体的右侧(X轴方向)
|
}
|
else
|
{
|
//this.StartPosition = FormStartPosition.Manual; //设置窗体位置由程序控制
|
this.Height = mg.Height;
|
this.Location = new Point(mg.Left + mg.Width - 15, mg.Top); //设置新窗体位置,当前窗体的右侧(X轴方向)
|
}
|
fr = mg;
|
|
//GlobalObject.PropertyForm.Show();
|
}
|
public Form GetWindow()
|
{
|
return this.fr;
|
}
|
public void SetObj(object o)
|
{
|
propertyGridControl1.SelectedObject = o;
|
this.Text= o.GetType().Name;
|
}
|
public void SetObj(IBaseViewModel selectedObject)
|
{
|
lock(selectedObject)
|
{
|
_selectedObject = selectedObject;
|
|
|
|
if (_selectedObject is JunctionViewModel junc)
|
{
|
_selectedType = MapObjectType.节点;
|
propertyGridControl1.SelectedObjects = new JunctionViewModel[] { junc };
|
}
|
else if (_selectedObject is ReservoirViewModel res)
|
{
|
_selectedType = MapObjectType.水库;
|
propertyGridControl1.SelectedObjects = new ReservoirViewModel[] { res };
|
}
|
else if (_selectedObject is TankViewModel tank)
|
{
|
_selectedType = MapObjectType.水池;
|
propertyGridControl1.SelectedObjects = new TankViewModel[] { tank };
|
}
|
else if (_selectedObject is PipeViewModel pipe)
|
{
|
_selectedType = MapObjectType.管线;
|
propertyGridControl1.SelectedObjects = new PipeViewModel[] { pipe };
|
}
|
else if (_selectedObject is ValveViewModel valve)
|
{
|
_selectedType = MapObjectType.阀门;
|
propertyGridControl1.SelectedObjects = new ValveViewModel[] { valve };
|
}
|
else if (_selectedObject is RepeaterViewModel repeater)
|
{
|
_selectedType = MapObjectType.重复器;
|
propertyGridControl1.SelectedObjects = new RepeaterViewModel[] { repeater };
|
}
|
//水表
|
else if (_selectedObject is MeterViewModel meter)
|
{
|
_selectedType = MapObjectType.水表;
|
propertyGridControl1.SelectedObjects = new MeterViewModel[] { meter };
|
}
|
//水泵
|
else if (_selectedObject is PumpViewModel pump)
|
{
|
_selectedType = MapObjectType.水泵;
|
propertyGridControl1.SelectedObjects = new PumpViewModel[] { pump };
|
}
|
//喷头Nozzle
|
else if (_selectedObject is NozzleViewModel nozzle)
|
{
|
_selectedType = MapObjectType.喷头;
|
propertyGridControl1.SelectedObjects = new NozzleViewModel[] { nozzle };
|
} else
|
{
|
_selectedType = MapObjectType.全部;
|
propertyGridControl1.SelectedObjects =new IBaseViewModel[] { selectedObject };
|
}
|
switch (_selectedType)
|
{
|
case MapObjectType.节点:
|
Text = "节点 Properties";
|
break;
|
case MapObjectType.水库:
|
Text = "水库 Properties";
|
break;
|
case MapObjectType.水池:
|
Text = "水池 Properties";
|
break;
|
case MapObjectType.管线:
|
Text = "管线 Properties";
|
break;
|
case MapObjectType.阀门:
|
Text = "阀门 Properties";
|
break;
|
case MapObjectType.重复器:
|
Text = "重复器 Properties";
|
break;
|
}
|
|
|
}
|
|
}
|
public void SetNet(MapViewNetWork net)
|
{
|
selectionSet.net = net;
|
}
|
public void SetObjs(List<IBaseViewModel> selectedObjects)
|
{
|
if (selectedObjects == null) return;
|
selectedObjects.RemoveAll(obj => obj == null);
|
selectedObjects.ForEach(obj =>
|
{
|
if (obj.Tags==null)
|
{
|
obj.Tags = new TagList();
|
}
|
|
});
|
|
selectionSet.selectedObjects = selectedObjects.ToList();
|
if (selectedObjects.Count ==1)
|
SetObj(selectedObjects[0]);
|
else
|
ShowProperties(selectedObjects);
|
|
if (selectionSet.OnlyViewSelected)
|
RefreshListBox();
|
}
|
|
private void PropertyForm_Load_1(object sender, EventArgs e)
|
{
|
foreach (var item in Enum.GetValues(typeof(MapObjectType)))
|
{
|
comboBox_type.Items.Add(item);
|
}
|
comboBox_type.SelectedIndex = 0;
|
selectionSets = new List<SelectionSet>();
|
selectionSet = new SelectionSet();
|
listBox1.DataSource = selectionSet.View;
|
//listBox1.DisplayMember = "IDType";
|
}
|
|
private void comboBox_type_SelectedIndexChanged(object sender, EventArgs e)
|
{
|
RefreshListBox();
|
}
|
void RefreshListBox()
|
{
|
if (selectionSet == null) return;
|
string txt = comboBox_type.SelectedItem.ToString();
|
MapObjectType selectedType = (MapObjectType)Enum.Parse(typeof(MapObjectType), txt);
|
// 使用 LINQ 查询筛选选择集
|
selectionSet.filterType = selectedType;
|
selectionSet.FilterString = textBox_search.Text;
|
|
|
listBox1.SelectedIndexChanged -= listBox1_SelectedIndexChanged;
|
|
|
|
//listBox1.DisplayMember = "ID";
|
//// 重新绑定选择集列表
|
//listBox1.DataSource = selectionSet.View;
|
listBox1.DataSource = null;
|
//listBox1.DisplayMember = "IDType";
|
listBox1.DataSource = selectionSet.View;
|
|
listBox1.SelectedIndexChanged += listBox1_SelectedIndexChanged;
|
}
|
|
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
|
{
|
|
if (listBox1.SelectedItems.Count == 0)
|
{
|
return;
|
}
|
else if (listBox1.SelectedItems.Count == 1)
|
{
|
var objID = listBox1.SelectedItems[0];
|
var findlist = selectionSet.net.MapObjects.FindAll(o => o.ID == objID);
|
if (findlist.Count <= 0) return;
|
IBaseViewModel mapObject = findlist[0];// selectionSet.selectedObjects.Find(obj => obj.ID == ((MapObject)listBox1.SelectedItems[0]).ID);
|
if (mapObject != null) SetObj(mapObject);
|
GlobalObject.map.selectedObjs.ForEach(o => o.Selected = false); ;
|
GlobalObject.map.selectedObjs.Clear();
|
GlobalObject.map.selectedObjs.Add(mapObject);
|
mapObject.Selected = true;
|
GlobalObject.map.SetMapInvalidate();
|
}
|
else
|
{
|
List<IBaseViewModel> list = new List<IBaseViewModel>();
|
foreach (var o in listBox1.SelectedItems)
|
{
|
var objID = listBox1.SelectedItems[0];
|
IBaseViewModel mapObject = selectionSet. net.MapObjects.FindAll(obj => obj.ID == objID)[0];
|
list.Add(mapObject);
|
}
|
ShowProperties( list);
|
GlobalObject.map.selectedObjs.ForEach(o => o.Selected = false); ;
|
GlobalObject.map.selectedObjs.Clear();
|
list.ForEach(o=>o.Selected=true);
|
GlobalObject.map.selectedObjs.AddRange(list);
|
GlobalObject.map.SetMapInvalidate();
|
}
|
|
|
|
}
|
private void listBox1_DoubleClick(object sender, EventArgs e)
|
{
|
if (listBox1.SelectedItems.Count == 1)
|
{
|
//IBaseViewModel mapObject = (IBaseViewModel)listBox1.SelectedItems[0];
|
var objID = listBox1.SelectedItems[0];
|
IBaseViewModel mapObject = selectionSet.net.MapObjects.FindAll(obj => obj.ID == objID)[0];
|
GlobalObject.map.setCenter (mapObject);
|
|
|
GlobalObject.map.SetMapInvalidate();
|
}
|
}
|
private void PropertyForm_FormClosing(object sender, FormClosingEventArgs e)
|
{
|
e.Cancel = true;
|
this.Hide();
|
}
|
|
bool _isEnable = true;
|
|
private static Dictionary<object, List<object>> _selectedObjectsDict = new Dictionary<object, List<object>>();
|
private void propertyGridControl1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
|
{
|
//foreach (var item in listBox1.SelectedItems)
|
//{
|
|
// var mapObject = selectionSet.selectedObjects.Find(obj => obj.ID == ((MapObject)item).ID);
|
// if (e.ChangedItem.Label == " 批次编号 ")
|
// {
|
// mapObject.Level = (int)e.ChangedItem.Value;
|
// }
|
//}
|
if (!_isEnable)
|
{
|
MessageBox.Show("当前状态的修改将不会被保存","重复器展开中");
|
_isEnable = true;
|
}
|
|
|
//object firstObj = selectionSet.selectedObjects.First();
|
|
|
//if (_selectedObjectsDict[firstObj].Contains(e.ChangedItem.Label))
|
//{
|
// foreach (var obj in selectionSet.selectedObjects)
|
// {
|
// var props = TypeDescriptor.GetProperties(obj);
|
// foreach (PropertyDescriptor prop in props)
|
// {
|
// if (prop.Name == e.ChangedItem.Label)
|
// {
|
// prop.SetValue(obj, e.ChangedItem.Value);
|
// break;
|
// }
|
// }
|
// }
|
//}
|
GlobalObject.map.SetMapInvalidate();
|
}
|
|
|
|
public void ShowProperties(IEnumerable<IBaseViewModel> selectedObjects)
|
{
|
IBaseViewModel[] objs = null;
|
try
|
{
|
if (selectedObjects!=null)
|
objs= selectedObjects.ToArray();
|
}
|
catch
|
{
|
return;
|
}
|
propertyGridControl1.SelectedObjects = objs;
|
|
|
|
}
|
|
private void textBox_search_TextChanged(object sender, EventArgs e)
|
{
|
RefreshListBox();
|
}
|
|
private void checkBox_OnlyShowSelected_CheckedChanged(object sender, EventArgs e)
|
{
|
selectionSet.OnlyViewSelected = checkBox_OnlyShowSelected.Checked;
|
RefreshListBox();
|
}
|
|
private void label_lock_Click(object sender, EventArgs e)
|
{
|
var label_lock = (Label)sender;
|
|
GlobalObject.LockSelect=!GlobalObject.LockSelect;
|
if (GlobalObject.LockSelect)
|
{
|
label_lock.BackColor = Color.Blue;
|
label_lock.Text = "🔒";
|
}
|
else
|
{
|
label_lock.BackColor = Color.Green;
|
label_lock.Text = "🔓";
|
}
|
}
|
private void label_filter_Click(object sender, EventArgs e)
|
{
|
var label_lock = (Label)sender;
|
|
|
TagList tags = new TagList();
|
var mobjs=selectionSet.OnlyViewSelected? selectionSet.selectedObjects:selectionSet.net.MapObjects;
|
foreach (var item in mobjs)
|
{
|
tags.AddRange(item.Tags);
|
}
|
var t = tags.Distinct().ToList();
|
tags.Clear();
|
tags.AddRange(t);
|
var form = new FormFilter(tags);
|
if (form.ShowDialog() == DialogResult.OK)
|
{
|
|
selectionSet.FilterTags = form.Tags;
|
selectionSet.rules = form.rules;
|
GlobalObject.ApplyFilter=selectionSet.FilterTags.Count > 0 || selectionSet.rules.Count > 0;
|
if (GlobalObject.ApplyFilter)
|
{
|
|
label_lock.BackColor = Color.Blue;
|
label_lock.Text = "⏬";
|
}
|
else
|
{
|
|
label_lock.BackColor = Color.Green;
|
label_lock.Text = "🔽";
|
}
|
|
RefreshListBox();
|
}
|
|
|
}
|
|
private void PropertyForm_KeyDown(object sender, KeyEventArgs e)
|
{
|
//Ctrl+A,则选中当前listbox中的所有项
|
if (e.Control && e.KeyCode == Keys.A)
|
{
|
for (int i = 0; i < listBox1.Items.Count; i++)
|
{
|
listBox1.SetSelected(i, true);
|
}
|
}
|
}
|
|
|
private void 全选ToolStripMenuItem_Click(object sender, EventArgs e)
|
{
|
listBox1.SelectedIndexChanged -= listBox1_SelectedIndexChanged;
|
for (int i = 0; i < listBox1.Items.Count; i++)
|
{
|
listBox1.SetSelected(i, true);
|
}
|
listBox1.SelectedIndexChanged += listBox1_SelectedIndexChanged;
|
this.propertyGridControl1.SelectedObjects =selectionSet. CurrentSelectedObjects?.ToArray();
|
GlobalObject.map.selectedObjs.ForEach(o => o.Selected = false);
|
if (selectionSet.CurrentSelectedObjects!=null)
|
{
|
GlobalObject.map.selectedObjs.AddRange(selectionSet.CurrentSelectedObjects);
|
selectionSet.CurrentSelectedObjects.ForEach(o =>
|
{
|
o.Selected = true;
|
});
|
}
|
GlobalObject.map.SetMapInvalidate();
|
|
|
|
|
}
|
|
private void listBox1_MouseDown(object sender, MouseEventArgs e)
|
{
|
if (e.Button == MouseButtons.Right)
|
{
|
if (listBox1.SelectedItems.Count > 0)
|
{
|
contextMenuStrip1.Show(listBox1, e.Location);
|
}
|
}
|
}
|
}
|
|
public class SelectionSet
|
{
|
public string Name;
|
public MapObjectType filterType=MapObjectType.全部;
|
|
public string FilterString { get; set; } = "";
|
|
public TagList FilterTags { get; set; } = new TagList();
|
public List<Func<IBaseViewModel, bool>> rules = new List<Func<IBaseViewModel, bool>>();
|
public List<MapObjectType> FilterTypes = new List<MapObjectType>();
|
public MapViewNetWork net { get; set; } = null;
|
public bool OnlyViewSelected { get; set; } = true;
|
|
public List<IBaseViewModel> selectedObjects=new List<IBaseViewModel>();
|
public List<IBaseViewModel> CurrentSelectedObjects=new List<IBaseViewModel>();
|
public List<string> View
|
{
|
get
|
{
|
List<IBaseViewModel> originList;
|
List<IBaseViewModel> list;
|
List<string> list_result=new List<string>();
|
if (!OnlyViewSelected && net != null)
|
{
|
originList = net.MapObjects;
|
}
|
else
|
{
|
originList = selectedObjects;
|
}
|
|
|
if (filterType == MapObjectType.全部)
|
{
|
list = originList;
|
}
|
|
else
|
{
|
|
var filteredSets = from obj in originList
|
where obj.GetType() == filterType.GetObjType()
|
select obj;
|
list = filteredSets?.ToList();
|
}
|
|
|
|
if (FilterString!=null && FilterString!="")
|
{
|
list = list?.FindAll(o => o.ID.IndexOf(FilterString) >= 0);
|
}
|
|
if (FilterTags.Count>0)//使用表达式,对结果进行筛选
|
{
|
foreach (var tag in FilterTags)
|
{
|
var filteredSets = from obj in list
|
where obj.Tags.Contains(tag)
|
select obj;
|
list = filteredSets?.ToList();
|
}
|
}
|
|
if(rules.Count>0)
|
{
|
foreach (var rule in rules)
|
{
|
var filteredSets = from obj in list
|
where rule(obj)
|
select obj;
|
list = filteredSets?.ToList();
|
}
|
}
|
|
CurrentSelectedObjects = list;
|
list_result = list.Select(o => o.ID).ToList();
|
return list_result;
|
|
|
}
|
}
|
|
|
}
|
|
|
|
|
}
|