-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFormEditContainer.cs
147 lines (131 loc) · 4.62 KB
/
FormEditContainer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
using ModEditor.Controls;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Windows.Forms;
namespace ModEditor
{
public partial class FormEditContainer : Form
{
public System.Type targetType;
public List<object> data = new List<object>();
// Attributes used to override targetType. Mostly for overriding primitive types
public List<ModEditorAttribute> attributes;
public FormEditContainer(System.Type targetType, System.Collections.IList source, List<ModEditorAttribute> attributes)
{
InitializeComponent();
this.targetType = targetType;
this.attributes = attributes;
foreach(var obj in source)
{
data.Add(obj);
}
UpdateList();
}
// This editor does not bother undo/redo, so we can use generic accessors
Control GenerateItemControl(Object obj, int index)
{
string name = String.Format("Item {0}", index+1);
if(FieldEditorManager.IsPrimitiveType(targetType))
{
ListObjectAccessor accessor = new ListObjectAccessor(data, index, targetType, name, false, attributes);
TypeEditor editor = FieldEditorManager.GenerateEditor(accessor);
editor.UpdateValue();
return editor.GetControl();
}
else
{
GenericFieldAccessor callback = new GenericFieldAccessor(obj, targetType, false);
PropertyGridExplorer explorer = new PropertyGridExplorer();
explorer.AutoSize = true;
explorer.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
//explorer.Width = CustomList.Width;
explorer.GrowStyle = TableLayoutPanelGrowStyle.AddRows;
//explorer.Dock = DockStyle.Fill;
explorer.Anchor = AnchorStyles.Left | AnchorStyles.Right;
explorer.SetSource(this.targetType, callback);
return explorer;
}
}
void UpdateList()
{
this.SuspendLayout();
listView.Items.Clear();
int i = 0;
foreach (var obj in data)
{
listView.Items.Add(obj);
CustomList.Controls.Add(GenerateItemControl(obj, i++));
}
this.ResumeLayout();
}
void ExploreItem(object item)
{
SuspendLayout();
if (item == null)
{
itemView.SetSource(targetType, null);
}
else
{
itemView.SetSource(targetType, new GenericFieldAccessor(item, targetType, false));
}
ResumeLayout();
}
private void FormEditContainer_Load(object sender, EventArgs e)
{
}
private void listView_SelectedIndexChanged(object sender, EventArgs e)
{
ExploreItem(listView.SelectedItem);
}
private void btnAdd_Click(object sender, EventArgs e)
{
try
{
object item = FieldEditorManager.CreateObject(targetType);
if (item != null)
{
data.Add(item);
UpdateList();
}
}
catch(Exception ex)
{
PanelErrors.LogErrorString(ex.Message);
}
}
private void btnCopy_Click(object sender, EventArgs e)
{
if (listView.SelectedItem != null)
{
object selected = listView.SelectedItem;
object item = Tools.Clone(selected, targetType);
if (item != null)
{
int index = listView.Items.IndexOf(selected);
listView.Items.Insert(index, item);
data.Insert(index, item);
UpdateList();
}
}
}
private void btnRemove_Click(object sender, EventArgs e)
{
if (listView.SelectedItem != null)
{
itemView.SetSource(targetType, null);
data.Remove(listView.SelectedItem);
listView.Items.Remove(listView.SelectedItem);
UpdateList();
}
}
}
}