Mesen-X/GUI.NET/Debugger/Controls/ctrlBreakpoints.cs

177 lines
5.5 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
2016-12-11 14:25:29 -05:00
using Mesen.GUI.Controls;
using System.Collections.ObjectModel;
using Mesen.GUI.Config;
namespace Mesen.GUI.Debugger.Controls
{
2016-12-11 14:25:29 -05:00
public partial class ctrlBreakpoints : BaseControl
{
2016-01-10 00:33:33 -05:00
public event EventHandler BreakpointNavigation;
public ctrlBreakpoints()
{
InitializeComponent();
2018-01-01 11:35:36 -05:00
bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
if(!designMode) {
mnuShowLabels.Checked = ConfigManager.Config.DebugInfo.ShowBreakpointLabels;
mnuShowLabels.CheckedChanged += mnuShowLabels_CheckedChanged;
2018-01-01 11:35:36 -05:00
BreakpointManager.BreakpointsChanged += BreakpointManager_OnBreakpointChanged;
mnuRemoveBreakpoint.Enabled = false;
mnuEditBreakpoint.Enabled = false;
mnuGoToLocation.Enabled = false;
}
}
2016-01-10 00:33:33 -05:00
void BreakpointManager_OnBreakpointChanged(object sender, EventArgs e)
{
if(this.InvokeRequired) {
this.BeginInvoke((Action)(() => RefreshList()));
} else {
RefreshList();
}
}
2016-01-10 00:33:33 -05:00
protected override void OnLoad(EventArgs e)
{
2016-01-10 00:33:33 -05:00
base.OnLoad(e);
AdjustColumnWidth();
}
public void RefreshListAddresses()
{
lstBreakpoints.BeginUpdate();
ReadOnlyCollection<Breakpoint> breakpoints = BreakpointManager.Breakpoints;
for(int i = 0; i < breakpoints.Count; i++) {
lstBreakpoints.Items[i].SubItems[2].Text = breakpoints[i].GetAddressString(mnuShowLabels.Checked);
}
lstBreakpoints.EndUpdate();
}
public void RefreshList()
{
lstBreakpoints.ItemChecked -= new ItemCheckedEventHandler(lstBreakpoints_ItemChecked);
int topIndex = lstBreakpoints.TopItem != null ? lstBreakpoints.TopItem.Index : 0;
lstBreakpoints.BeginUpdate();
lstBreakpoints.Items.Clear();
2016-01-10 00:33:33 -05:00
foreach(Breakpoint breakpoint in BreakpointManager.Breakpoints) {
ListViewItem item = new ListViewItem();
item.Tag = breakpoint;
item.Checked = breakpoint.Enabled;
item.SubItems.Add(breakpoint.ToReadableType());
item.SubItems.Add(breakpoint.GetAddressString(mnuShowLabels.Checked));
item.SubItems.Add(breakpoint.Condition);
lstBreakpoints.Items.Add(item);
}
lstBreakpoints.EndUpdate();
if(lstBreakpoints.Items.Count > 0) {
lstBreakpoints.TopItem = lstBreakpoints.Items[lstBreakpoints.Items.Count > topIndex ? topIndex : lstBreakpoints.Items.Count - 1];
}
lstBreakpoints.ItemChecked += new ItemCheckedEventHandler(lstBreakpoints_ItemChecked);
}
private void lstBreakpoints_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)
{
if(e.ColumnIndex == 2) {
e.Cancel = true;
}
AdjustColumnWidth();
}
private void lstBreakpoints_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)
{
AdjustColumnWidth();
}
private void AdjustColumnWidth()
{
lstBreakpoints.ColumnWidthChanging -= lstBreakpoints_ColumnWidthChanging;
lstBreakpoints.ColumnWidthChanged -= lstBreakpoints_ColumnWidthChanged;
//Force watch values to take the full width of the list
int totalWidth = lstBreakpoints.Columns[0].Width + lstBreakpoints.Columns[1].Width + lstBreakpoints.Columns[2].Width + lstBreakpoints.Columns[3].Width;
colLastColumn.Width = lstBreakpoints.ClientSize.Width - totalWidth;
lstBreakpoints.ColumnWidthChanging += lstBreakpoints_ColumnWidthChanging;
lstBreakpoints.ColumnWidthChanged += lstBreakpoints_ColumnWidthChanged;
}
private void lstBreakpoints_ItemChecked(object sender, ItemCheckedEventArgs e)
{
if(((Breakpoint)e.Item.Tag).Enabled != e.Item.Checked) {
((Breakpoint)e.Item.Tag).SetEnabled(e.Item.Checked);
}
}
private void lstBreakpoints_DoubleClick(object sender, EventArgs e)
{
if(lstBreakpoints.SelectedItems.Count > 0) {
2016-01-10 00:33:33 -05:00
BreakpointManager.EditBreakpoint(((Breakpoint)lstBreakpoints.SelectedItems[0].Tag));
}
}
private void mnuRemoveBreakpoint_Click(object sender, EventArgs e)
{
foreach(ListViewItem item in lstBreakpoints.SelectedItems) {
2016-01-10 00:33:33 -05:00
BreakpointManager.RemoveBreakpoint((Breakpoint)item.Tag);
}
}
private void mnuAddBreakpoint_Click(object sender, EventArgs e)
{
Breakpoint breakpoint = new Breakpoint();
if(new frmBreakpoint(breakpoint).ShowDialog() == DialogResult.OK) {
2016-01-10 00:33:33 -05:00
BreakpointManager.AddBreakpoint(breakpoint);
}
}
private void mnuGoToLocation_Click(object sender, EventArgs e)
{
if(BreakpointNavigation != null) {
Breakpoint bp = lstBreakpoints.SelectedItems[0].Tag as Breakpoint;
if(bp.IsCpuBreakpoint && bp.GetRelativeAddress() >= 0) {
BreakpointNavigation(bp, null);
}
}
}
private void mnuEditBreakpoint_Click(object sender, EventArgs e)
{
if(lstBreakpoints.SelectedItems.Count > 0) {
BreakpointManager.EditBreakpoint(((Breakpoint)lstBreakpoints.SelectedItems[0].Tag));
}
}
private void lstBreakpoints_SelectedIndexChanged(object sender, EventArgs e)
{
mnuRemoveBreakpoint.Enabled = (lstBreakpoints.SelectedItems.Count > 0);
mnuEditBreakpoint.Enabled = (lstBreakpoints.SelectedItems.Count == 1);
if(lstBreakpoints.SelectedItems.Count == 1) {
Breakpoint bp = lstBreakpoints.SelectedItems[0].Tag as Breakpoint;
mnuGoToLocation.Enabled = bp.IsCpuBreakpoint && bp.GetRelativeAddress() >= 0;
}
}
private void mnuShowLabels_CheckedChanged(object sender, EventArgs e)
{
ConfigManager.Config.DebugInfo.ShowBreakpointLabels = mnuShowLabels.Checked;
ConfigManager.ApplyChanges();
this.RefreshListAddresses();
}
}
}