//
//
//
//
using System;
using System.Windows.Forms;
using System.Drawing;
using System.CodeDom.Compiler;
using System.Collections;
using System.IO;
using System.Diagnostics;
//using ICSharpCode.Core.Services;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Services;
//using ICSharpCode.Core.Properties;
using DebuggerLibrary;
namespace ICSharpCode.SharpDevelop.Gui.Pads
{
public class LocalVarPad : AbstractPadContent
{
TreeListView localVarList;
//ClassBrowserIconsService iconsService;
ColumnHeader name = new ColumnHeader();
ColumnHeader val = new ColumnHeader();
ColumnHeader type = new ColumnHeader();
public override Control Control {
get {
return localVarList;
}
}
public LocalVarPad() //: base("${res:MainWindow.Windows.Debug.Local}", null)
{
InitializeComponents();
}
void InitializeComponents()
{
ImageList imageList = new ImageList();
imageList.Images.Add(IconService.GetBitmap("Icons.16x16.Class"));
imageList.Images.Add(IconService.GetBitmap("Icons.16x16.Field"));
imageList.Images.Add(IconService.GetBitmap("Icons.16x16.Property"));
//iconsService = (ClassBrowserIconsService)ServiceManager.Services.GetService(typeof(ClassBrowserIconsService));
localVarList = new TreeListView();
localVarList.SmallImageList = imageList;
localVarList.ShowPlusMinus = true;
localVarList.FullRowSelect = true;
localVarList.Dock = DockStyle.Fill;
//localVarList.GridLines = false;
//localVarList.Activation = ItemActivation.OneClick;
localVarList.Columns.AddRange(new ColumnHeader[] {name, val, type} );
name.Width = 250;
val.Width = 300;
type.Width = 250;
localVarList.BeforeExpand += new TreeListViewCancelEventHandler(localVarList_BeforeExpand);
NDebugger.DebuggingPaused += new DebuggingPausedEventHandler(debuggerService_OnDebuggingPaused);
RedrawContent();
}
public override void RedrawContent()
{
name.Text = "Name";
val.Text = "Value";
type.Text = "Type";
if (NDebugger.IsDebugging && NDebugger.IsProcessRunning == false) {
debuggerService_OnDebuggingPaused(this, new DebuggingPausedEventArgs(PausedReason.StepComplete));
}
}
private void debuggerService_OnDebuggingPaused(object sender, DebuggingPausedEventArgs e)
{
localVarList.BeginUpdate();
localVarList.Items.Clear();
AddVariables(localVarList.Items, NDebugger.LocalVariables);
localVarList.EndUpdate();
}
private void localVarList_BeforeExpand(object sender, TreeListViewCancelEventArgs e)
{
localVarList.BeginUpdate();
e.Item.Items.Clear();
ObjectVariable var = e.Item.Tag as ObjectVariable;
if (var != null && var.HasBaseClass && var.BaseClass.Type != "System.Object")
{
TreeListViewItem newItem = new TreeListViewItem();
newItem.Text = "";
newItem.SubItems.Add(var.BaseClass.Value.ToString());
newItem.SubItems.Add(var.BaseClass.Type);
newItem.Tag = var.BaseClass;
newItem.ImageIndex = 0; // Class
newItem.Items.Add(""); // Show plus icon
e.Item.Items.Add(newItem);
}
AddVariables(e.Item.Items, ((Variable)e.Item.Tag).SubVariables);
localVarList.EndUpdate();
}
void AddVariables (TreeListViewItemCollection items, VariableCollection vars)
{
foreach (Variable var in vars) {
TreeListViewItem newItem = new TreeListViewItem();
newItem.Tag = var;
newItem.Text = var.Name;
newItem.SubItems.Add(var.Value.ToString());
newItem.SubItems.Add(var.Type);
items.Add(newItem);
RefreshVariable(var);
if (var is PropertyVariable) {
((PropertyVariable)var).ValueEvaluated += new EventHandler(PropertyEvaluated);
}
}
}
void PropertyEvaluated (object sender, EventArgs args)
{
RefreshVariable((Variable)sender);
}
void RefreshVariable (Variable var)
{
foreach (TreeListViewItem item in localVarList.Items) {
if (item.Tag == var) {
item.SubItems[1].Text = var.Value.ToString();
item.SubItems[2].Text = var.Type;
item.Items.Clear();
if (var is ObjectVariable && ((ObjectVariable)var).HasBaseClass) {
// It is a class
item.ImageIndex = 0; // Class
item.Items.Add(""); // Show plus icon
} else if (var is PropertyVariable){
// It is a property
item.ImageIndex = 2; // Property
} else {
item.ImageIndex = 1; // Field
}
}
}
}
}
}