2019-07-28 23:53:15 +03:00
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
2015-06-02 23:06:57 +03:00
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
2015-05-14 22:35:07 +03:00
using System ;
using System.Collections.Generic ;
using System.ComponentModel ;
using System.Data ;
using System.Drawing ;
using System.Text ;
using System.Windows.Forms ;
using WeifenLuo.WinFormsUI.Docking ;
namespace VisualPascalABC
{
public partial class DebugWatchListWindowForm : BottomDockContentForm
{
// private System.Windows.Forms.DataGridViewTextBoxColumn WColumn4;
// private System.Windows.Forms.DataGridViewTextBoxColumn WColumn1;
// private System.Windows.Forms.DataGridViewTextBoxColumn WColumn2;
// private System.Windows.Forms.DataGridViewTextBoxColumn WColumn3;
// private System.Windows.Forms.DataGridViewTextBoxColumn WColumn5;
private System . Windows . Forms . DataGridViewTextBoxColumn WColumn4 ;
private AdvancedDataGridView . TreeGridColumn WColumn1 ;
private System . Windows . Forms . DataGridViewTextBoxColumn WColumn2 ;
private System . Windows . Forms . DataGridViewTextBoxColumn WColumn3 ;
private System . Windows . Forms . DataGridViewTextBoxColumn WColumn5 ;
2018-11-23 15:28:23 +03:00
private System . Windows . Forms . DataGridViewTextBoxColumn WColumn6Empty ;
2015-05-14 22:35:07 +03:00
private System . Threading . Thread th ;
public void RefreshWatch ( )
{
//if (!dbgHelper.IsRunning) return;
/ * if ( th ! = null & & th . ThreadState = = System . Threading . ThreadState . Running )
{
System . Threading . Thread . Sleep ( 50 ) ;
if ( th . ThreadState = = System . Threading . ThreadState . Running ) th . Suspend ( ) ;
} * /
// if (th == null || th.ThreadState != System.Threading.ThreadState.Running)
// {
// th = new System.Threading.Thread(new System.Threading.ThreadStart(RefreshWatchInThread));
// th.Start();
// }
RefreshWatchInThread ( ) ;
}
private string WrapPrimValue ( object val )
{
if ( val is string | | val is char ) return "'" + val . ToString ( ) + "'" ;
return val . ToString ( ) ;
}
public void ClearAllSubTrees ( )
{
for ( int i = 0 ; i < this . watchList . Rows . Count ; i + + )
{
if ( this . watchList . Rows [ i ] . Cells [ 0 ] . Value ! = null )
{
ClearRow ( i ) ;
}
}
}
public void ClearRow ( int i )
{
AdvancedDataGridView . TreeGridNode node = this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ;
if ( node . IsExpanded )
node . Collapse ( ) ;
node . populated = false ;
node . IsExpanded = false ;
node . InExpanding = false ;
node . HasChildren = false ;
node . _grid = null ;
node . Nodes . Clear ( ) ;
this . watchList . InvalidateRow ( i ) ;
}
public void SetUndefinedValue ( int i )
{
if ( this . watchList . Rows [ i ] . Cells [ 0 ] . Value ! = null )
{
this . ClearRow ( i ) ;
//FixedItem fi = new FixedItem(this.watchList.Rows[i].Cells[0].Value as string,PascalABCCompiler.StringResources.Get("EXPR_VALUE_UNDEFINED_VALUE"),PascalABCCompiler.StringResources.Get("EXPR_VALUE_UNDEFINED_TYPE"));
FixedItem fi = new FixedItem ( this . watchList . Rows [ i ] . Cells [ 0 ] . Value as string , "" , "" ) ;
//fi.imageIndex = CodeCompletionProvider.ImagesProvider.IconNumberEvalError;
this . watchList . Rows [ i ] . Cells [ 1 ] . Value = fi . Text ;
this . watchList . Rows [ i ] . Cells [ 2 ] . Value = fi . Type ;
( this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ) . _grid = this . watchList ;
( this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ) . Content = fi ;
this . watchList . InvalidateCell ( 0 , i ) ;
}
}
public string [ ] GetExpressions ( )
{
List < string > exprs = new List < string > ( ) ;
for ( int i = 0 ; i < watchList . Rows . Count - 1 ; i + + )
{
exprs . Add ( this . watchList . Rows [ i ] . Cells [ 0 ] . Value as string ) ;
}
return exprs . ToArray ( ) ;
}
public void RefreshRow ( int i )
{
if ( this . watchList . Rows [ i ] . Cells [ 0 ] . Value ! = null )
{
if ( ( this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ) . UserRow )
{
string s = this . watchList . Rows [ i ] . Cells [ 0 ] . Value as string ;
RetValue rv = WorkbenchServiceFactory . DebuggerManager . Evaluate ( s ) ;
if ( rv . syn_err )
{
this . ClearRow ( i ) ;
FixedItem fi = new FixedItem ( this . watchList . Rows [ i ] . Cells [ 0 ] . Value as string , PascalABCCompiler . StringResources . Get ( "EXPR_VALUE_SYNTAX_ERROR_IN_EXPR" ) , "" ) ;
fi . imageIndex = CodeCompletionProvider . ImagesProvider . IconNumberEvalError ;
this . watchList . Rows [ i ] . Cells [ 1 ] . Value = fi . Text ;
this . watchList . Rows [ i ] . Cells [ 2 ] . Value = fi . Type ;
( this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ) . _grid = this . watchList ;
( this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ) . Content = fi ;
}
else
if ( rv . obj_val ! = null )
{
//this.ClearRow(i);
try
{
ValueItem vi = new ValueItem ( rv . obj_val , s , WorkbenchServiceFactory . DebuggerManager . evaluator . declaringType ) ;
( this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ) . _grid = this . watchList ;
( this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ) . Content = vi ;
this . watchList . Rows [ i ] . Cells [ 1 ] . Value = WorkbenchServiceFactory . DebuggerManager . MakeValueView ( rv . obj_val ) ; //rv.obj_val.AsString;
this . watchList . Rows [ i ] . Cells [ 2 ] . Value = DebugUtils . WrapTypeName ( rv . obj_val . Type ) ;
this . watchList . InvalidateCell ( 0 , i ) ;
}
catch ( System . Exception e )
{
}
}
else if ( rv . prim_val ! = null )
{
//this.ClearRow(i);
FixedItem fi = new FixedItem ( s , WrapPrimValue ( rv . prim_val ) , DebugUtils . WrapTypeName ( rv . prim_val . GetType ( ) ) ) ;
this . watchList . Rows [ i ] . Cells [ 1 ] . Value = fi . Text ;
this . watchList . Rows [ i ] . Cells [ 2 ] . Value = fi . Type ;
( this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ) . _grid = this . watchList ;
( this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ) . Content = fi ;
this . watchList . InvalidateCell ( 0 , i ) ;
}
else if ( rv . type ! = null )
{
//this.ClearRow(i);
BaseTypeItem bti = new BaseTypeItem ( rv . type , rv . managed_type ) ;
( this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ) . _grid = this . watchList ;
( this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ) . Content = bti ;
}
else
{
this . ClearRow ( i ) ;
FixedItem fi = null ;
if ( WorkbenchServiceFactory . DebuggerManager . IsRunning )
{
fi = new FixedItem ( s , rv . err_mes ! = null ? rv . err_mes : PascalABCCompiler . StringResources . Get ( "EXPR_VALUE_UNDEFINED_VALUE" ) , /*PascalABCCompiler.StringResources.Get("EXPR_VALUE_UNDEFINED_TYPE")*/ "" ) ;
fi . imageIndex = CodeCompletionProvider . ImagesProvider . IconNumberEvalError ;
}
else
{
fi = new FixedItem ( s , "" , "" ) ;
}
this . watchList . Rows [ i ] . Cells [ 1 ] . Value = fi . Text ;
this . watchList . Rows [ i ] . Cells [ 2 ] . Value = fi . Type ;
( this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ) . _grid = this . watchList ;
( this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ) . Content = fi ;
this . watchList . InvalidateCell ( 0 , i ) ;
}
}
else
{
}
}
else
{
//this.watchList.Rows[i].Cells[1].Value = null;
//this.watchList.Rows[i].Cells[2].Value = null;
if ( i ! = this . watchList . Rows . Count - 1 )
{
this . ClearRow ( i ) ;
FixedItem fi = new FixedItem ( "" , "" , "" ) ;
this . watchList . Rows [ i ] . Cells [ 1 ] . Value = "" ;
this . watchList . Rows [ i ] . Cells [ 2 ] . Value = "" ;
( this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ) . _grid = this . watchList ;
( this . watchList . Rows [ i ] as AdvancedDataGridView . TreeGridNode ) . Content = fi ;
this . watchList . InvalidateCell ( 0 , i ) ;
this . watchList . Rows . RemoveAt ( i ) ;
}
//this.watchList.InvalidateCell(0,i);
}
}
private void RefreshWatchInThread ( )
{
for ( int i = 0 ; i < this . watchList . Rows . Count ; i + + )
{
RefreshRow ( i ) ;
}
}
private void RefreshWatchDel ( object sender , DataGridViewCellEventArgs e )
{
//RefreshWatch();
}
private void CellClickDel ( object sender , DataGridViewCellEventArgs e )
{
try
{
if ( e . ColumnIndex = = 0 & & this . watchList . Rows [ e . RowIndex ] . Cells [ 0 ] . Value = = null )
{
this . watchList . Rows [ e . RowIndex ] . Selected = false ;
this . watchList . BeginEdit ( false ) ;
}
}
catch ( Exception ex )
{
}
}
private void KeyDownDel ( object sender , KeyEventArgs e )
{
if ( e . KeyCode = = Keys . Enter & & ! watchList . IsCurrentCellInEditMode & & watchList . SelectedRows . Count = = 1 )
AddNewEntry ( watchList . Rows [ watchList . SelectedRows [ 0 ] . Index ] . Cells [ 0 ] . Value as string ) ;
}
private void CellDblClickDel ( object sender , DataGridViewCellEventArgs e )
{
try
{
// if (e.ColumnIndex == 0 && this.watchList.Rows[e.RowIndex].Cells[0].Value == null)
if ( ( this . watchList . Rows [ e . RowIndex ] as AdvancedDataGridView . TreeGridNode ) . UserRow & & ( this . watchList . Rows [ e . RowIndex ] . Cells [ 0 ] as AdvancedDataGridView . TreeGridCell ) . on_name_click )
{
this . watchList . Rows [ e . RowIndex ] . Selected = false ;
this . watchList . BeginEdit ( false ) ;
}
}
catch ( Exception ex )
{
}
}
public static DebugWatchListWindowForm WatchWindow
{
get
{
return watchWindow ;
}
}
private static DebugWatchListWindowForm watchWindow ;
public DebugWatchListWindowForm ( Form1 MainForm )
: base ( MainForm )
{
InitializeComponent ( ) ;
// this.WColumn4 = new System.Windows.Forms.DataGridViewTextBoxColumn();
// this.WColumn1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
// this.WColumn2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
// this.WColumn3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
// this.WColumn5 = new System.Windows.Forms.DataGridViewTextBoxColumn();
watchWindow = this ;
Form1StringResources . SetTextForAllControls ( this . cntxtWatch ) ;
this . WColumn4 = new System . Windows . Forms . DataGridViewTextBoxColumn ( ) ;
this . WColumn1 = new AdvancedDataGridView . TreeGridColumn ( ) ;
this . WColumn2 = new System . Windows . Forms . DataGridViewTextBoxColumn ( ) ;
this . WColumn3 = new System . Windows . Forms . DataGridViewTextBoxColumn ( ) ;
this . WColumn5 = new System . Windows . Forms . DataGridViewTextBoxColumn ( ) ;
2018-11-23 15:28:23 +03:00
this . WColumn6Empty = new System . Windows . Forms . DataGridViewTextBoxColumn ( ) ;
2015-05-14 22:35:07 +03:00
this . watchList . AutoSizeColumnsMode = System . Windows . Forms . DataGridViewAutoSizeColumnsMode . Fill ;
this . watchList . AutoSizeRowsMode = System . Windows . Forms . DataGridViewAutoSizeRowsMode . AllCellsExceptHeaders ;
this . watchList . BackgroundColor = System . Drawing . Color . White ;
this . watchList . ColumnHeadersHeightSizeMode = System . Windows . Forms . DataGridViewColumnHeadersHeightSizeMode . DisableResizing ;
this . watchList . Columns . AddRange ( new System . Windows . Forms . DataGridViewColumn [ ] {
2018-11-23 15:28:23 +03:00
this . WColumn1 ,
this . WColumn3 ,
this . WColumn2 ,
this . WColumn6Empty
} ) ;
2015-05-14 22:35:07 +03:00
this . watchList . Dock = System . Windows . Forms . DockStyle . Fill ;
this . watchList . GridColor = System . Drawing . SystemColors . Control ;
this . watchList . Location = new System . Drawing . Point ( 1 , 1 ) ;
this . watchList . MultiSelect = true ;
this . watchList . Font = new Font ( "Tahoma" , 8 ) ;
this . watchList . BorderStyle = BorderStyle . None ;
this . watchList . ReadOnly = false ;
this . watchList . RowHeadersVisible = false ;
this . watchList . RowTemplate . Height = 24 ;
this . watchList . SelectionMode = System . Windows . Forms . DataGridViewSelectionMode . FullRowSelect ;
this . watchList . Size = new System . Drawing . Size ( 782 , 121 ) ;
this . watchList . TabIndex = 0 ;
//this.watchList.CellValueChanged += RefreshWatchDel;//delegate(object sender, DataGridViewCellEventArgs e) { RefreshWatch(); };
this . watchList . CellEndEdit + = delegate ( object sender , DataGridViewCellEventArgs e ) { RefreshRow ( e . RowIndex ) ; } ;
this . watchList . CellClick + = CellClickDel ;
this . watchList . CellDoubleClick + = CellDblClickDel ;
this . watchList . KeyDown + = KeyDownDel ;
this . watchList . UserDeletingRow + = new System . Windows . Forms . DataGridViewRowCancelEventHandler ( this . watchList_UserDeletingRow ) ;
this . watchList . _imageList = CodeCompletionProvider . ImagesProvider . ImageList ;
this . watchList . EditMode = System . Windows . Forms . DataGridViewEditMode . EditProgrammatically ;
this . watchList . ShowLines = true ;
this . watchList . Nodes . Add ( new AdvancedDataGridView . TreeGridNode ( ) ) ;
//this.dataGridView1.ClientSizeChanged += new System.EventHandler(this.dataGridView1_ClientSizeChanged);
//this.dataGridView1.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellDoubleClick);
//this.dataGridView1.SizeChanged += new System.EventHandler(this.dataGridView1_SizeChanged);
//this.dataGridView1.Paint += new System.Windows.Forms.PaintEventHandler(this.dataGridView1_Paint);
//this.dataGridView1.Resize += new System.EventHandler(this.dataGridView1_Resize);
this . WColumn4 . AutoSizeMode = System . Windows . Forms . DataGridViewAutoSizeColumnMode . None ;
this . WColumn4 . FillWeight = 20F ;
this . WColumn4 . Frozen = true ;
this . WColumn4 . HeaderText = "ER_NUM" ;
this . WColumn4 . Name = "WColumn4" ;
this . WColumn4 . ReadOnly = true ;
this . WColumn4 . Resizable = System . Windows . Forms . DataGridViewTriState . False ;
this . WColumn4 . Width = 25 ;
//
// Column1
//
this . WColumn1 . AutoSizeMode = System . Windows . Forms . DataGridViewAutoSizeColumnMode . None ;
this . WColumn1 . FillWeight = 20F ;
this . WColumn1 . Frozen = false ;
this . WColumn1 . HeaderText = "WT_EXPR" ;
this . WColumn1 . Name = "WColumn1" ;
this . WColumn1 . ReadOnly = false ;
this . WColumn1 . Width = 250 ;
//
// Column2
//
this . WColumn2 . AutoSizeMode = System . Windows . Forms . DataGridViewAutoSizeColumnMode . None ;
this . WColumn2 . FillWeight = 221.0297F ;
this . WColumn2 . Frozen = false ;
this . WColumn2 . HeaderText = "WT_TYPE" ;
this . WColumn2 . Name = "WColumn2" ;
this . WColumn2 . ReadOnly = true ;
this . WColumn2 . Width = 200 ;
//
// Column3
//
2018-11-23 15:28:23 +03:00
this . WColumn3 . AutoSizeMode = System . Windows . Forms . DataGridViewAutoSizeColumnMode . None ;
2015-05-14 22:35:07 +03:00
this . WColumn3 . FillWeight = 101.5228F ;
this . WColumn3 . Frozen = false ;
this . WColumn3 . HeaderText = "WT_VALUE" ;
this . WColumn3 . Name = "WColumn3" ;
this . WColumn3 . ReadOnly = true ;
2018-11-23 15:28:23 +03:00
//
// Column6Empty
//
this . WColumn6Empty . AutoSizeMode = System . Windows . Forms . DataGridViewAutoSizeColumnMode . Fill ;
this . WColumn6Empty . FillWeight = 101.5228F ;
this . WColumn6Empty . Frozen = false ;
this . WColumn6Empty . HeaderText = "" ;
this . WColumn6Empty . Name = "Empty" ;
this . WColumn6Empty . Resizable = System . Windows . Forms . DataGridViewTriState . False ;
this . WColumn6Empty . ReadOnly = true ;
2015-05-14 22:35:07 +03:00
//
// Column5
//
this . WColumn5 . AutoSizeMode = System . Windows . Forms . DataGridViewAutoSizeColumnMode . None ;
this . WColumn5 . HeaderText = "ER_PATH" ;
this . WColumn5 . Name = "WColumn5" ;
this . WColumn5 . ReadOnly = true ;
this . WColumn5 . Width = 200 ;
this . watchList . AllowUserToAddRows = true ;
this . watchList . AllowUserToDeleteRows = true ;
this . watchList . AllowUserToResizeColumns = true ;
this . watchList . AllowUserToResizeRows = false ;
}
private void DebugWathListWindowForm_Load ( object sender , EventArgs e )
{
}
private AddWatchForm frm ;
public void AddNewEntry ( string entry )
{
//this.watchList.ClearSelection();
if ( frm = = null )
{
frm = new AddWatchForm ( ) ;
Form1StringResources . SetTextForAllControls ( frm ) ;
}
frm . EditValue = entry ;
int i = 0 ;
if ( frm . ShowDialog ( ) = = DialogResult . OK )
{
if ( string . IsNullOrEmpty ( entry ) )
{
if ( this . watchList . Rows [ 0 ] . Cells [ 0 ] . Value = = null ) i = 0 ;
else
{
this . watchList . Rows . Insert ( 0 , 1 ) ; i = 0 ;
//i = this.WdataGridView1.Rows.Count-1;
}
if ( this . watchList . Rows . Count = = 1 )
this . watchList . Rows . Insert ( 0 , 1 ) ;
}
else
i = this . watchList . SelectedRows [ 0 ] . Index ;
if ( frm . EditValue ! = "" )
this . watchList . Rows [ i ] . Cells [ 0 ] . Value = frm . EditValue ;
else
this . watchList . Rows [ i ] . Cells [ 0 ] . Value = null ;
RefreshRow ( i ) ;
}
}
private void mADDEXPRToolStripMenuItem_Click ( object sender , EventArgs e )
{
AddNewEntry ( "" ) ;
}
public void RemoveAll ( )
{
this . ClearAllSubTrees ( ) ;
this . watchList . Rows . Clear ( ) ;
}
public void AddExpressions ( string [ ] exprs )
{
foreach ( string s in exprs )
AddNewEntry ( s ) ;
}
private void mDELETEEXPRToolStripMenuItem_Click ( object sender , EventArgs e )
{
try
{
for ( int i = 0 ; i < this . watchList . SelectedRows . Count ; i + + )
{
this . watchList . Rows . Remove ( this . watchList . SelectedRows [ i ] ) ;
}
this . watchList . Update ( ) ;
}
catch
{
}
}
private void mCLEARALLToolStripMenuItem_Click ( object sender , EventArgs e )
{
this . watchList . Rows . Clear ( ) ;
this . watchList . Update ( ) ;
}
private void mSELECTALLToolStripMenuItem_Click ( object sender , EventArgs e )
{
this . watchList . SelectAll ( ) ;
}
private void watchList_UserDeletingRow ( object sender , DataGridViewRowCancelEventArgs e )
{
if ( e . Row is AdvancedDataGridView . TreeGridNode & & ! ( e . Row as AdvancedDataGridView . TreeGridNode ) . UserRow )
e . Cancel = true ;
else
{
e . Cancel = false ;
if ( e . Row is AdvancedDataGridView . TreeGridNode & & ( e . Row as AdvancedDataGridView . TreeGridNode ) . IsExpanded )
ClearRow ( e . Row . Index ) ;
}
}
}
}