From 1ccb2a002e636be6210a4ae89726e82eb68d3ba6 Mon Sep 17 00:00:00 2001 From: "andres.delikat" Date: Mon, 7 Mar 2011 02:47:13 +0000 Subject: [PATCH] Hex Editor - refactor so scrollbar & paint logic are part of the MemoryViewer custom control. Still a few bugs like no border or text display --- .../BizHawk.MultiClient.csproj | 3 +- .../tools/HexEditor.Designer.cs | 15 --- BizHawk.MultiClient/tools/HexEditor.cs | 76 +++----------- BizHawk.MultiClient/tools/MemoryViewer.cs | 99 +++++++++++++++++++ 4 files changed, 112 insertions(+), 81 deletions(-) diff --git a/BizHawk.MultiClient/BizHawk.MultiClient.csproj b/BizHawk.MultiClient/BizHawk.MultiClient.csproj index 835f4bfe26..d683c6c080 100644 --- a/BizHawk.MultiClient/BizHawk.MultiClient.csproj +++ b/BizHawk.MultiClient/BizHawk.MultiClient.csproj @@ -3,7 +3,7 @@ Debug AnyCPU - 9.0.30729 + 9.0.21022 2.0 {DD448B37-BA3F-4544-9754-5406E8094723} Exe @@ -267,6 +267,7 @@ ArchiveChooser.cs + Designer InputConfig.cs diff --git a/BizHawk.MultiClient/tools/HexEditor.Designer.cs b/BizHawk.MultiClient/tools/HexEditor.Designer.cs index 10618cfcac..d4edcc1be8 100644 --- a/BizHawk.MultiClient/tools/HexEditor.Designer.cs +++ b/BizHawk.MultiClient/tools/HexEditor.Designer.cs @@ -43,7 +43,6 @@ this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.restoreWindowSizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.autoloadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.vScrollBar1 = new System.Windows.Forms.VScrollBar(); this.MemoryViewer = new BizHawk.MultiClient.MemoryViewer(); this.menuStrip1.SuspendLayout(); this.SuspendLayout(); @@ -164,17 +163,6 @@ this.autoloadToolStripMenuItem.Size = new System.Drawing.Size(186, 22); this.autoloadToolStripMenuItem.Text = "Auto-load"; // - // vScrollBar1 - // - this.vScrollBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.vScrollBar1.LargeChange = 16; - this.vScrollBar1.Location = new System.Drawing.Point(515, 42); - this.vScrollBar1.Name = "vScrollBar1"; - this.vScrollBar1.Size = new System.Drawing.Size(16, 323); - this.vScrollBar1.TabIndex = 0; - this.vScrollBar1.Scroll += new System.Windows.Forms.ScrollEventHandler(this.vScrollBar1_Scroll); - // // MemoryViewer // this.MemoryViewer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) @@ -186,14 +174,12 @@ this.MemoryViewer.TabIndex = 0; this.MemoryViewer.TabStop = false; this.MemoryViewer.Text = "RAM"; - this.MemoryViewer.Paint += new System.Windows.Forms.PaintEventHandler(this.MemoryViewer_Paint); // // HexEditor // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(534, 377); - this.Controls.Add(this.vScrollBar1); this.Controls.Add(this.MemoryViewer); this.Controls.Add(this.menuStrip1); this.MainMenuStrip = this.menuStrip1; @@ -226,6 +212,5 @@ private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem restoreWindowSizeToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem autoloadToolStripMenuItem; - private System.Windows.Forms.VScrollBar vScrollBar1; } } \ No newline at end of file diff --git a/BizHawk.MultiClient/tools/HexEditor.cs b/BizHawk.MultiClient/tools/HexEditor.cs index 5afc078407..dfb616f740 100644 --- a/BizHawk.MultiClient/tools/HexEditor.cs +++ b/BizHawk.MultiClient/tools/HexEditor.cs @@ -25,15 +25,12 @@ namespace BizHawk.MultiClient //Show num addresses in group box title (show "address" if 1 address) //big font for currently mouse over'ed value? - Font font = new Font("Courier New", 10); - Brush regBrush = Brushes.Black; - int RowsVisible = 0; + - const string HEADER = " 0 1 2 3 4 5 6 7 8 9 A B C D E F"; + int defaultWidth; int defaultHeight; - MemoryDomain Domain = new MemoryDomain("NULL", 1, Endian.Little, addr => 0, (a, v) => { }); public HexEditor() { @@ -70,34 +67,6 @@ namespace BizHawk.MultiClient this.Close(); } - private void MemoryViewer_Paint(object sender, PaintEventArgs e) - { - unchecked - { - int row = 0; - int rowX = 8; - int rowY = 16; - int rowYoffset = 20; - string rowStr; - - e.Graphics.DrawString(HEADER, font, regBrush, new Point(rowX, rowY)); - e.Graphics.DrawLine(new Pen(regBrush), MemoryViewer.Left + 38, MemoryViewer.Top, MemoryViewer.Left + 38, MemoryViewer.Bottom - 40); - e.Graphics.DrawLine(new Pen(regBrush), MemoryViewer.Left, 34, MemoryViewer.Right - 16, 34); - - for (int i = 0; i < RowsVisible; i++) - { - row = i+vScrollBar1.Value; - rowStr = String.Format("{0:X4}", row*16) + " "; //TODO: num digits based on size of domain - for (int j = 0; j < 16; j++) - { - rowStr += String.Format("{0:X2}", Domain.PeekByte((row*16)+j)) + " "; //TODO: format based on data size - } - - e.Graphics.DrawString(rowStr, font, regBrush, new Point(rowX, (rowY*(i+1))+rowYoffset)); - } - } - } - public void UpdateValues() { if (!this.IsHandleCreated || this.IsDisposed) return; @@ -107,7 +76,8 @@ namespace BizHawk.MultiClient public void Restart() { SetMemoryDomainMenu(); //Calls update routines - SetUpScrollBar(); + MemoryViewer.ResetScrollBar(); + MemoryViewer.SetUpScrollBar(); MemoryViewer.Refresh(); } @@ -130,17 +100,17 @@ namespace BizHawk.MultiClient { if (pos < Global.Emulator.MemoryDomains.Count) //Sanity check { - Domain = Global.Emulator.MemoryDomains[pos]; + MemoryViewer.SetMemoryDomain(Global.Emulator.MemoryDomains[pos]); } UpdateDomainString(); - SetUpScrollBar(); - vScrollBar1.Value = 0; + MemoryViewer.ResetScrollBar(); + MemoryViewer.SetUpScrollBar(); MemoryViewer.Refresh(); } private void UpdateDomainString() { - string memoryDomain = Domain.ToString(); + string memoryDomain = MemoryViewer.GetMemoryDomainStr(); string systemID = Global.Emulator.SystemId; MemoryViewer.Text = systemID + " " + memoryDomain; } @@ -169,10 +139,6 @@ namespace BizHawk.MultiClient } else memoryDomainsToolStripMenuItem.Enabled = false; - - SetUpScrollBar(); - vScrollBar1.Value = 0; - MemoryViewer.Refresh(); } private void goToAddressToolStripMenuItem_Click(object sender, EventArgs e) @@ -180,34 +146,14 @@ namespace BizHawk.MultiClient //TODO } - private void SetUpScrollBar() - { - RowsVisible = MemoryViewer.Height / 16; - int totalRows = Domain.Size / 16; - int MaxRows = (totalRows - RowsVisible) + 17; - - if (MaxRows > 0) - { - vScrollBar1.Visible = true; - if (vScrollBar1.Value > MaxRows) - vScrollBar1.Value = MaxRows; - vScrollBar1.Maximum = MaxRows; - } - else - vScrollBar1.Visible = false; - - } + private void HexEditor_Resize(object sender, EventArgs e) { - SetUpScrollBar(); + MemoryViewer.SetUpScrollBar(); MemoryViewer.Refresh(); } - private void vScrollBar1_Scroll(object sender, ScrollEventArgs e) - { - SetUpScrollBar(); - MemoryViewer.Refresh(); - } + } } diff --git a/BizHawk.MultiClient/tools/MemoryViewer.cs b/BizHawk.MultiClient/tools/MemoryViewer.cs index 5e3c712935..0e157e30e3 100644 --- a/BizHawk.MultiClient/tools/MemoryViewer.cs +++ b/BizHawk.MultiClient/tools/MemoryViewer.cs @@ -1,4 +1,5 @@ using System; +using System.Drawing; using System.Windows.Forms; using System.Collections.Generic; using System.Linq; @@ -8,11 +9,109 @@ namespace BizHawk.MultiClient { public class MemoryViewer : GroupBox { + public VScrollBar vScrollBar1; + MemoryDomain Domain = new MemoryDomain("NULL", 1, Endian.Little, addr => 0, (a, v) => { }); + Font font = new Font("Courier New", 10); + Brush regBrush = Brushes.Black; + int RowsVisible = 0; + + const string HEADER = " 0 1 2 3 4 5 6 7 8 9 A B C D E F"; //TODO: not constant, must deal with bite size + public MemoryViewer() { SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.DoubleBuffer, true); + + this.vScrollBar1 = new VScrollBar(); + + //TODO: based on size of MemoryViewer? + Point n = new Point(this.Size); + this.vScrollBar1.Location = new System.Drawing.Point(n.X-16, n.Y-this.Height); + this.vScrollBar1.Size = new System.Drawing.Size(16, 323); + + this.vScrollBar1.Height = this.Height; + this.vScrollBar1.Width = 16; + this.vScrollBar1.Visible = true; + this.vScrollBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.vScrollBar1.LargeChange = 16; + this.vScrollBar1.Name = "vScrollBar1"; + this.vScrollBar1.TabIndex = 0; + this.vScrollBar1.Scroll += new System.Windows.Forms.ScrollEventHandler(this.vScrollBar1_Scroll); + + this.Controls.Add(this.vScrollBar1); + } + + protected unsafe override void OnPaint(PaintEventArgs e) + { + unchecked + { + int row = 0; + int rowX = 8; + int rowY = 16; + int rowYoffset = 20; + string rowStr; + + e.Graphics.DrawString(HEADER, font, regBrush, new Point(rowX, rowY)); + e.Graphics.DrawLine(new Pen(regBrush), this.Left + 38, this.Top, this.Left + 38, this.Bottom - 40); + e.Graphics.DrawLine(new Pen(regBrush), this.Left, 34, this.Right - 16, 34); + + for (int i = 0; i < RowsVisible; i++) + { + row = i + vScrollBar1.Value; + rowStr = String.Format("{0:X4}", row * 16) + " "; //TODO: num digits based on size of domain + for (int j = 0; j < 16; j++) + { + rowStr += String.Format("{0:X2}", Domain.PeekByte((row * 16) + j)) + " "; //TODO: format based on data size + } + + e.Graphics.DrawString(rowStr, font, regBrush, new Point(rowX, (rowY * (i + 1)) + rowYoffset)); + } + } + } + + public void ResetScrollBar() + { + vScrollBar1.Value = 0; + Refresh(); + } + + public void SetUpScrollBar() + { + RowsVisible = this.Height / 16; + int totalRows = Domain.Size / 16; + int MaxRows = (totalRows - RowsVisible) + 17; + + if (MaxRows > 0) + { + vScrollBar1.Visible = true; + if (vScrollBar1.Value > MaxRows) + vScrollBar1.Value = MaxRows; + vScrollBar1.Maximum = MaxRows; + } + else + vScrollBar1.Visible = false; + + } + + public void SetMemoryDomain(MemoryDomain d) + { + Domain = d; + SetUpScrollBar(); + vScrollBar1.Value = 0; + Refresh(); + } + + public string GetMemoryDomainStr() + { + return Domain.ToString(); + } + + private void vScrollBar1_Scroll(object sender, ScrollEventArgs e) + { + this.SetUpScrollBar(); + this.Refresh(); } } }