PageRenderTime 41ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/NekoKun.Core/ObjectEditor/Controls/ArrayEditor.cs

https://bitbucket.org/nekokun/nekokun
C# | 228 lines | 199 code | 28 blank | 1 comment | 27 complexity | d1dc58a23ed009468de369aae6acc697 MD5 | raw file
Possible License(s): MIT, CC-BY-SA-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Runtime.InteropServices;
  5. namespace NekoKun.ObjectEditor
  6. {
  7. public class ArrayEditor : AbstractObjectEditor, IClipboardHandler, IDeleteHandler
  8. {
  9. System.Windows.Forms.SplitContainer split = new System.Windows.Forms.SplitContainer();
  10. System.Windows.Forms.ListBox list;
  11. AbstractObjectEditor con;
  12. System.Windows.Forms.NumericUpDown menuResizeTextbox;
  13. System.Windows.Forms.ToolStripMenuItem menuResize;
  14. public ArrayEditor(AbstractObjectEditor Con)
  15. : base(null)
  16. {
  17. con = Con;
  18. split.Dock = System.Windows.Forms.DockStyle.Fill;
  19. split.Panel1MinSize = 100;
  20. split.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
  21. split.SplitterDistance = 150;
  22. list = new ArrayListbox();
  23. list.Dock = System.Windows.Forms.DockStyle.Fill;
  24. list.SelectedIndexChanged += new EventHandler(list_SelectedIndexChanged);
  25. split.Panel1.Controls.Add(list);
  26. con.Control.Dock = System.Windows.Forms.DockStyle.Fill;
  27. split.Panel2.Controls.Add(con.Control);
  28. Con.DirtyChanged += new EventHandler(Con_DirtyChanged);
  29. menuResizeTextbox = new System.Windows.Forms.NumericUpDown();
  30. menuResize = new System.Windows.Forms.ToolStripMenuItem();
  31. menuResize.Text = "?????(&M)";
  32. menuResizeTextbox.Font = split.Font;
  33. menuResizeTextbox.UpDownAlign = System.Windows.Forms.LeftRightAlignment.Left;
  34. menuResizeTextbox.BorderStyle = System.Windows.Forms.BorderStyle.None;
  35. menuResizeTextbox.Cursor = System.Windows.Forms.Cursors.Default;
  36. var host = new System.Windows.Forms.ToolStripControlHost(menuResizeTextbox);
  37. menuResize.DropDownItems.Add(host);
  38. var dd = (menuResize.DropDown as System.Windows.Forms.ToolStripDropDownMenu);
  39. dd.ShowImageMargin = false;
  40. dd.BackColor = System.Drawing.SystemColors.Window;
  41. this.list.ContextMenuStrip = new EditContextMenuStrip(this);
  42. this.list.ContextMenuStrip.Items.Add(new System.Windows.Forms.ToolStripSeparator());
  43. this.list.ContextMenuStrip.Items.Add(menuResize);
  44. this.list.ContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(ContextMenuStrip_Opening);
  45. menuResizeTextbox.ValueChanged += new EventHandler(menuResizeTextbox_ValueChanged);
  46. }
  47. void menuResizeTextbox_ValueChanged(object sender, EventArgs e)
  48. {
  49. this.Relength((int)menuResizeTextbox.Value);
  50. }
  51. void ContextMenuStrip_Opening(object sender, System.ComponentModel.CancelEventArgs e)
  52. {
  53. menuResize.Enabled = (this.CreateDefaultObject != null);
  54. menuResizeTextbox.Value = this.list.Items.Count;
  55. }
  56. void Relength(int newsize)
  57. {
  58. if (newsize == this.list.Items.Count)
  59. return;
  60. else if (newsize > this.list.Items.Count)
  61. {
  62. int count = newsize - this.list.Items.Count;
  63. for (int i = 0; i < count; i++)
  64. {
  65. this.list.Items.Add(this.CreateDefaultObject());
  66. }
  67. MakeDirty();
  68. }
  69. else if (newsize < this.list.Items.Count)
  70. {
  71. int count = this.list.Items.Count;
  72. for (int i = newsize; i < count; i++)
  73. {
  74. this.list.Items.RemoveAt(newsize);
  75. }
  76. MakeDirty();
  77. }
  78. }
  79. //Still loving my tree, but losing you.
  80. void Con_DirtyChanged(object sender, EventArgs e)
  81. {
  82. MakeDirty();
  83. }
  84. int lastIndex = -1;
  85. void list_SelectedIndexChanged(object sender, EventArgs e)
  86. {
  87. if (lastIndex >= 0)
  88. {
  89. int id = lastIndex;
  90. lastIndex = -1;
  91. try
  92. {
  93. list.Items[id] = con.SelectedItem;
  94. }
  95. catch { }
  96. }
  97. lastIndex = list.SelectedIndex;
  98. if (list.SelectedItem != null)
  99. con.SelectedItem = list.SelectedItem;
  100. }
  101. public override void Commit()
  102. {
  103. object[] ret = new object[this.list.Items.Count];
  104. this.list.Items.CopyTo(ret, 0);
  105. if (selectedItem is List<object>)
  106. selectedItem = new List<object>(ret);
  107. else
  108. selectedItem = ret;
  109. }
  110. public class ArrayListbox : UI.LynnListbox
  111. {
  112. protected override string GetString(int id)
  113. {
  114. return String.Format("{0:D3}: {1}", id + 1, this.Items[id].ToString());
  115. }
  116. }
  117. public bool CanCut
  118. {
  119. get { return this.CanCopy && this.CanDelete; }
  120. }
  121. public bool CanCopy
  122. {
  123. get { return this.list.SelectedItem != null && this.ClipboardFormat != null; }
  124. }
  125. public bool CanPaste
  126. {
  127. get {
  128. if (this.ClipboardFormat == null) return false;
  129. return System.Windows.Forms.Clipboard.ContainsData(this.ClipboardFormat);
  130. }
  131. }
  132. public void Cut()
  133. {
  134. Copy(); Delete();
  135. MakeDirty();
  136. }
  137. public void Copy()
  138. {
  139. System.Windows.Forms.DataObject db = new System.Windows.Forms.DataObject();
  140. db.SetData(this.ClipboardFormat, this.DumpObject(this.list.SelectedItem));
  141. System.Windows.Forms.Clipboard.SetDataObject(db, true, 5, 100);
  142. }
  143. public void Paste()
  144. {
  145. object data = System.Windows.Forms.Clipboard.GetData(this.ClipboardFormat);
  146. byte[] buffer;
  147. if (data is System.IO.MemoryStream)
  148. {
  149. System.IO.MemoryStream ms = data as System.IO.MemoryStream;
  150. buffer = new byte[ms.Length];
  151. ms.Read(buffer, 0, (int)ms.Length);
  152. ms.Dispose();
  153. }
  154. else if (data is byte[])
  155. {
  156. buffer = data as byte[];
  157. }
  158. else { return; }
  159. this.lastIndex = -1;
  160. this.list.Items[this.list.SelectedIndex] = this.LoadObject(buffer);
  161. con.SelectedItem = this.list.Items[this.list.SelectedIndex];
  162. MakeDirty();
  163. }
  164. public bool CanDelete
  165. {
  166. get { return this.list.SelectedItem != null && this.CreateDefaultObject != null; }
  167. }
  168. public void Delete()
  169. {
  170. this.lastIndex = -1;
  171. this.list.Items[this.list.SelectedIndex] = this.CreateDefaultObject();
  172. con.SelectedItem = this.list.Items[this.list.SelectedIndex];
  173. MakeDirty();
  174. }
  175. public CreateDefaultObjectDelegate CreateDefaultObject;
  176. public DumpObjectDelegate DumpObject;
  177. public LoadObjectDelegate LoadObject;
  178. public string ClipboardFormat;
  179. public delegate object CreateDefaultObjectDelegate();
  180. public delegate byte[] DumpObjectDelegate(object obj);
  181. public delegate object LoadObjectDelegate(byte[] obj);
  182. protected override void InitControl()
  183. {
  184. this.list.Items.Clear();
  185. if (selectedItem is List<object>)
  186. foreach (var item in (selectedItem as System.Collections.IEnumerable))
  187. {
  188. this.list.Items.Add(item);
  189. }
  190. else
  191. this.list.Items.AddRange(selectedItem as object[]);
  192. lastIndex = -1;
  193. this.list.SelectedIndex = 0;
  194. }
  195. public override System.Windows.Forms.Control Control
  196. {
  197. get { return this.split; }
  198. }
  199. }
  200. }