Debugger: Added ability to configure an external code editor (for use in Source View mode)

This commit is contained in:
Sour 2019-01-12 22:20:43 -05:00
parent 62d9213a41
commit e0b6c4f900
15 changed files with 445 additions and 43 deletions

View file

@ -355,6 +355,9 @@ namespace Mesen.GUI.Config
public bool TextHookerIgnoreMirroredNametables = true;
public bool TextHookerAutoCopyToClipboard = false;
public string ExternalEditorPath;
public string ExternalEditorArguments;
public DebuggerShortcutsConfig Shortcuts = new DebuggerShortcutsConfig();
public DebugImportConfig ImportConfig = new DebugImportConfig();
@ -374,6 +377,34 @@ namespace Mesen.GUI.Config
UseLabels = false,
StatusFormat = StatusFlagFormat.Hexadecimal
};
if(ExternalEditorPath == null || ExternalEditorArguments == null) {
ExternalEditorPath = "";
ExternalEditorArguments = "";
//Setup a default editor when possible
if(Program.IsMono) {
string geditPath = "/usr/bin/gedit";
string katePath = "/usr/bin/kate";
if(File.Exists(geditPath)) {
ExternalEditorPath = geditPath;
ExternalEditorArguments = "+%L %F";
} else if(File.Exists(katePath)) {
ExternalEditorPath = katePath;
ExternalEditorArguments = "%F -l %L";
}
} else {
string notepadPath32 = "C:\\Program Files (x86)\\Notepad++\\notepad++.exe";
string notepadPath64 = "C:\\Program Files\\Notepad++\\notepad++.exe";
if(File.Exists(notepadPath32)) {
ExternalEditorPath = notepadPath32;
ExternalEditorArguments = "%F -n%L";
} else if(File.Exists(notepadPath64)) {
ExternalEditorPath = notepadPath64;
ExternalEditorArguments = "%F -n%L";
}
}
}
}
static public void ApplyConfig()

View file

@ -127,6 +127,8 @@ namespace Mesen.GUI.Config
public XmlKeys CodeWindow_EditSubroutine = Keys.F4;
[ShortcutName("Code Window: Edit Selected Code")]
public XmlKeys CodeWindow_EditSelectedCode = Keys.None;
[ShortcutName("Code Window: Edit Source File (Source View)")]
public XmlKeys CodeWindow_EditSourceFile = Keys.F4;
[ShortcutName("Code Window: Edit Label")]
public XmlKeys CodeWindow_EditLabel = Keys.F2;
[ShortcutName("Code Window: Navigate Back")]

View file

@ -69,6 +69,7 @@
this.sepSwitchView = new System.Windows.Forms.ToolStripSeparator();
this.mnuSwitchView = new System.Windows.Forms.ToolStripMenuItem();
this.mnuShowSourceAsComments = new System.Windows.Forms.ToolStripMenuItem();
this.mnuEditSourceFile = new System.Windows.Forms.ToolStripMenuItem();
this.contextMenu.SuspendLayout();
this.SuspendLayout();
//
@ -77,6 +78,7 @@
this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuMarkSelectionAs,
this.sepMarkSelectionAs,
this.mnuEditSourceFile,
this.mnuEditSelectedCode,
this.mnuEditSubroutine,
this.mnuUndoPrgChrEdit,
@ -104,7 +106,7 @@
this.mnuSwitchView,
this.mnuShowSourceAsComments});
this.contextMenu.Name = "contextMenuWatch";
this.contextMenu.Size = new System.Drawing.Size(254, 514);
this.contextMenu.Size = new System.Drawing.Size(254, 536);
this.contextMenu.Closed += new System.Windows.Forms.ToolStripDropDownClosedEventHandler(this.contextMenuCode_Closed);
this.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuCode_Opening);
//
@ -402,6 +404,14 @@
this.mnuShowSourceAsComments.Text = "Show source code as comments";
this.mnuShowSourceAsComments.Click += new System.EventHandler(this.mnuShowSourceAsComments_Click);
//
// mnuEditSourceFile
//
this.mnuEditSourceFile.Image = global::Mesen.GUI.Properties.Resources.Edit;
this.mnuEditSourceFile.Name = "mnuEditSourceFile";
this.mnuEditSourceFile.Size = new System.Drawing.Size(253, 22);
this.mnuEditSourceFile.Text = "Edit Source File";
this.mnuEditSourceFile.Click += new System.EventHandler(this.mnuEditSourceFile_Click);
//
// CodeViewerActions
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -454,5 +464,6 @@
private System.Windows.Forms.ToolStripMenuItem mnuSwitchView;
public System.Windows.Forms.ContextMenuStrip contextMenu;
private System.Windows.Forms.ToolStripMenuItem mnuShowSourceAsComments;
private System.Windows.Forms.ToolStripMenuItem mnuEditSourceFile;
}
}

View file

@ -68,6 +68,8 @@ namespace Mesen.GUI.Debugger.Controls
mnuMarkAsCode.InitShortcut(parent, nameof(DebuggerShortcutsConfig.MarkAsCode));
mnuMarkAsData.InitShortcut(parent, nameof(DebuggerShortcutsConfig.MarkAsData));
mnuMarkAsUnidentifiedData.InitShortcut(parent, nameof(DebuggerShortcutsConfig.MarkAsUnidentified));
} else {
mnuEditSourceFile.InitShortcut(parent, nameof(DebuggerShortcutsConfig.CodeWindow_EditSourceFile));
}
}
@ -407,6 +409,11 @@ namespace Mesen.GUI.Debugger.Controls
this.OnSetNextStatement?.Invoke(new AddressEventArgs() { Address = (UInt32)Viewer.CodeViewer.CurrentLine });
}
private void mnuEditSourceFile_Click(object sender, EventArgs e)
{
Viewer.EditSourceFile();
}
private void mnuEditSubroutine_Click(object sender, EventArgs e)
{
Viewer.EditSubroutine();
@ -462,6 +469,7 @@ namespace Mesen.GUI.Debugger.Controls
{
mnuEditSelectedCode.Enabled = true;
mnuEditSubroutine.Enabled = true;
mnuEditSourceFile.Enabled = true;
}
public void UpdateContextMenuItemVisibility(ToolStripItemCollection items)
@ -475,7 +483,7 @@ namespace Mesen.GUI.Debugger.Controls
items[nameof(mnuShowSourceAsComments)].Visible = hasSymbolProvider;
items[nameof(mnuSwitchView)].Visible = hasSymbolProvider;
items[nameof(sepSwitchView)].Visible = hasSymbolProvider;
if(IsSourceView) {
items[nameof(mnuMarkSelectionAs)].Visible = false;
@ -487,6 +495,8 @@ namespace Mesen.GUI.Debugger.Controls
items[nameof(sepNavigation)].Visible = false;
items[nameof(mnuShowSourceAsComments)].Visible = false;
items[nameof(sepMarkSelectionAs)].Visible = false;
} else {
items[nameof(mnuEditSourceFile)].Visible = false;
}
}

View file

@ -18,6 +18,7 @@ namespace Mesen.GUI.Debugger.Controls
void SetConfig(DebugViewInfo config, bool disableActions = false);
void EditSubroutine();
void EditSelectedCode();
void EditSourceFile();
void SetMessage(TextboxMessageInfo message);

View file

@ -354,6 +354,11 @@ namespace Mesen.GUI.Debugger
}
}
public void EditSourceFile()
{
//TODO: Not supported yet
}
public void FindAllOccurrences(Ld65DbgImporter.SymbolInfo symbol)
{
FindAllOccurrences(symbol.Name, true, true);

View file

@ -12,6 +12,7 @@ using System.IO;
using Mesen.GUI.Config;
using Mesen.GUI.Controls;
using System.Text.RegularExpressions;
using System.Diagnostics;
namespace Mesen.GUI.Debugger.Controls
{
@ -386,6 +387,28 @@ namespace Mesen.GUI.Debugger.Controls
{
//Not supported
}
public void EditSourceFile()
{
if(string.IsNullOrWhiteSpace(ConfigManager.Config.DebugInfo.ExternalEditorPath) || !File.Exists(ConfigManager.Config.DebugInfo.ExternalEditorPath)) {
using(frmExternalEditorConfig frm = new frmExternalEditorConfig()) {
frm.ShowDialog(null, this.ParentForm);
}
}
if(File.Exists(ConfigManager.Config.DebugInfo.ExternalEditorPath)) {
string filePath = Path.Combine(_symbolProvider.DbgPath, CurrentFile.Name);
if(File.Exists(filePath)) {
filePath = "\"" + filePath + "\"";
string lineNumber = (ctrlCodeViewer.SelectedLine + 1).ToString();
Process.Start(
ConfigManager.Config.DebugInfo.ExternalEditorPath,
ConfigManager.Config.DebugInfo.ExternalEditorArguments.Replace("%F", filePath).Replace("%f", filePath).Replace("%L", lineNumber).Replace("%l", lineNumber)
);
}
}
}
public void FindAllOccurrences(SymbolInfo symbol)
{

View file

@ -57,6 +57,7 @@ namespace Mesen.GUI.Debugger
public Dictionary<int, FileInfo> Files { get { return _files; } }
public DateTime DbgFileStamp { get; private set; }
public string DbgPath { get; private set; }
public int GetPrgAddress(int fileID, int lineIndex)
{
@ -726,6 +727,7 @@ namespace Mesen.GUI.Debugger
string[] fileRows = File.ReadAllLines(path);
string basePath = Path.GetDirectoryName(path);
DbgPath = basePath;
foreach(string row in fileRows) {
try {
if(LoadLines(row) || LoadSpans(row) || LoadSymbols(row) || LoadCSymbols(row) || LoadFiles(row, basePath) || LoadSegments(row)) {

View file

@ -90,6 +90,7 @@ namespace Mesen.GUI.Debugger
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_SetNextStatement)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditSubroutine)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditSelectedCode)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditSourceFile)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditLabel)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_NavigateBack)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_NavigateForward)),

View file

@ -96,6 +96,8 @@ namespace Mesen.GUI.Debugger
this.mnuBreakIn = new System.Windows.Forms.ToolStripMenuItem();
this.mnuBreakOn = new System.Windows.Forms.ToolStripMenuItem();
this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mnuGoToAll = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem29 = new System.Windows.Forms.ToolStripSeparator();
this.mnuFind = new System.Windows.Forms.ToolStripMenuItem();
this.mnuFindNext = new System.Windows.Forms.ToolStripMenuItem();
this.mnuFindPrev = new System.Windows.Forms.ToolStripMenuItem();
@ -109,7 +111,6 @@ namespace Mesen.GUI.Debugger
this.mnuGoToResetHandler = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem23 = new System.Windows.Forms.ToolStripSeparator();
this.mnuGoToProgramCount = new System.Windows.Forms.ToolStripMenuItem();
this.mnuGoToAll = new System.Windows.Forms.ToolStripMenuItem();
this.mnuOptions = new System.Windows.Forms.ToolStripMenuItem();
this.mnuDisassemblyOptions = new System.Windows.Forms.ToolStripMenuItem();
this.mnuDisassemble = new System.Windows.Forms.ToolStripMenuItem();
@ -183,6 +184,7 @@ namespace Mesen.GUI.Debugger
this.mnuRefreshWhileRunning = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripSeparator();
this.mnuPreferences = new System.Windows.Forms.ToolStripMenuItem();
this.mnuConfigureExternalEditor = new System.Windows.Forms.ToolStripMenuItem();
this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mnuApuViewer = new System.Windows.Forms.ToolStripMenuItem();
this.mnuAssembler = new System.Windows.Forms.ToolStripMenuItem();
@ -216,7 +218,6 @@ namespace Mesen.GUI.Debugger
this.ctrlPpuMemoryMapping = new Mesen.GUI.Debugger.Controls.ctrlMemoryMapping();
this.ctrlCpuMemoryMapping = new Mesen.GUI.Debugger.Controls.ctrlMemoryMapping();
this.tsToolbar = new Mesen.GUI.Controls.ctrlMesenToolStrip();
this.toolStripMenuItem29 = new System.Windows.Forms.ToolStripSeparator();
((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
this.splitContainer.Panel1.SuspendLayout();
this.splitContainer.Panel2.SuspendLayout();
@ -261,7 +262,7 @@ namespace Mesen.GUI.Debugger
this.splitContainer.Panel2.Controls.Add(this.tableLayoutPanel10);
this.splitContainer.Panel2MinSize = 100;
this.splitContainer.Size = new System.Drawing.Size(1075, 570);
this.splitContainer.SplitterDistance = 404;
this.splitContainer.SplitterDistance = 400;
this.splitContainer.SplitterWidth = 7;
this.splitContainer.TabIndex = 1;
this.splitContainer.TabStop = false;
@ -285,7 +286,7 @@ namespace Mesen.GUI.Debugger
//
this.ctrlSplitContainerTop.Panel2.Controls.Add(this.tlpFunctionLabelLists);
this.ctrlSplitContainerTop.Panel2MinSize = 150;
this.ctrlSplitContainerTop.Size = new System.Drawing.Size(1075, 404);
this.ctrlSplitContainerTop.Size = new System.Drawing.Size(1075, 400);
this.ctrlSplitContainerTop.SplitterDistance = 750;
this.ctrlSplitContainerTop.SplitterWidth = 7;
this.ctrlSplitContainerTop.TabIndex = 3;
@ -306,8 +307,8 @@ namespace Mesen.GUI.Debugger
this.tlpTop.Name = "tlpTop";
this.tlpTop.RowCount = 1;
this.tlpTop.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tlpTop.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 404F));
this.tlpTop.Size = new System.Drawing.Size(750, 404);
this.tlpTop.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 400F));
this.tlpTop.Size = new System.Drawing.Size(750, 400);
this.tlpTop.TabIndex = 2;
//
// panel1
@ -318,7 +319,7 @@ namespace Mesen.GUI.Debugger
this.panel1.Location = new System.Drawing.Point(3, 0);
this.panel1.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(286, 404);
this.panel1.Size = new System.Drawing.Size(286, 400);
this.panel1.TabIndex = 5;
//
// ctrlSourceViewer
@ -327,7 +328,7 @@ namespace Mesen.GUI.Debugger
this.ctrlSourceViewer.Dock = System.Windows.Forms.DockStyle.Fill;
this.ctrlSourceViewer.Location = new System.Drawing.Point(0, 0);
this.ctrlSourceViewer.Name = "ctrlSourceViewer";
this.ctrlSourceViewer.Size = new System.Drawing.Size(286, 404);
this.ctrlSourceViewer.Size = new System.Drawing.Size(286, 400);
this.ctrlSourceViewer.SymbolProvider = null;
this.ctrlSourceViewer.TabIndex = 7;
this.ctrlSourceViewer.Visible = false;
@ -340,7 +341,7 @@ namespace Mesen.GUI.Debugger
this.ctrlDebuggerCode.Location = new System.Drawing.Point(0, 0);
this.ctrlDebuggerCode.Name = "ctrlDebuggerCode";
this.ctrlDebuggerCode.ShowMemoryValues = false;
this.ctrlDebuggerCode.Size = new System.Drawing.Size(286, 404);
this.ctrlDebuggerCode.Size = new System.Drawing.Size(286, 400);
this.ctrlDebuggerCode.SymbolProvider = null;
this.ctrlDebuggerCode.TabIndex = 2;
this.ctrlDebuggerCode.OnEditCode += new Mesen.GUI.Debugger.ctrlDebuggerCode.AssemblerEventHandler(this.ctrlDebuggerCode_OnEditCode);
@ -354,7 +355,7 @@ namespace Mesen.GUI.Debugger
this.panel2.Location = new System.Drawing.Point(292, 0);
this.panel2.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(1, 404);
this.panel2.Size = new System.Drawing.Size(1, 400);
this.panel2.TabIndex = 6;
//
// ctrlSourceViewerSplit
@ -363,7 +364,7 @@ namespace Mesen.GUI.Debugger
this.ctrlSourceViewerSplit.Dock = System.Windows.Forms.DockStyle.Fill;
this.ctrlSourceViewerSplit.Location = new System.Drawing.Point(0, 0);
this.ctrlSourceViewerSplit.Name = "ctrlSourceViewerSplit";
this.ctrlSourceViewerSplit.Size = new System.Drawing.Size(1, 404);
this.ctrlSourceViewerSplit.Size = new System.Drawing.Size(1, 400);
this.ctrlSourceViewerSplit.SymbolProvider = null;
this.ctrlSourceViewerSplit.TabIndex = 8;
this.ctrlSourceViewerSplit.Visible = false;
@ -376,7 +377,7 @@ namespace Mesen.GUI.Debugger
this.ctrlDebuggerCodeSplit.Location = new System.Drawing.Point(0, 0);
this.ctrlDebuggerCodeSplit.Name = "ctrlDebuggerCodeSplit";
this.ctrlDebuggerCodeSplit.ShowMemoryValues = false;
this.ctrlDebuggerCodeSplit.Size = new System.Drawing.Size(1, 404);
this.ctrlDebuggerCodeSplit.Size = new System.Drawing.Size(1, 400);
this.ctrlDebuggerCodeSplit.SymbolProvider = null;
this.ctrlDebuggerCodeSplit.TabIndex = 4;
this.ctrlDebuggerCodeSplit.Visible = false;
@ -396,7 +397,7 @@ namespace Mesen.GUI.Debugger
this.tableLayoutPanel1.RowCount = 2;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(458, 404);
this.tableLayoutPanel1.Size = new System.Drawing.Size(458, 400);
this.tableLayoutPanel1.TabIndex = 7;
//
// ctrlConsoleStatus
@ -420,7 +421,7 @@ namespace Mesen.GUI.Debugger
this.tlpVerticalLayout.Name = "tlpVerticalLayout";
this.tlpVerticalLayout.RowCount = 1;
this.tlpVerticalLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tlpVerticalLayout.Size = new System.Drawing.Size(458, 4);
this.tlpVerticalLayout.Size = new System.Drawing.Size(458, 1);
this.tlpVerticalLayout.TabIndex = 4;
//
// tlpFunctionLabelLists
@ -436,16 +437,16 @@ namespace Mesen.GUI.Debugger
this.tlpFunctionLabelLists.RowCount = 2;
this.tlpFunctionLabelLists.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tlpFunctionLabelLists.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tlpFunctionLabelLists.Size = new System.Drawing.Size(318, 404);
this.tlpFunctionLabelLists.Size = new System.Drawing.Size(318, 400);
this.tlpFunctionLabelLists.TabIndex = 5;
//
// grpLabels
//
this.grpLabels.Controls.Add(this.ctrlLabelList);
this.grpLabels.Dock = System.Windows.Forms.DockStyle.Fill;
this.grpLabels.Location = new System.Drawing.Point(3, 205);
this.grpLabels.Location = new System.Drawing.Point(3, 203);
this.grpLabels.Name = "grpLabels";
this.grpLabels.Size = new System.Drawing.Size(312, 196);
this.grpLabels.Size = new System.Drawing.Size(312, 194);
this.grpLabels.TabIndex = 6;
this.grpLabels.TabStop = false;
this.grpLabels.Text = "Labels";
@ -455,10 +456,10 @@ namespace Mesen.GUI.Debugger
this.ctrlLabelList.Dock = System.Windows.Forms.DockStyle.Fill;
this.ctrlLabelList.Location = new System.Drawing.Point(3, 16);
this.ctrlLabelList.Name = "ctrlLabelList";
this.ctrlLabelList.Size = new System.Drawing.Size(306, 177);
this.ctrlLabelList.Size = new System.Drawing.Size(306, 175);
this.ctrlLabelList.TabIndex = 0;
this.ctrlLabelList.OnFindOccurrence += new System.EventHandler(this.ctrlLabelList_OnFindOccurrence);
this.ctrlLabelList.OnLabelSelected += new GoToDestinationEventHandler(this.ctrlLabelList_OnLabelSelected);
this.ctrlLabelList.OnLabelSelected += new Mesen.GUI.Debugger.GoToDestinationEventHandler(this.ctrlLabelList_OnLabelSelected);
//
// grpFunctions
//
@ -466,7 +467,7 @@ namespace Mesen.GUI.Debugger
this.grpFunctions.Dock = System.Windows.Forms.DockStyle.Fill;
this.grpFunctions.Location = new System.Drawing.Point(3, 3);
this.grpFunctions.Name = "grpFunctions";
this.grpFunctions.Size = new System.Drawing.Size(312, 196);
this.grpFunctions.Size = new System.Drawing.Size(312, 194);
this.grpFunctions.TabIndex = 5;
this.grpFunctions.TabStop = false;
this.grpFunctions.Text = "Functions";
@ -476,10 +477,10 @@ namespace Mesen.GUI.Debugger
this.ctrlFunctionList.Dock = System.Windows.Forms.DockStyle.Fill;
this.ctrlFunctionList.Location = new System.Drawing.Point(3, 16);
this.ctrlFunctionList.Name = "ctrlFunctionList";
this.ctrlFunctionList.Size = new System.Drawing.Size(306, 177);
this.ctrlFunctionList.Size = new System.Drawing.Size(306, 175);
this.ctrlFunctionList.TabIndex = 0;
this.ctrlFunctionList.OnFindOccurrence += new System.EventHandler(this.ctrlFunctionList_OnFindOccurrence);
this.ctrlFunctionList.OnFunctionSelected += new GoToDestinationEventHandler(this.ctrlFunctionList_OnFunctionSelected);
this.ctrlFunctionList.OnFunctionSelected += new Mesen.GUI.Debugger.GoToDestinationEventHandler(this.ctrlFunctionList_OnFunctionSelected);
//
// picWatchHelp
//
@ -507,7 +508,7 @@ namespace Mesen.GUI.Debugger
this.tableLayoutPanel10.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel10.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel10.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel10.Size = new System.Drawing.Size(1075, 159);
this.tableLayoutPanel10.Size = new System.Drawing.Size(1075, 166);
this.tableLayoutPanel10.TabIndex = 0;
//
// grpWatch
@ -516,7 +517,7 @@ namespace Mesen.GUI.Debugger
this.grpWatch.Dock = System.Windows.Forms.DockStyle.Fill;
this.grpWatch.Location = new System.Drawing.Point(3, 3);
this.grpWatch.Name = "grpWatch";
this.grpWatch.Size = new System.Drawing.Size(352, 153);
this.grpWatch.Size = new System.Drawing.Size(352, 160);
this.grpWatch.TabIndex = 2;
this.grpWatch.TabStop = false;
this.grpWatch.Text = "Watch";
@ -526,7 +527,7 @@ namespace Mesen.GUI.Debugger
this.ctrlWatch.Dock = System.Windows.Forms.DockStyle.Fill;
this.ctrlWatch.Location = new System.Drawing.Point(3, 16);
this.ctrlWatch.Name = "ctrlWatch";
this.ctrlWatch.Size = new System.Drawing.Size(346, 134);
this.ctrlWatch.Size = new System.Drawing.Size(346, 141);
this.ctrlWatch.TabIndex = 0;
//
// grpBreakpoints
@ -535,7 +536,7 @@ namespace Mesen.GUI.Debugger
this.grpBreakpoints.Dock = System.Windows.Forms.DockStyle.Fill;
this.grpBreakpoints.Location = new System.Drawing.Point(361, 3);
this.grpBreakpoints.Name = "grpBreakpoints";
this.grpBreakpoints.Size = new System.Drawing.Size(352, 153);
this.grpBreakpoints.Size = new System.Drawing.Size(352, 160);
this.grpBreakpoints.TabIndex = 3;
this.grpBreakpoints.TabStop = false;
this.grpBreakpoints.Text = "Breakpoints";
@ -545,7 +546,7 @@ namespace Mesen.GUI.Debugger
this.ctrlBreakpoints.Dock = System.Windows.Forms.DockStyle.Fill;
this.ctrlBreakpoints.Location = new System.Drawing.Point(3, 16);
this.ctrlBreakpoints.Name = "ctrlBreakpoints";
this.ctrlBreakpoints.Size = new System.Drawing.Size(346, 134);
this.ctrlBreakpoints.Size = new System.Drawing.Size(346, 141);
this.ctrlBreakpoints.TabIndex = 0;
this.ctrlBreakpoints.BreakpointNavigation += new System.EventHandler(this.ctrlBreakpoints_BreakpointNavigation);
//
@ -555,7 +556,7 @@ namespace Mesen.GUI.Debugger
this.grpCallstack.Dock = System.Windows.Forms.DockStyle.Fill;
this.grpCallstack.Location = new System.Drawing.Point(719, 3);
this.grpCallstack.Name = "grpCallstack";
this.grpCallstack.Size = new System.Drawing.Size(353, 153);
this.grpCallstack.Size = new System.Drawing.Size(353, 160);
this.grpCallstack.TabIndex = 4;
this.grpCallstack.TabStop = false;
this.grpCallstack.Text = "Call Stack";
@ -565,7 +566,7 @@ namespace Mesen.GUI.Debugger
this.ctrlCallstack.Dock = System.Windows.Forms.DockStyle.Fill;
this.ctrlCallstack.Location = new System.Drawing.Point(3, 16);
this.ctrlCallstack.Name = "ctrlCallstack";
this.ctrlCallstack.Size = new System.Drawing.Size(347, 134);
this.ctrlCallstack.Size = new System.Drawing.Size(347, 141);
this.ctrlCallstack.TabIndex = 0;
this.ctrlCallstack.FunctionSelected += new System.EventHandler(this.ctrlCallstack_FunctionSelected);
//
@ -927,6 +928,18 @@ namespace Mesen.GUI.Debugger
this.searchToolStripMenuItem.Size = new System.Drawing.Size(54, 20);
this.searchToolStripMenuItem.Text = "Search";
//
// mnuGoToAll
//
this.mnuGoToAll.Name = "mnuGoToAll";
this.mnuGoToAll.Size = new System.Drawing.Size(183, 22);
this.mnuGoToAll.Text = "Go to All";
this.mnuGoToAll.Click += new System.EventHandler(this.mnuGoToAll_Click);
//
// toolStripMenuItem29
//
this.toolStripMenuItem29.Name = "toolStripMenuItem29";
this.toolStripMenuItem29.Size = new System.Drawing.Size(180, 6);
//
// mnuFind
//
this.mnuFind.Image = global::Mesen.GUI.Properties.Resources.Find;
@ -1023,13 +1036,6 @@ namespace Mesen.GUI.Debugger
this.mnuGoToProgramCount.Text = "Program Counter";
this.mnuGoToProgramCount.Click += new System.EventHandler(this.mnuGoToProgramCount_Click);
//
// mnuGoToAll
//
this.mnuGoToAll.Name = "mnuGoToAll";
this.mnuGoToAll.Size = new System.Drawing.Size(183, 22);
this.mnuGoToAll.Text = "Go to All";
this.mnuGoToAll.Click += new System.EventHandler(this.mnuGoToAll_Click);
//
// mnuOptions
//
this.mnuOptions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@ -1057,6 +1063,7 @@ namespace Mesen.GUI.Debugger
this.mnuAlwaysScrollToCenter,
this.mnuRefreshWhileRunning,
this.toolStripMenuItem6,
this.mnuConfigureExternalEditor,
this.mnuPreferences});
this.mnuOptions.Name = "mnuOptions";
this.mnuOptions.Size = new System.Drawing.Size(61, 20);
@ -1642,6 +1649,14 @@ namespace Mesen.GUI.Debugger
this.mnuPreferences.Text = "Configure shortcut keys...";
this.mnuPreferences.Click += new System.EventHandler(this.mnuPreferences_Click);
//
// mnuConfigureExternalEditor
//
this.mnuConfigureExternalEditor.Image = global::Mesen.GUI.Properties.Resources.Edit;
this.mnuConfigureExternalEditor.Name = "mnuConfigureExternalEditor";
this.mnuConfigureExternalEditor.Size = new System.Drawing.Size(266, 22);
this.mnuConfigureExternalEditor.Text = "Configure external code editor...";
this.mnuConfigureExternalEditor.Click += new System.EventHandler(this.mnuConfigureExternalEditor_Click);
//
// toolsToolStripMenuItem
//
this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@ -1915,11 +1930,6 @@ namespace Mesen.GUI.Debugger
this.tsToolbar.Text = "toolStrip1";
this.tsToolbar.Visible = false;
//
// toolStripMenuItem29
//
this.toolStripMenuItem29.Name = "toolStripMenuItem29";
this.toolStripMenuItem29.Size = new System.Drawing.Size(180, 6);
//
// frmDebugger
//
this.AllowDrop = true;
@ -2157,5 +2167,6 @@ namespace Mesen.GUI.Debugger
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem28;
private System.Windows.Forms.ToolStripMenuItem mnuGoToAll;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem29;
private System.Windows.Forms.ToolStripMenuItem mnuConfigureExternalEditor;
}
}

View file

@ -1814,5 +1814,12 @@ namespace Mesen.GUI.Debugger
}
}
}
private void mnuConfigureExternalEditor_Click(object sender, EventArgs e)
{
using(frmExternalEditorConfig frm = new frmExternalEditorConfig()) {
frm.ShowDialog(mnuConfigureExternalEditor, this);
}
}
}
}

View file

@ -0,0 +1,139 @@
namespace Mesen.GUI.Debugger
{
partial class frmExternalEditorConfig
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.txtArguments = new System.Windows.Forms.TextBox();
this.lblPath = new System.Windows.Forms.Label();
this.lblArguments = new System.Windows.Forms.Label();
this.lblHint = new System.Windows.Forms.Label();
this.txtPath = new System.Windows.Forms.TextBox();
this.tableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// baseConfigPanel
//
this.baseConfigPanel.Location = new System.Drawing.Point(0, 127);
this.baseConfigPanel.Size = new System.Drawing.Size(488, 29);
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Controls.Add(this.txtArguments, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.lblPath, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.lblArguments, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.lblHint, 1, 2);
this.tableLayoutPanel1.Controls.Add(this.txtPath, 1, 0);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 3;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(488, 127);
this.tableLayoutPanel1.TabIndex = 2;
//
// txtArguments
//
this.txtArguments.Dock = System.Windows.Forms.DockStyle.Fill;
this.txtArguments.Location = new System.Drawing.Point(137, 29);
this.txtArguments.Name = "txtArguments";
this.txtArguments.Size = new System.Drawing.Size(348, 20);
this.txtArguments.TabIndex = 4;
//
// lblPath
//
this.lblPath.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblPath.AutoSize = true;
this.lblPath.Location = new System.Drawing.Point(3, 6);
this.lblPath.Name = "lblPath";
this.lblPath.Size = new System.Drawing.Size(79, 13);
this.lblPath.TabIndex = 0;
this.lblPath.Text = "Editor filename:";
//
// lblArguments
//
this.lblArguments.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblArguments.AutoSize = true;
this.lblArguments.Location = new System.Drawing.Point(3, 32);
this.lblArguments.Name = "lblArguments";
this.lblArguments.Size = new System.Drawing.Size(128, 13);
this.lblArguments.TabIndex = 1;
this.lblArguments.Text = "Command line arguments:";
//
// lblHint
//
this.lblHint.AutoSize = true;
this.lblHint.Location = new System.Drawing.Point(137, 57);
this.lblHint.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);
this.lblHint.Name = "lblHint";
this.lblHint.Size = new System.Drawing.Size(183, 65);
this.lblHint.TabIndex = 2;
this.lblHint.Text = "%F = the file to edit\r\n%L = the line at which to open the file\r\n\r\ne.g: for Notepa" +
"d++:\r\n%F -n%L";
//
// txtPath
//
this.txtPath.Dock = System.Windows.Forms.DockStyle.Fill;
this.txtPath.Location = new System.Drawing.Point(137, 3);
this.txtPath.Name = "txtPath";
this.txtPath.Size = new System.Drawing.Size(348, 20);
this.txtPath.TabIndex = 3;
//
// frmExternalEditorConfig
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(488, 156);
this.Controls.Add(this.tableLayoutPanel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.Name = "frmExternalEditorConfig";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Configure external code editor...";
this.Controls.SetChildIndex(this.baseConfigPanel, 0);
this.Controls.SetChildIndex(this.tableLayoutPanel1, 0);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.TextBox txtArguments;
private System.Windows.Forms.Label lblPath;
private System.Windows.Forms.Label lblArguments;
private System.Windows.Forms.Label lblHint;
private System.Windows.Forms.TextBox txtPath;
}
}

View file

@ -0,0 +1,27 @@
using Mesen.GUI.Config;
using Mesen.GUI.Forms;
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;
namespace Mesen.GUI.Debugger
{
public partial class frmExternalEditorConfig : BaseConfigForm
{
public frmExternalEditorConfig()
{
InitializeComponent();
Entity = ConfigManager.Config.DebugInfo;
AddBinding("ExternalEditorPath", txtPath);
AddBinding("ExternalEditorArguments", txtArguments);
}
}
}

View file

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View file

@ -661,6 +661,12 @@
<Compile Include="Debugger\frmAssembler.Designer.cs">
<DependentUpon>frmAssembler.cs</DependentUpon>
</Compile>
<Compile Include="Debugger\frmExternalEditorConfig.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Debugger\frmExternalEditorConfig.Designer.cs">
<DependentUpon>frmExternalEditorConfig.cs</DependentUpon>
</Compile>
<Compile Include="Debugger\frmGoToAll.cs">
<SubType>Form</SubType>
</Compile>
@ -1359,6 +1365,9 @@
<EmbeddedResource Include="Debugger\Controls\ctrlSourceViewer.resx">
<DependentUpon>ctrlSourceViewer.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Debugger\frmExternalEditorConfig.resx">
<DependentUpon>frmExternalEditorConfig.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Debugger\frmGoToAll.resx">
<DependentUpon>frmGoToAll.cs</DependentUpon>
</EmbeddedResource>