xenia/src/Xenia.Debug.UI/MainWindow.cs

209 lines
6.9 KiB
C#
Raw Normal View History

2015-05-22 23:58:56 +02:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
using Xenia.Debug.UI.Views;
2015-05-24 07:27:43 +02:00
using Xenia.Debug.Utilities;
2015-05-22 23:58:56 +02:00
namespace Xenia.Debug.UI {
public partial class MainWindow : Form {
private DeserializeDockContent deserializeDockContent;
private BreakpointsPanel breakpointsPanel;
private CallstackPanel callstackPanel;
2015-05-24 07:27:43 +02:00
private readonly List<CodeDocument> codeDocuments = new List<CodeDocument>();
2015-05-22 23:58:56 +02:00
private FilesystemPanel filesystemPanel;
private FunctionsPanel functionsPanel;
private HeapDocument heapDocument;
2015-05-24 07:27:43 +02:00
private readonly List<MemoryDocument> memoryDocuments = new List<MemoryDocument>();
2015-05-22 23:58:56 +02:00
private ModulesPanel modulesPanel;
private ProfilePanel profilePanel;
2015-05-24 07:27:43 +02:00
private readonly List<RegistersPanel> registersPanels = new List<RegistersPanel>();
2015-05-22 23:58:56 +02:00
private StatisticsDocument statisticsDocument;
private ThreadsPanel threadsPanel;
private TracePanel tracePanel;
public Debugger Debugger {
get;
}
public MainWindow() {
InitializeComponent();
dockPanel = new DockPanel();
dockPanel.Dock = System.Windows.Forms.DockStyle.Fill;
dockPanel.DockBackColor = System.Drawing.SystemColors.AppWorkspace;
dockPanel.DockBottomPortion = 200D;
dockPanel.DockLeftPortion = 350D;
dockPanel.Name = "dockPanel";
Controls.Add(dockPanel);
Controls.SetChildIndex(dockPanel, 0);
2015-05-24 07:27:43 +02:00
Debugger = new Debugger((AsyncTask task) => {
BeginInvoke(task);
});
2015-05-22 23:58:56 +02:00
breakpointsPanel = new BreakpointsPanel(Debugger);
callstackPanel = new CallstackPanel(Debugger);
codeDocuments.Add(new CodeDocument(Debugger));
filesystemPanel = new FilesystemPanel(Debugger);
functionsPanel = new FunctionsPanel(Debugger);
heapDocument = new HeapDocument(Debugger);
memoryDocuments.Add(new MemoryDocument(Debugger));
modulesPanel = new ModulesPanel(Debugger);
profilePanel = new ProfilePanel(Debugger);
registersPanels.Add(new RegistersPanel(Debugger, RegisterClass.GuestGeneralPurpose));
registersPanels.Add(new RegistersPanel(Debugger, RegisterClass.GuestFloatingPoint));
registersPanels.Add(new RegistersPanel(Debugger, RegisterClass.GuestVector));
statisticsDocument = new StatisticsDocument(Debugger);
threadsPanel = new ThreadsPanel(Debugger);
tracePanel = new TracePanel(Debugger);
// deserializeDockContent =
// new DeserializeDockContent(GetContentFromPersistString);
SetupDefaultLayout();
2015-05-24 07:27:43 +02:00
2015-05-24 22:43:15 +02:00
// For hotkeys.
KeyPreview = true;
2015-05-24 07:27:43 +02:00
Debugger.StateChanged += Debugger_StateChanged;
Debugger_StateChanged(this, Debugger.CurrentState);
2015-05-24 22:43:15 +02:00
Debugger.CurrentContext.Changed += CurrentContext_Changed;
CurrentContext_Changed();
2015-05-24 07:27:43 +02:00
Debugger.Attach();
}
private void Debugger_StateChanged(object sender, Debugger.State e) {
2015-05-24 22:43:15 +02:00
bool enabled = false;
2015-05-24 07:27:43 +02:00
switch (e) {
case Debugger.State.Idle:
statusMessageLabel.Text = "Idle";
break;
case Debugger.State.Attaching:
statusMessageLabel.Text = "Attaching";
break;
case Debugger.State.Attached:
statusMessageLabel.Text = "Attached";
2015-05-24 22:43:15 +02:00
enabled = true;
2015-05-24 07:27:43 +02:00
break;
case Debugger.State.Detached:
statusMessageLabel.Text = "Detached";
break;
}
2015-05-24 22:43:15 +02:00
controlToolStrip.Enabled = enabled;
}
private void CurrentContext_Changed() {
bool enabled = false;
switch (Debugger.CurrentContext.RunState) {
case RunState.Updating:
enabled = false;
break;
case RunState.Running:
enabled = false;
break;
case RunState.Paused:
enabled = true;
break;
}
breakToolStripButton.Enabled = !enabled;
continueToolStripButton.Enabled = enabled;
stepInToolStripButton.Enabled = enabled;
stepOverToolStripButton.Enabled = enabled;
stepOutToolStripButton.Enabled = enabled;
// TODO(benvanik): set thread info/etc.
2015-05-22 23:58:56 +02:00
}
private void SetupDefaultLayout() {
dockPanel.SuspendLayout(true);
filesystemPanel.Show(dockPanel, DockState.DockLeft);
functionsPanel.Show(filesystemPanel.Pane, filesystemPanel);
breakpointsPanel.Show(dockPanel, DockState.DockBottom);
callstackPanel.Show(breakpointsPanel.Pane, breakpointsPanel);
modulesPanel.Show(breakpointsPanel.Pane, DockAlignment.Right, 0.5);
threadsPanel.Show(modulesPanel.Pane, modulesPanel);
registersPanels[registersPanels.Count - 1].Show(filesystemPanel.Pane,
DockAlignment.Right, 0.5);
for (int i = registersPanels.Count - 2; i >= 0; --i) {
registersPanels[i].Show(registersPanels[i + 1].Pane, registersPanels[i + 1]);
}
foreach (var codeDocument in codeDocuments) {
codeDocument.Show(dockPanel, DockState.Document);
}
heapDocument.Show(codeDocuments[0].Pane, DockAlignment.Right, 0.5);
for (int i = 0; i < memoryDocuments.Count; ++i) {
memoryDocuments[i].Show(heapDocument.Pane, heapDocument);
}
tracePanel.Show(heapDocument.Pane, DockAlignment.Bottom, 0.5);
statisticsDocument.Show(tracePanel.Pane, tracePanel);
dockPanel.ResumeLayout(true, true);
}
2015-05-24 22:43:15 +02:00
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
//if (keyData == (Keys.Control | Keys.F)) {
// MessageBox.Show("What the Ctrl+F?");
// return true;
//}
if (keyData == Keys.F11) {
stepInToolStripButton_Click(this, EventArgs.Empty);
return true;
} else if (keyData == Keys.F10) {
stepOverToolStripButton_Click(this, EventArgs.Empty);
return true;
} else if (keyData == (Keys.Shift | Keys.F11)) {
stepOutToolStripButton_Click(this, EventArgs.Empty);
return true;
} else if (keyData == (Keys.Pause)) {
breakToolStripButton_Click(this, EventArgs.Empty);
return true;
} else if (keyData == (Keys.Shift | Keys.F5)) {
stopToolStripButton_Click(this, EventArgs.Empty);
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
private void continueToolStripButton_Click(object sender, EventArgs e) {
Debugger.Continue();
}
private void breakToolStripButton_Click(object sender, EventArgs e) {
Debugger.Break();
}
private void stopToolStripButton_Click(object sender, EventArgs e) {
Debugger.Stop();
}
private void stepInToolStripButton_Click(object sender, EventArgs e) {
Debugger.StepIn();
}
private void stepOverToolStripButton_Click(object sender, EventArgs e) {
Debugger.StepOver();
}
private void stepOutToolStripButton_Click(object sender, EventArgs e) {
Debugger.StepOut();
}
2015-05-22 23:58:56 +02:00
}
}