1 |
using System; |
2 |
using System.Collections.Generic; |
3 |
using System.ComponentModel; |
4 |
using System.Drawing; |
5 |
using System.Data; |
6 |
using System.Linq; |
7 |
using System.Text; |
8 |
using System.Windows.Forms; |
9 |
using Utilities.TransparentControls.ListView; |
10 |
using System.IO; |
11 |
using RomCheater.Logging; |
12 |
using RomCheater.Docking.MemorySearch; |
13 |
|
14 |
namespace System.Windows.Forms |
15 |
{ |
16 |
[Serializable] |
17 |
public partial class AddressValuePairList : dbufferedListView, IAvpExport, IAvpImport, IAvpLvSupport, IAvpLvColumnSupport, IAvpFreeze |
18 |
{ |
19 |
|
20 |
|
21 |
public class AddressValuePairListSorter : System.Collections.IComparer |
22 |
{ |
23 |
|
24 |
public int Compare(object o1, object o2) |
25 |
{ |
26 |
if (!(o1 is ListViewItem)) |
27 |
return (0); |
28 |
if (!(o2 is ListViewItem)) |
29 |
return (0); |
30 |
ListViewItem lvi1 = (ListViewItem)o1; |
31 |
ListViewItem lvi2 = (ListViewItem)o2; |
32 |
int result = 0; |
33 |
if (ByColumn > 0) |
34 |
{ |
35 |
string str1 = lvi1.SubItems[ByColumn].Text; |
36 |
string str2 = lvi2.SubItems[ByColumn].Text; |
37 |
if (lvi1.ListView.Sorting == SortOrder.Ascending) |
38 |
result = String.Compare(str1, str2); |
39 |
else |
40 |
result = String.Compare(str2, str1); |
41 |
} |
42 |
else |
43 |
{ |
44 |
if (lvi1.ListView.Sorting == SortOrder.Ascending) |
45 |
result = String.Compare(lvi1.ImageKey, lvi2.ImageKey); |
46 |
else |
47 |
result = String.Compare(lvi2.ImageKey, lvi1.ImageKey); |
48 |
} |
49 |
|
50 |
//LastSort = ByColumn; |
51 |
|
52 |
return (result); |
53 |
} |
54 |
public int ByColumn |
55 |
{ |
56 |
get { return Column; } |
57 |
set { Column = value; } |
58 |
} |
59 |
int Column = 0; |
60 |
|
61 |
//public int LastSort |
62 |
//{ |
63 |
// get { return LastColumn; } |
64 |
// set { LastColumn = value; } |
65 |
//} |
66 |
//int LastColumn = 0; |
67 |
} |
68 |
|
69 |
private delegate ListViewItem ThreadSafe_GetResultItem(int index); |
70 |
private ResultItem GetResultItem(int index) |
71 |
{ |
72 |
AddressValuePairList lv = this; |
73 |
ResultItem item = (ResultItem)lv.Items[index].Clone(); |
74 |
return item; |
75 |
} |
76 |
|
77 |
private ImageList icon_list; |
78 |
|
79 |
int UKNOWN_COLUMN_COUNT = 0; |
80 |
|
81 |
private string ColumnTextChecker(string ColumnName) |
82 |
{ |
83 |
string _column_text = ColumnName; |
84 |
if (_column_text == new AVPColumnText(AVPColumnType.UKNOWN).ColumnText) |
85 |
{ |
86 |
_column_text = string.Format("{0} {1:00}", ColumnName, UKNOWN_COLUMN_COUNT); |
87 |
UKNOWN_COLUMN_COUNT++; |
88 |
return _column_text; |
89 |
} |
90 |
else |
91 |
{ |
92 |
return _column_text; |
93 |
} |
94 |
} |
95 |
|
96 |
public AddressValuePairList() |
97 |
: base() |
98 |
{ |
99 |
InitializeComponent(); |
100 |
|
101 |
icon_list = new ImageList(); |
102 |
icon_list.Images.Add(AVPIconKeys.FROZEN, RomCheater.Properties.Resources.freeze); |
103 |
icon_list.Images.Add(AVPIconKeys.NOTFROZEN, RomCheater.Properties.Resources.notfreeze); |
104 |
|
105 |
this.SmallImageList = icon_list; |
106 |
this.LargeImageList = icon_list; |
107 |
this.FullRowSelect = true; |
108 |
this.AllowColumnReorder = true; |
109 |
|
110 |
this.HideSelection = false; |
111 |
this.MultiSelect = true; |
112 |
|
113 |
_Items = new ResultItemCollection(this); |
114 |
AVPColumnText col_text = new AVPColumnText(); |
115 |
// Icon |
116 |
col_text = new AVPColumnText(AVPColumnType.ICON); |
117 |
this.Columns.Add(col_text.ColumnKey, ColumnTextChecker(col_text.ColumnText), col_text.ColumnWidth); |
118 |
// Address |
119 |
col_text = new AVPColumnText(AVPColumnType.ADDRESS); |
120 |
this.Columns.Add(col_text.ColumnKey, ColumnTextChecker(col_text.ColumnText), col_text.ColumnWidth); |
121 |
// Value |
122 |
col_text = new AVPColumnText(AVPColumnType.VALUE); |
123 |
this.Columns.Add(col_text.ColumnKey, ColumnTextChecker(col_text.ColumnText), col_text.ColumnWidth); |
124 |
// Is Frozen |
125 |
col_text = new AVPColumnText(AVPColumnType.FROZEN); |
126 |
this.Columns.Add(col_text.ColumnKey, ColumnTextChecker(col_text.ColumnText), col_text.ColumnWidth); |
127 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
128 |
// Freeze button |
129 |
col_text = new AVPColumnText(AVPColumnType.FREEZE_BUTTON); |
130 |
this.Columns.Add(col_text.ColumnKey, ColumnTextChecker(col_text.ColumnText), col_text.ColumnWidth); |
131 |
#endif |
132 |
#if USE_FAKE_LV_ITEM |
133 |
uint address = 0x200; |
134 |
byte value = 0x10; |
135 |
bool frozen = true; |
136 |
ResultItem item = new ResultItem(address, frozen, value); |
137 |
ResultDataType result = (ResultDataType)item.Tag; |
138 |
//// if USE_FAKE_LV_ITEM is defined these will assert that everything is correct |
139 |
//// Debug Assert: Address |
140 |
//Debug.Assert(result.Address == address, string.Format("Address: 0x{0:x8} != 0x{1:x8}", result.Address, address)); |
141 |
//// Debug Assert: Value |
142 |
//Debug.Assert((short)result.Value == value, string.Format("Value: 0x{0:x16} != 0x{1:x16}", result.Value, (object)value)); |
143 |
//// Debug Assert: IsFrozen |
144 |
//Debug.Assert(result.IsFrozen == frozen, string.Format("Frozen: {0} != {1}", result.IsFrozen, frozen)); |
145 |
this.Items.Add(item); |
146 |
#endif |
147 |
|
148 |
this.ColumnClick += new ColumnClickEventHandler(AddressValuePairList_ColumnClick); |
149 |
|
150 |
|
151 |
} |
152 |
|
153 |
void AddressValuePairList_ColumnClick(object sender, ColumnClickEventArgs e) |
154 |
{ |
155 |
AddressValuePairListSorter sorter = new AddressValuePairListSorter(); |
156 |
this.ListViewItemSorter = sorter; |
157 |
if (!(this.ListViewItemSorter is AddressValuePairListSorter)) |
158 |
return; |
159 |
sorter = (AddressValuePairListSorter)this.ListViewItemSorter; |
160 |
//if (sorter.LastSort == e.Column) |
161 |
//{ |
162 |
// if (this.Sorting == SortOrder.Ascending) |
163 |
// this.Sorting = SortOrder.Descending; |
164 |
// else |
165 |
// this.Sorting = SortOrder.Ascending; |
166 |
//} |
167 |
//else |
168 |
//{ |
169 |
// this.Sorting = SortOrder.Descending; |
170 |
//} |
171 |
if (this.Sorting == SortOrder.Ascending) |
172 |
{ |
173 |
this.Sorting = SortOrder.Descending; |
174 |
} |
175 |
else |
176 |
{ |
177 |
this.Sorting = SortOrder.Ascending; |
178 |
} |
179 |
sorter.ByColumn = e.Column; |
180 |
|
181 |
this.Sort(); |
182 |
} |
183 |
|
184 |
private string WriteResultItem(ResultItem item) |
185 |
{ |
186 |
ResultDataType _result = (ResultDataType)item.Tag; |
187 |
|
188 |
return string.Format("{0},{1},{2},{3},{4}", |
189 |
item.SubItems[GetColumnByType(AVPColumnType.ADDRESS)].Text, |
190 |
item.SubItems[GetColumnByType(AVPColumnType.VALUE)].Text, |
191 |
item.SubItems[GetColumnByType(AVPColumnType.FROZEN)].Text, |
192 |
_result.ValueType, |
193 |
_result.IsUnsigned); |
194 |
} |
195 |
|
196 |
#region IAvpExport Members |
197 |
public bool ExportToClipboard() |
198 |
{ |
199 |
if (!(this.Items.Count > 0)) return false; |
200 |
try |
201 |
{ |
202 |
StringBuilder builder = new StringBuilder(); |
203 |
foreach (ResultItem item in this.Items) |
204 |
{ |
205 |
builder.Append(this.WriteResultItem(item)); |
206 |
builder.AppendLine(); |
207 |
} |
208 |
Clipboard.SetText(builder.ToString()); |
209 |
return true; |
210 |
} |
211 |
catch { return false; } |
212 |
} |
213 |
public bool ExportToFile(string filename) |
214 |
{ |
215 |
if (!(this.Items.Count > 0)) return false; |
216 |
|
217 |
FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write); |
218 |
StreamWriter sw = new StreamWriter(fs); |
219 |
foreach (ResultItem item in this.Items) |
220 |
{ |
221 |
sw.Write(this.WriteResultItem(item)); |
222 |
sw.WriteLine(); |
223 |
} |
224 |
sw.Flush(); |
225 |
sw.Close(); |
226 |
|
227 |
return true; |
228 |
} |
229 |
public bool ExportToFile() |
230 |
{ |
231 |
DialogResult result = ResultsSaver.ShowDialog(); |
232 |
if (result != DialogResult.OK) return false; |
233 |
string filename = ResultsSaver.FileName; |
234 |
return this.ExportToFile(filename); |
235 |
} |
236 |
#endregion |
237 |
#region IAvpImport Members |
238 |
public bool ImportFromClipboard() |
239 |
{ |
240 |
try |
241 |
{ |
242 |
string clipboard_data = (string)Clipboard.GetData(System.Windows.Forms.DataFormats.Text); |
243 |
|
244 |
MemoryStream ms = new MemoryStream(ASCIIEncoding.ASCII.GetBytes(clipboard_data)); |
245 |
StreamReader sr = new StreamReader(ms); |
246 |
this.Items.Clear(); |
247 |
List<ResultItem> patch_item_list = new List<ResultItem>(); |
248 |
|
249 |
while (!sr.EndOfStream) |
250 |
{ |
251 |
string line = sr.ReadLine(); |
252 |
string[] tokenized_line = line.Split(','); |
253 |
string Address = tokenized_line[0]; |
254 |
string Value = tokenized_line[1]; |
255 |
string Frozen = tokenized_line[2]; |
256 |
|
257 |
string _data_type = tokenized_line[3]; |
258 |
string IsUnsigned = tokenized_line[4]; |
259 |
bool _IsUnsigned = false; |
260 |
switch (IsUnsigned.ToLower()) |
261 |
{ |
262 |
case "true": _IsUnsigned = true; break; |
263 |
case "false": _IsUnsigned = false; break; |
264 |
} |
265 |
int BIT_SIZE = -1; |
266 |
|
267 |
foreach (int val in Enum.GetValues(typeof(SearchDataTypes))) |
268 |
{ |
269 |
if (Enum.GetName(typeof(SearchDataTypes), val) == _data_type) |
270 |
{ |
271 |
BIT_SIZE = val; |
272 |
break; |
273 |
} |
274 |
} |
275 |
|
276 |
ResultItem item = new ResultItem(Address, Value, Frozen, (SearchDataTypes)BIT_SIZE, _IsUnsigned); |
277 |
patch_item_list.Add(item); |
278 |
} |
279 |
this.Items.AddRange(patch_item_list.ToArray()); |
280 |
sr.Close(); |
281 |
return true; |
282 |
} |
283 |
catch { return false; } |
284 |
|
285 |
} |
286 |
public bool ImportFromFile(string filename) |
287 |
{ |
288 |
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read); |
289 |
StreamReader sr = new StreamReader(fs); |
290 |
|
291 |
this.Items.Clear(); |
292 |
List<ResultItem> patch_item_list = new List<ResultItem>(); |
293 |
|
294 |
while (!sr.EndOfStream) |
295 |
{ |
296 |
string line = sr.ReadLine(); |
297 |
string[] tokenized_line = line.Split(','); |
298 |
string Address = tokenized_line[0]; |
299 |
string Value = tokenized_line[1]; |
300 |
string Frozen = tokenized_line[2]; |
301 |
|
302 |
string _data_type = tokenized_line[3]; |
303 |
string IsUnsigned = tokenized_line[4]; |
304 |
bool _IsUnsigned = false; |
305 |
switch (IsUnsigned.ToLower()) |
306 |
{ |
307 |
case "true": _IsUnsigned = true; break; |
308 |
case "false": _IsUnsigned = false; break; |
309 |
} |
310 |
int BIT_SIZE = -1; |
311 |
|
312 |
foreach (int val in Enum.GetValues(typeof(SearchDataTypes))) |
313 |
{ |
314 |
if (Enum.GetName(typeof(SearchDataTypes), val) == _data_type) |
315 |
{ |
316 |
BIT_SIZE = val; |
317 |
break; |
318 |
} |
319 |
} |
320 |
|
321 |
ResultItem item = new ResultItem(Address, Value, Frozen, (SearchDataTypes)BIT_SIZE, _IsUnsigned); |
322 |
patch_item_list.Add(item); |
323 |
} |
324 |
this.Items.AddRange(patch_item_list.ToArray()); |
325 |
sr.Close(); |
326 |
return true; |
327 |
} |
328 |
public bool ImportFromFile() |
329 |
{ |
330 |
DialogResult result = ResultsLoader.ShowDialog(); |
331 |
if (result != DialogResult.OK) return false; |
332 |
string filename = ResultsLoader.FileName; |
333 |
return this.ImportFromFile(filename); |
334 |
} |
335 |
#endregion |
336 |
#region IAvpLvSupport Members |
337 |
private bool DONOT_USE_DETAILS_VIEW_BY_DEFAULT = false; |
338 |
public bool OverrideDetailsViewByDefault { get { return DONOT_USE_DETAILS_VIEW_BY_DEFAULT; } set { DONOT_USE_DETAILS_VIEW_BY_DEFAULT = value; } } |
339 |
public new System.Windows.Forms.View View { get { return base.View; } set { if (this.OverrideDetailsViewByDefault) { base.View = value; } else { base.View = View.Details; } } } |
340 |
public new ListView.ColumnHeaderCollection Columns |
341 |
{ |
342 |
get |
343 |
{ |
344 |
return base.Columns; |
345 |
} |
346 |
} |
347 |
private ResultItemCollection _Items; |
348 |
public new ResultItemCollection Items |
349 |
{ |
350 |
get |
351 |
{ |
352 |
return _Items; |
353 |
} |
354 |
} |
355 |
#endregion |
356 |
#region IAvpLvColumnSupport Members |
357 |
public int GetColumnByType(AVPColumnType AVPColType) |
358 |
{ |
359 |
return GetColumnByKey(Enum.GetName(typeof(AVPColumnType), AVPColType)); |
360 |
} |
361 |
public int GetColumnByKey(string AVPColType) |
362 |
{ |
363 |
List<string> avp_cols = new List<string>(); |
364 |
|
365 |
foreach (int val in Enum.GetValues(typeof(AVPColumnType))) |
366 |
{ |
367 |
avp_cols.Add(Enum.GetName(typeof(AVPColumnType), val)); |
368 |
} |
369 |
|
370 |
int index = -1; |
371 |
bool foundColumn = false; |
372 |
foreach (string col in avp_cols) |
373 |
{ |
374 |
if (AVPColType == col) |
375 |
{ |
376 |
foundColumn = true; |
377 |
break; |
378 |
} |
379 |
} |
380 |
if (!foundColumn) |
381 |
{ |
382 |
index = -1; |
383 |
} |
384 |
else |
385 |
{ |
386 |
index = this.Columns[AVPColType].Index; |
387 |
} |
388 |
|
389 |
return index; |
390 |
} |
391 |
#endregion |
392 |
#region IAvpFreeze Members |
393 |
private List<int> FrozenIndexes = new List<int>(); |
394 |
public bool ItemIsFrozen(int index) |
395 |
{ |
396 |
return FrozenIndexes.Contains(index) && (this.Items[index].Tag as ResultDataType).IsFrozen; |
397 |
} |
398 |
public void FreezeItem(int index) |
399 |
{ |
400 |
if (!(this.ItemIsFrozen(index))) |
401 |
{ |
402 |
FrozenIndexes.Add(index); |
403 |
this.Items[index].ImageKey = AVPIconKeys.FROZEN; |
404 |
this.Items[index].SubItems[new AVPColumnText(AVPColumnType.FROZEN).ColumnIndex].Text = true.ToString(); |
405 |
ResultDataType tmp_result = (ResultDataType)this.Items[index].Tag; |
406 |
|
407 |
string Address = this.Items[index].SubItems[new AVPColumnText(AVPColumnType.ADDRESS).ColumnIndex].Text; |
408 |
string Frozen = this.Items[index].SubItems[new AVPColumnText(AVPColumnType.FROZEN).ColumnIndex].Text; |
409 |
object Value = Convert.ToUInt64(this.Items[index].SubItems[new AVPColumnText(AVPColumnType.FROZEN).ColumnIndex].Text, 16); |
410 |
|
411 |
SearchDataTypes ValueType = tmp_result.ValueType; |
412 |
|
413 |
ResultDataType result = new ResultDataType(Convert.ToUInt32(Address, 16), Convert.ToBoolean(Frozen), Value, ValueType); |
414 |
result.IsFrozen = true; |
415 |
this.Items[index].Tag = result; |
416 |
ResultItem temp = (ResultItem)this.Items[index]; |
417 |
this.Items[index].Remove(); |
418 |
this.Items.Insert(index, temp); |
419 |
this.Refresh(); |
420 |
this.Update(); |
421 |
} |
422 |
} |
423 |
public void ThawItem(int index) |
424 |
{ |
425 |
if (this.ItemIsFrozen(index)) |
426 |
{ |
427 |
FrozenIndexes.Remove(index); |
428 |
this.Items[index].ImageKey = AVPIconKeys.NOTFROZEN; |
429 |
this.Items[index].SubItems[new AVPColumnText(AVPColumnType.FROZEN).ColumnIndex].Text = false.ToString(); |
430 |
ResultDataType result = (ResultDataType)this.Items[index].Tag; |
431 |
result.IsFrozen = false; |
432 |
this.Items[index].Tag = result; |
433 |
ResultItem temp = (ResultItem)this.Items[index]; |
434 |
this.Items[index].Remove(); |
435 |
this.Items.Insert(index, temp); |
436 |
this.Refresh(); |
437 |
this.Update(); |
438 |
} |
439 |
} |
440 |
private int _ProcessID; |
441 |
public int ProcessID { get { return _ProcessID; } set { _ProcessID = value; } } |
442 |
#endregion |
443 |
|
444 |
private void freezer_Tick(object sender, EventArgs e) |
445 |
{ |
446 |
if (!(FrozenIndexes.Count > 0)) return; |
447 |
if (!(patcherwriter.IsBusy)) |
448 |
patcherwriter.RunWorkerAsync(); |
449 |
} |
450 |
|
451 |
private void patcherwriter_DoWork(object sender, DoWorkEventArgs e) |
452 |
{ |
453 |
for (int i = 0; i < FrozenIndexes.Count; i++) |
454 |
{ |
455 |
if (patcherwriter.CancellationPending) |
456 |
{ |
457 |
e.Cancel = true; |
458 |
return; |
459 |
} |
460 |
int index = FrozenIndexes[i]; |
461 |
ResultItem iter = null; |
462 |
if (this.InvokeRequired) |
463 |
{ |
464 |
ThreadSafe_GetResultItem _get_item = new ThreadSafe_GetResultItem(GetResultItem); |
465 |
object item = this.Invoke(_get_item, new object[] { index }); |
466 |
if (item != null) |
467 |
iter = (ResultItem)item; |
468 |
} |
469 |
else |
470 |
{ |
471 |
iter = (ResultItem)this.Items[index]; |
472 |
} |
473 |
Sojaner.MemoryScanner.ProcessMemoryReader writer = new Sojaner.MemoryScanner.ProcessMemoryReader(); |
474 |
ResultDataType result = (ResultDataType)iter.Tag; |
475 |
uint Address = result.Address; |
476 |
byte[] bitData = new byte[] { }; |
477 |
switch (result.ValueType) |
478 |
{ |
479 |
case SearchDataTypes._8bits: |
480 |
if (result.IsUnsigned) { writer.PatchMemory(Address, Convert.ToByte(result.Value)); } |
481 |
else { writer.PatchMemory(Address, Convert.ToSByte(result.Value)); } |
482 |
break; |
483 |
case SearchDataTypes._16bits: |
484 |
if (result.IsUnsigned) { writer.PatchMemory(Address, Convert.ToUInt16(result.Value)); } |
485 |
else { writer.PatchMemory(Address, Convert.ToInt16(result.Value)); } |
486 |
break; |
487 |
case SearchDataTypes._32bits: |
488 |
if (result.IsUnsigned) { writer.PatchMemory(Address, Convert.ToUInt32(result.Value)); } |
489 |
else { writer.PatchMemory(Address, Convert.ToInt32(result.Value)); } |
490 |
break; |
491 |
case SearchDataTypes._64bits: |
492 |
if (result.IsUnsigned) { writer.PatchMemory(Address, Convert.ToUInt64(result.Value)); } |
493 |
else { writer.PatchMemory(Address, Convert.ToInt64(result.Value)); } |
494 |
break; |
495 |
} |
496 |
} |
497 |
} |
498 |
|
499 |
private void patcherwriter_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) |
500 |
{ |
501 |
if (FrozenIndexes.Count > 0) // only run if we have frozen patches |
502 |
patcherwriter.RunWorkerAsync(); // restart the freeze operation |
503 |
} |
504 |
} |
505 |
|
506 |
public enum AVPColumnType |
507 |
{ |
508 |
ICON, |
509 |
ADDRESS, |
510 |
VALUE, |
511 |
FROZEN, |
512 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
513 |
FREEZE_BUTTON, |
514 |
#endif |
515 |
UKNOWN = 0x6000 |
516 |
} |
517 |
|
518 |
#region ResultItem |
519 |
|
520 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
521 |
public class ListviewSubItemButton : ListViewItem.ListViewSubItem |
522 |
{ |
523 |
} |
524 |
public class ListViewFreezeToggle : ListviewSubItemButton |
525 |
{ |
526 |
public ListViewFreezeToggle() : this(false) { } |
527 |
public ListViewFreezeToggle(bool frozen) { this.ToggleText(frozen); } |
528 |
|
529 |
public void ToggleText(bool frozen) |
530 |
{ |
531 |
_Frozen = frozen; |
532 |
if (frozen) { this.Text = "UnFreeze"; } |
533 |
else { this.Text = "Freeze"; } |
534 |
} |
535 |
public ListViewFreezeToggle Toggle(bool frozen) |
536 |
{ |
537 |
_Frozen = frozen; |
538 |
if (frozen) { this.Text = "UnFreeze"; } |
539 |
else { this.Text = "Freeze"; } |
540 |
|
541 |
return this; |
542 |
} |
543 |
private bool _Frozen; |
544 |
public bool Frozen |
545 |
{ |
546 |
get { return _Frozen; } |
547 |
} |
548 |
|
549 |
} |
550 |
#endif |
551 |
|
552 |
public class ResultItem : ListViewItem |
553 |
{ |
554 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
555 |
private ListViewFreezeToggle btnFreezeToggle; |
556 |
#endif |
557 |
|
558 |
public override string ToString() |
559 |
{ |
560 |
StringBuilder builder = new StringBuilder(); |
561 |
builder.Append("{"); |
562 |
builder.AppendFormat("{0},{1},{2}", |
563 |
this.SubItems[new AVPColumnText(AVPColumnType.ADDRESS).ColumnIndex].Text, |
564 |
this.SubItems[new AVPColumnText(AVPColumnType.VALUE).ColumnIndex].Text, |
565 |
this.SubItems[new AVPColumnText(AVPColumnType.FROZEN).ColumnIndex].Text); |
566 |
builder.Append(" {"); |
567 |
builder.AppendFormat("tag:{0}", (this.Tag as ResultDataType).ToString()); |
568 |
builder.Append("} "); |
569 |
builder.Append("}"); |
570 |
return builder.ToString(); |
571 |
} |
572 |
|
573 |
public ResultItem() |
574 |
: base() |
575 |
{ |
576 |
} |
577 |
private void initialize() { this.initialize(false); } |
578 |
private void initialize(bool frozen) |
579 |
{ |
580 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
581 |
btnFreezeToggle = new ListViewFreezeToggle(); |
582 |
btnFreezeToggle.Name = "btnFreezeToggle"; |
583 |
//btnFreezeToggle.Click += new EventHandler(btnFreezeToggle_Click); |
584 |
#endif |
585 |
this.Text = ""; |
586 |
if (frozen) |
587 |
{ |
588 |
this.ImageKey = AVPIconKeys.FROZEN; |
589 |
_isFrozen = true; |
590 |
} |
591 |
else |
592 |
{ |
593 |
this.ImageKey = AVPIconKeys.NOTFROZEN; |
594 |
_isFrozen = false; |
595 |
} |
596 |
} |
597 |
|
598 |
private bool _isFrozen = false; |
599 |
public bool ItemIsFrozen() |
600 |
{ |
601 |
return _isFrozen; |
602 |
} |
603 |
|
604 |
public void FreezeItem() |
605 |
{ |
606 |
this.ImageKey = AVPIconKeys.FROZEN; |
607 |
_isFrozen = true; |
608 |
} |
609 |
public void ThawItem() |
610 |
{ |
611 |
this.ImageKey = AVPIconKeys.NOTFROZEN; |
612 |
_isFrozen = false; |
613 |
} |
614 |
|
615 |
//void btnFreezeToggle_Click(object sender, EventArgs e) |
616 |
//{ |
617 |
// throw new NotImplementedException(); |
618 |
//} |
619 |
public ResultItem(string address) |
620 |
: base() |
621 |
{ |
622 |
this.initialize(); |
623 |
this.SubItems.Add(address); |
624 |
} |
625 |
public ResultItem(string address, string value, string frozen, SearchDataTypes bit_size, bool unsigned) |
626 |
: base() |
627 |
{ |
628 |
bool _frozen = false; |
629 |
if (frozen.ToLower() == "true") _frozen = true; |
630 |
this.initialize(_frozen); |
631 |
this.SubItems.Add(address); |
632 |
this.SubItems.Add(value); |
633 |
this.SubItems.Add(frozen); |
634 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
635 |
this.SubItems.Add(btnFreezeToggle.Toggle(frozen)); |
636 |
#endif |
637 |
ResultDataType resulttype = null; |
638 |
|
639 |
switch (bit_size) |
640 |
{ |
641 |
case SearchDataTypes._8bits: |
642 |
if (unsigned) { resulttype = new ResultDataType(Convert.ToUInt32(address, 16), _frozen, Convert.ToByte(value, 16)); } |
643 |
else { resulttype = new ResultDataType(Convert.ToUInt32(address, 16), _frozen, Convert.ToByte(value, 16)); } |
644 |
break; |
645 |
case SearchDataTypes._16bits: |
646 |
if (unsigned) { resulttype = new ResultDataType(Convert.ToUInt32(address, 16), _frozen, Convert.ToUInt16(value, 16)); } |
647 |
else { resulttype = new ResultDataType(Convert.ToUInt32(address, 16), _frozen, Convert.ToInt16(value, 16)); } |
648 |
break; |
649 |
case SearchDataTypes._32bits: |
650 |
if (unsigned) { resulttype = new ResultDataType(Convert.ToUInt32(address, 16), _frozen, Convert.ToUInt32(value, 16)); } |
651 |
else { resulttype = new ResultDataType(Convert.ToUInt32(address, 16), _frozen, Convert.ToInt32(value, 16)); } |
652 |
break; |
653 |
case SearchDataTypes._64bits: |
654 |
if (unsigned) { resulttype = new ResultDataType(Convert.ToUInt32(address, 16), _frozen, Convert.ToUInt64(value, 16)); } |
655 |
else { resulttype = new ResultDataType(Convert.ToUInt32(address, 16), _frozen, Convert.ToInt64(value, 16)); } |
656 |
break; |
657 |
|
658 |
} |
659 |
this.Tag = resulttype; |
660 |
} |
661 |
public ResultItem(uint address) |
662 |
: base() |
663 |
{ |
664 |
this.initialize(); |
665 |
this.SubItems.Add(string.Format("0x{0:x8}", address)); |
666 |
} |
667 |
public ResultItem(uint address, bool frozen) |
668 |
: base() |
669 |
{ |
670 |
this.initialize(frozen); |
671 |
this.SubItems.Add(string.Format("0x{0:x8}", address)); |
672 |
} |
673 |
public ResultItem(uint address, bool frozen, byte value) |
674 |
: base() |
675 |
{ |
676 |
this.initialize(frozen); |
677 |
this.SubItems.Add(string.Format("0x{0:x8}", address)); |
678 |
this.SubItems.Add(string.Format("0x{0:x2}", value)); |
679 |
this.SubItems.Add(frozen.ToString()); |
680 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
681 |
this.SubItems.Add(btnFreezeToggle.Toggle(frozen)); |
682 |
#endif |
683 |
ResultDataType resulttype = new ResultDataType(address, frozen, value); |
684 |
this.Tag = resulttype; |
685 |
} |
686 |
public ResultItem(uint address, bool frozen, sbyte value) |
687 |
: base() |
688 |
{ |
689 |
this.initialize(frozen); |
690 |
this.SubItems.Add(string.Format("0x{0:x8}", address)); |
691 |
this.SubItems.Add(string.Format("0x{0:x2}", value)); |
692 |
this.SubItems.Add(frozen.ToString()); |
693 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
694 |
this.SubItems.Add(btnFreezeToggle.Toggle(frozen)); |
695 |
#endif |
696 |
ResultDataType resulttype = new ResultDataType(address, frozen, value); |
697 |
this.Tag = resulttype; |
698 |
} |
699 |
public ResultItem(uint address, bool frozen, ushort value) |
700 |
: base() |
701 |
{ |
702 |
this.initialize(frozen); |
703 |
this.SubItems.Add(string.Format("0x{0:x8}", address)); |
704 |
this.SubItems.Add(string.Format("0x{0:x4}", value)); |
705 |
this.SubItems.Add(frozen.ToString()); |
706 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
707 |
this.SubItems.Add(btnFreezeToggle.Toggle(frozen)); |
708 |
#endif |
709 |
ResultDataType resulttype = new ResultDataType(address, frozen, value); |
710 |
this.Tag = resulttype; |
711 |
} |
712 |
public ResultItem(uint address, bool frozen, short value) |
713 |
: base() |
714 |
{ |
715 |
this.initialize(frozen); |
716 |
this.SubItems.Add(string.Format("0x{0:x8}", address)); |
717 |
this.SubItems.Add(string.Format("0x{0:x4}", value)); |
718 |
this.SubItems.Add(frozen.ToString()); |
719 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
720 |
this.SubItems.Add(btnFreezeToggle.Toggle(frozen)); |
721 |
#endif |
722 |
ResultDataType resulttype = new ResultDataType(address, frozen, value); |
723 |
this.Tag = resulttype; |
724 |
} |
725 |
public ResultItem(uint address, bool frozen, uint value) |
726 |
: base() |
727 |
{ |
728 |
this.initialize(frozen); |
729 |
this.SubItems.Add(string.Format("0x{0:x8}", address)); |
730 |
this.SubItems.Add(string.Format("0x{0:x8}", value)); |
731 |
this.SubItems.Add(frozen.ToString()); |
732 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
733 |
this.SubItems.Add(btnFreezeToggle.Toggle(frozen)); |
734 |
#endif |
735 |
ResultDataType resulttype = new ResultDataType(address, frozen, value); |
736 |
this.Tag = resulttype; |
737 |
} |
738 |
public ResultItem(uint address, bool frozen, int value) |
739 |
: base() |
740 |
{ |
741 |
this.initialize(frozen); |
742 |
this.SubItems.Add(string.Format("0x{0:x8}", address)); |
743 |
this.SubItems.Add(string.Format("0x{0:x8}", value)); |
744 |
this.SubItems.Add(frozen.ToString()); |
745 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
746 |
this.SubItems.Add(btnFreezeToggle.Toggle(frozen)); |
747 |
#endif |
748 |
ResultDataType resulttype = new ResultDataType(address, frozen, value); |
749 |
this.Tag = resulttype; |
750 |
} |
751 |
public ResultItem(uint address, bool frozen, ulong value) |
752 |
: base() |
753 |
{ |
754 |
this.initialize(frozen); |
755 |
this.SubItems.Add(string.Format("0x{0:x8}", address)); |
756 |
this.SubItems.Add(string.Format("0x{0:x16}", value)); |
757 |
this.SubItems.Add(frozen.ToString()); |
758 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
759 |
this.SubItems.Add(btnFreezeToggle.Toggle(frozen)); |
760 |
#endif |
761 |
ResultDataType resulttype = new ResultDataType(address, frozen, value); |
762 |
this.Tag = resulttype; |
763 |
} |
764 |
public ResultItem(uint address, bool frozen, long value) |
765 |
: base() |
766 |
{ |
767 |
this.initialize(frozen); |
768 |
this.SubItems.Add(string.Format("0x{0:x8}", address)); |
769 |
this.SubItems.Add(string.Format("0x{0:x16}", value)); |
770 |
this.SubItems.Add(frozen.ToString()); |
771 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
772 |
this.SubItems.Add(btnFreezeToggle.Toggle(frozen)); |
773 |
#endif |
774 |
ResultDataType resulttype = new ResultDataType(address, frozen, value); |
775 |
this.Tag = resulttype; |
776 |
} |
777 |
} |
778 |
public class ResultSubItem : ListViewItem.ListViewSubItem |
779 |
{ |
780 |
} |
781 |
[Serializable] |
782 |
public class ResultItemCollection : System.Windows.Forms.ListView.ListViewItemCollection |
783 |
{ |
784 |
public ResultItemCollection(ListView owner) |
785 |
: base(owner) |
786 |
{ |
787 |
} |
788 |
|
789 |
|
790 |
|
791 |
#region Overriden Members |
792 |
//#region This Members |
793 |
//public new ResultItem this[int index] |
794 |
//{ |
795 |
// get |
796 |
// { |
797 |
// return base[index] as ResultItem; |
798 |
// } |
799 |
// set |
800 |
// { |
801 |
// base[index] = value as ListViewItem; |
802 |
// } |
803 |
//} |
804 |
//public new ResultItem this[string key] |
805 |
//{ |
806 |
// get |
807 |
// { |
808 |
// return base[key] as ResultItem; |
809 |
// } |
810 |
//} |
811 |
//#endregion |
812 |
#region Add Members |
813 |
|
814 |
public ResultItem Add(ResultItem value) |
815 |
{ |
816 |
return (ResultItem)base.Add(value); |
817 |
} |
818 |
|
819 |
public override ListViewItem Add(ListViewItem value) |
820 |
{ |
821 |
return base.Add(value); |
822 |
} |
823 |
public override ListViewItem Add(string key, string text, int imageIndex) |
824 |
{ |
825 |
return base.Add(key, text, imageIndex); |
826 |
} |
827 |
public override ListViewItem Add(string key, string text, string imageKey) |
828 |
{ |
829 |
return base.Add(key, text, imageKey); |
830 |
} |
831 |
public override ListViewItem Add(string text) |
832 |
{ |
833 |
return base.Add(text); |
834 |
} |
835 |
public override ListViewItem Add(string text, int imageIndex) |
836 |
{ |
837 |
return base.Add(text, imageIndex); |
838 |
} |
839 |
public override ListViewItem Add(string text, string imageKey) |
840 |
{ |
841 |
return base.Add(text, imageKey); |
842 |
} |
843 |
#endregion |
844 |
#region Remove Members |
845 |
public override void Remove(ListViewItem item) |
846 |
{ |
847 |
base.Remove(item); |
848 |
} |
849 |
#endregion |
850 |
|
851 |
#region Contains Members |
852 |
public new bool Contains(ListViewItem item) |
853 |
{ |
854 |
try |
855 |
{ |
856 |
return this.Contains((ResultItem)item); |
857 |
} |
858 |
catch (InvalidCastException ex) |
859 |
{ |
860 |
Exception ex1 = new Exception("Unable to Convert ListViewItem to ResultItem in ResultItemCollection.Contains(ListViewItem item)", ex); |
861 |
logger.Error.WriteLine("avp.contains(ListViewItem item): invalid cast"); |
862 |
logger.Error.WriteLine(ex1.ToString()); |
863 |
return false; |
864 |
} |
865 |
catch (Exception ex) |
866 |
{ |
867 |
logger.Error.WriteLine("avp.contains(): exception"); |
868 |
logger.Error.WriteLine(ex.ToString()); |
869 |
return false; |
870 |
} |
871 |
} |
872 |
public bool Contains(ResultItem item) |
873 |
{ |
874 |
try |
875 |
{ |
876 |
//ResultItem _item = (ResultItem)item; |
877 |
|
878 |
bool contains = false; |
879 |
if (!(this.Count > 0)) return false; |
880 |
foreach (ResultItem iter in this) |
881 |
{ |
882 |
if (item.ToString() == iter.ToString()) contains = true; |
883 |
} |
884 |
return contains; |
885 |
} |
886 |
catch (IndexOutOfRangeException) |
887 |
{ |
888 |
return false; |
889 |
} |
890 |
catch (ArgumentOutOfRangeException) |
891 |
{ |
892 |
return false; |
893 |
} |
894 |
catch (Exception ex) |
895 |
{ |
896 |
Exception ex1 = new Exception("Caught non-Argument or Index OutOfRangeException in: ResultItemCollection.Contains(ListViewItem item, int index)", ex); |
897 |
logger.Error.WriteLine("avp.contains(ResultItem item): Exception"); |
898 |
logger.Error.WriteLine(ex1.ToString()); |
899 |
return false; |
900 |
} |
901 |
} |
902 |
public override bool ContainsKey(string key) |
903 |
{ |
904 |
return base.ContainsKey(key); |
905 |
} |
906 |
#endregion |
907 |
|
908 |
#endregion |
909 |
} |
910 |
#endregion |
911 |
|
912 |
public interface IAvpFreeze |
913 |
{ |
914 |
bool ItemIsFrozen(int index); |
915 |
void FreezeItem(int index); |
916 |
void ThawItem(int index); |
917 |
int ProcessID { get; set; } |
918 |
} |
919 |
|
920 |
public interface IAvpExport |
921 |
{ |
922 |
bool ExportToClipboard(); |
923 |
bool ExportToFile(); |
924 |
bool ExportToFile(string filename); |
925 |
} |
926 |
public interface IAvpImport |
927 |
{ |
928 |
bool ImportFromClipboard(); |
929 |
bool ImportFromFile(); |
930 |
bool ImportFromFile(string filename); |
931 |
} |
932 |
public interface IAvpLvSupport |
933 |
{ |
934 |
System.Windows.Forms.View View { get; set; } |
935 |
bool OverrideDetailsViewByDefault { get; set; } |
936 |
ListView.ColumnHeaderCollection Columns { get; } |
937 |
ResultItemCollection Items { get; } |
938 |
} |
939 |
public interface IAvpLvColumnSupport |
940 |
{ |
941 |
int GetColumnByType(AVPColumnType AVPColumnType); |
942 |
int GetColumnByKey(string AVPColumnType); |
943 |
} |
944 |
|
945 |
public class AVPIconKeys |
946 |
{ |
947 |
public const string FROZEN = "FROZEN"; |
948 |
public const string NOTFROZEN = "NOTFROZEN"; |
949 |
} |
950 |
|
951 |
#region AVPColumnText Sub-Class |
952 |
public interface IAVPColumnText |
953 |
{ |
954 |
string ColumnText { get; } |
955 |
string ColumnKey { get; } |
956 |
int ColumnIndex { get; } |
957 |
int ColumnWidth { get; } |
958 |
} |
959 |
public class AVPColumnText : IAVPColumnText |
960 |
{ |
961 |
private const string FREEZE_ICON = ""; |
962 |
private const int FREEZE_ICON_WIDTH = 32; |
963 |
private const int FREEZE_ICON_INDEX = 0; |
964 |
private const string ADDRESS = "Address"; |
965 |
private const int ADDRESS_WIDTH = 120; |
966 |
private const int ADDRESS_INDEX = 1; |
967 |
private const string VALUE = "Value"; |
968 |
private const int VALUE_WIDTH = 220; |
969 |
private const int VALUE_INDEX = 2; |
970 |
private const string FROZEN = "Is Frozen"; |
971 |
private const int FROZEN_WIDTH = 120; |
972 |
private const int FROZEN_INDEX = 3; |
973 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
974 |
private const string FREEZEBUTTON = "Freeze Toggle"; |
975 |
private const int FREEZEBUTTON_WIDTH = 160; |
976 |
#endif |
977 |
private const string UKNOWN = "Unknown"; |
978 |
private const int UKNOWN_WIDTH = 125; |
979 |
private const int UKNOWN_INDEX = -1; |
980 |
|
981 |
private AVPColumnType _AVPColumnType; |
982 |
public AVPColumnText() |
983 |
{ |
984 |
_AVPColumnType = AVPColumnType.UKNOWN; |
985 |
} |
986 |
public AVPColumnText(AVPColumnType AVPColumnType) |
987 |
{ |
988 |
_AVPColumnType = AVPColumnType; |
989 |
} |
990 |
|
991 |
#region IAVPColumnText Members |
992 |
#region ColumnText |
993 |
public string ColumnText |
994 |
{ |
995 |
get |
996 |
{ |
997 |
switch (_AVPColumnType) |
998 |
{ |
999 |
case AVPColumnType.ICON: |
1000 |
return FREEZE_ICON; |
1001 |
case AVPColumnType.ADDRESS: |
1002 |
return ADDRESS; |
1003 |
case AVPColumnType.VALUE: |
1004 |
return VALUE; |
1005 |
case AVPColumnType.FROZEN: |
1006 |
return FROZEN; |
1007 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
1008 |
case AVPColumnType.FREEZE_BUTTON: |
1009 |
return FREEZEBUTTON; |
1010 |
#endif |
1011 |
default: |
1012 |
return UKNOWN; |
1013 |
} |
1014 |
} |
1015 |
} |
1016 |
#endregion |
1017 |
#region ColumnKey |
1018 |
public string ColumnKey |
1019 |
{ |
1020 |
get |
1021 |
{ |
1022 |
return Enum.GetName(typeof(AVPColumnType), _AVPColumnType); |
1023 |
} |
1024 |
} |
1025 |
#endregion |
1026 |
#region ColumnWidth |
1027 |
public int ColumnWidth |
1028 |
{ |
1029 |
get |
1030 |
{ |
1031 |
switch (_AVPColumnType) |
1032 |
{ |
1033 |
case AVPColumnType.ICON: |
1034 |
return FREEZE_ICON_WIDTH; |
1035 |
case AVPColumnType.ADDRESS: |
1036 |
return ADDRESS_WIDTH; |
1037 |
case AVPColumnType.VALUE: |
1038 |
return VALUE_WIDTH; |
1039 |
case AVPColumnType.FROZEN: |
1040 |
return FROZEN_WIDTH; |
1041 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
1042 |
case AVPColumnType.FREEZE_BUTTON: |
1043 |
return FREEZEBUTTON_WIDTH; |
1044 |
#endif |
1045 |
default: |
1046 |
return UKNOWN_WIDTH; |
1047 |
} |
1048 |
} |
1049 |
} |
1050 |
#endregion |
1051 |
#region ColumnIndex |
1052 |
public int ColumnIndex |
1053 |
{ |
1054 |
get |
1055 |
{ |
1056 |
switch (_AVPColumnType) |
1057 |
{ |
1058 |
case AVPColumnType.ICON: |
1059 |
return FREEZE_ICON_INDEX; |
1060 |
case AVPColumnType.ADDRESS: |
1061 |
return ADDRESS_INDEX; |
1062 |
case AVPColumnType.VALUE: |
1063 |
return VALUE_INDEX; |
1064 |
case AVPColumnType.FROZEN: |
1065 |
return FROZEN_INDEX; |
1066 |
#if HAVE_LISTVIEW_FREEZE_BUTTON |
1067 |
case AVPColumnType.FREEZE_BUTTON: |
1068 |
return FREEZEBUTTON_WIDTH; |
1069 |
#endif |
1070 |
default: |
1071 |
return UKNOWN_INDEX; |
1072 |
} |
1073 |
} |
1074 |
} |
1075 |
#endregion |
1076 |
#endregion |
1077 |
} |
1078 |
#endregion |
1079 |
|
1080 |
} |