using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace BizHawk.MultiClient { /// /// A winform designed to search through ram values /// public partial class RamSearch : Form { //TODO: //Window position gets saved but doesn't load properly string systemID = "NULL"; List searchList = new List(); List undoList = new List(); //Reset window position item int defaultWidth; //For saving the default size of the dialog, so the user can restore if desired int defaultHeight; public RamSearch() { InitializeComponent(); } public void UpdateValues() { //TODO: update based on atype for (int x = 0; x < searchList.Count; x++) { searchList[x].prev = searchList[x].value; //TODO: format based on asigned searchList[x].value = Global.Emulator.MainMemory.PeekByte(searchList[x].address); if (searchList[x].prev != searchList[x].value) searchList[x].changecount++; } SearchListView.Refresh(); } private void RamSearch_Load(object sender, EventArgs e) { defaultWidth = this.Size.Width; //Save these first so that the user can restore to its original size defaultHeight = this.Size.Height; if (Global.Emulator.MainMemory.Endian == Endian.Big) { bigEndianToolStripMenuItem.Checked = true; littleEndianToolStripMenuItem.Checked = false; } else { bigEndianToolStripMenuItem.Checked = false; littleEndianToolStripMenuItem.Checked = true; } StartNewSearch(); if (Global.Config.RamSearchWndx >= 0 && Global.Config.RamSearchWndy >= 0) this.Location = new Point(Global.Config.RamSearchWndx, Global.Config.RamSearchWndy); if (Global.Config.RamSearchWidth >= 0 && Global.Config.RamSearchHeight >= 0) { this.Size = new System.Drawing.Size(Global.Config.RamSearchWidth, Global.Config.RamSearchHeight); } } private void SetTotal() { int x = searchList.Count; string str; if (x == 1) str = " address"; else str = " addresses"; TotalSearchLabel.Text = x.ToString() + str; } private void hackyAutoLoadToolStripMenuItem_Click(object sender, EventArgs e) { if (Global.Config.AutoLoadRamSearch == true) { Global.Config.AutoLoadRamSearch = false; hackyAutoLoadToolStripMenuItem.Checked = false; } else { Global.Config.AutoLoadRamSearch = true; hackyAutoLoadToolStripMenuItem.Checked = true; } } private void OpenSearchFile() { } private void SaveAs() { } private void openToolStripMenuItem_Click(object sender, EventArgs e) { OpenSearchFile(); } private void openToolStripButton_Click(object sender, EventArgs e) { OpenSearchFile(); } private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) { SaveAs(); } private void exitToolStripMenuItem_Click(object sender, EventArgs e) { this.Hide(); } private void SpecificValueRadio_CheckedChanged(object sender, EventArgs e) { if (SpecificValueRadio.Checked) { SpecificValueBox.Enabled = true; SpecificAddressBox.Enabled = false; NumberOfChangesBox.Enabled = false; } } private void PreviousValueRadio_CheckedChanged(object sender, EventArgs e) { if (PreviousValueRadio.Checked) { SpecificValueBox.Enabled = false; SpecificAddressBox.Enabled = false; NumberOfChangesBox.Enabled = false; } } private void SpecificAddressRadio_CheckedChanged(object sender, EventArgs e) { if (SpecificAddressRadio.Checked) { SpecificValueBox.Enabled = false; SpecificAddressBox.Enabled = true; NumberOfChangesBox.Enabled = false; } } private void NumberOfChangesRadio_CheckedChanged(object sender, EventArgs e) { if (NumberOfChangesRadio.Checked) { SpecificValueBox.Enabled = false; SpecificAddressBox.Enabled = false; NumberOfChangesBox.Enabled = true; } } private void DifferentByRadio_CheckedChanged(object sender, EventArgs e) { if (DifferentByRadio.Checked) DifferentByBox.Enabled = true; else DifferentByBox.Enabled = false; } private void ModuloRadio_CheckedChanged(object sender, EventArgs e) { if (ModuloRadio.Checked) ModuloBox.Enabled = true; else ModuloBox.Enabled = false; } private void AddToRamWatch() { ListView.SelectedIndexCollection indexes = SearchListView.SelectedIndices; if (indexes.Count > 0) { if (!Global.MainForm.RamWatch1.IsDisposed) { Global.MainForm.RamWatch1.Focus(); } else { Global.MainForm.RamWatch1 = new RamWatch(); Global.MainForm.RamWatch1.Show(); } for (int x = 0; x < indexes.Count; x++) Global.MainForm.RamWatch1.AddWatch(searchList[indexes[x]]); } } private void WatchtoolStripButton1_Click(object sender, EventArgs e) { AddToRamWatch(); } private void RamSearch_LocationChanged(object sender, EventArgs e) { Global.Config.RamSearchWndx = this.Location.X; Global.Config.RamSearchWndy = this.Location.Y; } private void RamSearch_Resize(object sender, EventArgs e) { Global.Config.RamSearchWidth = this.Right - this.Left; Global.Config.RamSearchHeight = this.Bottom - this.Top; } private void restoreOriginalWindowSizeToolStripMenuItem_Click(object sender, EventArgs e) { this.Size = new System.Drawing.Size(defaultWidth, defaultHeight); } private void NewSearchtoolStripButton_Click(object sender, EventArgs e) { StartNewSearch(); } private void StartNewSearch() { searchList.Clear(); undoList.Clear(); GetMemoryDomain(); int startaddress = 0; if (Global.Emulator.SystemId == "PCE") startaddress = 0x1F0000; //For now, until Emulator core functionality can better handle a prefix for (int x = 0; x < Global.Emulator.MainMemory.Size; x++) { searchList.Add(new Watch()); searchList[x].address = x + startaddress; searchList[x].prev = searchList[x].value = Global.Emulator.MainMemory.PeekByte(x); } DisplaySearchList(); } private void DisplaySearchList() { SearchListView.VirtualListSize = searchList.Count; SetTotal(); } private void newSearchToolStripMenuItem_Click(object sender, EventArgs e) { StartNewSearch(); } private void GetMemoryDomain() { string memoryDomain = "Main memory"; //TODO: multiple memory domains systemID = Global.Emulator.SystemId; //MemDomainLabel.Text = systemID + " " + memoryDomain; } private Point GetPromptPoint() { Point p = new Point(SearchListView.Location.X, SearchListView.Location.Y); Point q = new Point(); q = PointToScreen(p); return q; } private void PokeAddress() { ListView.SelectedIndexCollection indexes = SearchListView.SelectedIndices; RamPoke p = new RamPoke(); if (indexes.Count > 0) p.SetWatchObject(searchList[indexes[0]]); p.location = GetPromptPoint(); p.ShowDialog(); } private void PoketoolStripButton1_Click(object sender, EventArgs e) { PokeAddress(); } private void RemoveAddresses() { ListView.SelectedIndexCollection indexes = SearchListView.SelectedIndices; if (indexes.Count > 0) { SaveUndo(); for (int x = 0; x < indexes.Count; x++) { searchList.Remove(searchList[indexes[x]-x]); } DisplaySearchList(); } } private void cutToolStripButton_Click(object sender, EventArgs e) { RemoveAddresses(); } /// /// Saves the current search list to the undo list /// This function should be called before any destructive operation to the list! /// private void SaveUndo() { undoList = new List(searchList); } private void DoUndo() { if (undoList.Count > 0) { searchList = new List(undoList); undoList.Clear(); DisplaySearchList(); } } private void UndotoolStripButton_Click(object sender, EventArgs e) { DoUndo(); } private void SearchListView_QueryItemBkColor(int index, int column, ref Color color) { if (index % 2 == 0) color = Color.White; else color = Color.Pink; } private void SearchListView_QueryItemText(int index, int column, out string text) { text = ""; if (column == 0) text = searchList[index].address.ToString("x"); if (column == 1) text = searchList[index].value.ToString(); if (column == 3) text = searchList[index].changecount.ToString(); } private void SearchListView_QueryItemIndent(int index, out int itemIndent) { itemIndent = 0; } private void SearchListView_QueryItemImage(int index, int column, out int imageIndex) { imageIndex = -1; } } }