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 PascalABCCompiler.Errors ;
using PascalABCCompiler.SemanticTree ;
using System.Collections ;
namespace VisualPascalABCPlugins
{
public partial class SemanticTreeVisualisatorForm : Form
{
public IVisualEnvironmentCompiler VisualEnvironmentCompiler ;
public SematicTreeVisitor Visitor ;
public SemanticTreeVisualisatorForm ( )
{
InitializeComponent ( ) ;
PascalABCCompiler . StringResources . SetTextForAllObjects ( this , SyntaxTreeVisualisator_VisualPascalABCPlugin . StringsPrefix ) ;
}
private void SyntaxTreeVisualisatorForm_Load ( object sender , EventArgs e )
{
}
private void SyntaxTreeVisualisatorForm_FormClosing ( object sender , FormClosingEventArgs e )
{
e . Cancel = true ;
this . Visible = false ;
}
private void SyntaxTreeVisualisatorForm_Shown ( object sender , EventArgs e )
{
VisualEnvironmentCompiler . StandartCompiler . OnChangeCompilerState + = new PascalABCCompiler . ChangeCompilerStateEventDelegate ( Compiler_OnChangeCompilerState ) ;
treeView . Nodes . Clear ( ) ;
}
bool BuildButtonsEnabled
{
set
{
tbRebuild . Enabled = tbBuild . Enabled = value ;
}
get
{
return tbRebuild . Enabled ;
}
}
void Compiler_OnChangeCompilerState ( PascalABCCompiler . ICompiler sender , PascalABCCompiler . CompilerState State , string FileName )
{
switch ( State )
{
case PascalABCCompiler . CompilerState . CompilationStarting :
BuildButtonsEnabled = false ;
this . Refresh ( ) ;
break ;
case PascalABCCompiler . CompilerState . CompilationFinished :
ShowTree ( ) ;
BuildButtonsEnabled = true ;
break ;
}
}
public void ShowTree ( )
{
2015-12-28 14:25:15 +03:00
//Желательно строить в отдельном потоке а потом разом выводить. Незабуть про синхронизацию.
//Пока можно посто в лоб.
2015-05-14 22:35:07 +03:00
try
{
PascalABCCompiler . SemanticTree . IProgramNode Root = VisualEnvironmentCompiler . StandartCompiler . SemanticTree ;
treeView . Nodes . Clear ( ) ;
2015-12-28 14:25:15 +03:00
// связываем Visitor и treeView.Nodes
2015-05-14 22:35:07 +03:00
Visitor = new SematicTreeVisitor ( treeView . Nodes ) ;
Visitor . CreateMyDictionaries ( ) ;
Visitor . setTreeView ( treeView ) ;
2015-12-28 14:25:15 +03:00
// собственно проходим по дереву от корня
2015-05-14 22:35:07 +03:00
Root . visit ( Visitor ) ;
//Visitor.visit(Root, treeView.Nodes);
//Visitor.visit(Root);
2015-12-28 14:25:15 +03:00
// устанавливаем обратные связи
2015-05-14 22:35:07 +03:00
Visitor . makeUpRows ( treeView ) ;
2015-12-28 14:25:15 +03:00
// по умолчанию выбранным является Nodes[0]
2015-05-14 22:35:07 +03:00
treeView . SelectedNode = treeView . Nodes [ 0 ] ;
//treeView.SelectedNode.BackColor = Color.Chocolate;
//treeView.Invalidate();
treeView . Invalidate ( ) ;
treeView . Refresh ( ) ;
treeView . Update ( ) ;
}
catch ( Exception e )
{
VisualEnvironmentCompiler . ExecuteAction ( VisualEnvironmentCompilerAction . AddTextToCompilerMessages , "SemanticVisualisator Exception: " + e . ToString ( ) ) ;
}
}
private void toolStripButton1_Click ( object sender , EventArgs e )
{
VisualEnvironmentCompiler . StandartCompiler . InternalDebug . CodeGeneration = false ;
PascalABCCompiler . CompilerType ct = VisualEnvironmentCompiler . DefaultCompilerType ;
VisualEnvironmentCompiler . DefaultCompilerType = PascalABCCompiler . CompilerType . Standart ;
VisualEnvironmentCompiler . ExecuteAction ( VisualEnvironmentCompilerAction . Build , null ) ;
VisualEnvironmentCompiler . DefaultCompilerType = ct ;
VisualEnvironmentCompiler . StandartCompiler . InternalDebug . CodeGeneration = true ;
}
private void toolStripButton2_Click ( object sender , EventArgs e )
{
VisualEnvironmentCompiler . StandartCompiler . InternalDebug . CodeGeneration = false ;
PascalABCCompiler . CompilerType ct = VisualEnvironmentCompiler . DefaultCompilerType ;
VisualEnvironmentCompiler . DefaultCompilerType = PascalABCCompiler . CompilerType . Standart ;
VisualEnvironmentCompiler . ExecuteAction ( VisualEnvironmentCompilerAction . Rebuild , null ) ;
VisualEnvironmentCompiler . DefaultCompilerType = ct ;
VisualEnvironmentCompiler . StandartCompiler . InternalDebug . CodeGeneration = true ;
}
private void treeView_AfterSelect ( object sender , TreeViewEventArgs e )
{
Visitor . visitSelectedNode ( treeView . SelectedNode ) ;
treeView . Invalidate ( ) ;
treeView . Refresh ( ) ;
treeView . Update ( ) ;
TreeNode tn = treeView . SelectedNode ;
mylabel . Text = "" ;
PascalABCCompiler . SemanticTree . ISemanticNode semantic_tree_node = tn . Tag as PascalABCCompiler . SemanticTree . ISemanticNode ;
//PascalABCCompiler.SyntaxTree.syntax_tree_node syntax_tree_node = tn.Tag as PascalABCCompiler.SyntaxTree.syntax_tree_node;
//if (syntax_tree_node.source_context == null) return;
if ( semantic_tree_node = = null ) return ;
PascalABCCompiler . SemanticTree . ILocated lt = semantic_tree_node as PascalABCCompiler . SemanticTree . ILocated ;
if ( lt = = null ) return ;
if ( lt . Location = = null ) return ;
//StatusLabel.Text = semantic_tree_node.ToString() + String.Format("({0},+{1})--({2},+{3})", lt.Location.begin_column_num, lt.Location.begin_line_num, lt.Location.end_column_num, lt.Location.end_line_num);
string s = String . Format ( "({0},+{1})--({2},+{3})" , lt . Location . begin_line_num , lt . Location . begin_column_num , lt . Location . end_line_num , lt . Location . end_column_num ) ;
mylabel . Text = s ;
mylabel . Invalidate ( ) ;
treeView . Invalidate ( ) ;
//StatusLabel.Text = syntax_tree_node.source_context.ToString() + string.Format("({0},+{1})", syntax_tree_node.source_context.Position, syntax_tree_node.source_context.Length);
//if (syntax_tree_node.source_context.FileName != null)
// StatusLabel.Text += Path.GetFileName(syntax_tree_node.source_context.FileName);
//if (Errors.Count > 0)
// if (Errors[syntax_tree_node] != null)
// StatusLabel.Text += string.Format(" [BAD{0}]", Errors[syntax_tree_node]);
//this.VisualEnvironmentCompiler.ExecuteSourceLocationAction(
// PascalABCCompiler.Tools.ConvertSourceContextToSourceLocation((syntaxTreeSelectComboBox.SelectedItem as SyntaxTreeSelectComboBoxItem).FileName, syntax_tree_node.source_context),
// SourceLocationAction.SelectAndGotoBeg);
Visitor . visitSelectedNode ( treeView . SelectedNode ) ;
treeView . Invalidate ( ) ;
//treeView.Refresh();
//treeView.Update();
}
/ * private void treeView_Click ( object sender , EventArgs e )
{
Visitor . visitSelectedNode ( treeView . SelectedNode ) ;
treeView . Invalidate ( ) ;
treeView . Refresh ( ) ;
treeView . Update ( ) ;
TreeNode tn = treeView . SelectedNode ;
mylabel . Text = "" ;
PascalABCCompiler . SemanticTree . ISemanticNode semantic_tree_node = tn . Tag as PascalABCCompiler . SemanticTree . ISemanticNode ;
//PascalABCCompiler.SyntaxTree.syntax_tree_node syntax_tree_node = tn.Tag as PascalABCCompiler.SyntaxTree.syntax_tree_node;
//if (syntax_tree_node.source_context == null) return;
if ( semantic_tree_node = = null ) return ;
PascalABCCompiler . SemanticTree . ILocated lt = semantic_tree_node as PascalABCCompiler . SemanticTree . ILocated ;
if ( lt = = null ) return ;
if ( lt . Location = = null ) return ;
//StatusLabel.Text = semantic_tree_node.ToString() + String.Format("({0},+{1})--({2},+{3})", lt.Location.begin_column_num, lt.Location.begin_line_num, lt.Location.end_column_num, lt.Location.end_line_num);
string s = String . Format ( "({0},+{1})--({2},+{3})" , lt . Location . begin_line_num , lt . Location . begin_column_num , lt . Location . end_line_num , lt . Location . end_column_num ) ;
mylabel . Text = s ;
mylabel . Invalidate ( ) ;
treeView . Invalidate ( ) ;
//StatusLabel.Text = syntax_tree_node.source_context.ToString() + string.Format("({0},+{1})", syntax_tree_node.source_context.Position, syntax_tree_node.source_context.Length);
//if (syntax_tree_node.source_context.FileName != null)
// StatusLabel.Text += Path.GetFileName(syntax_tree_node.source_context.FileName);
//if (Errors.Count > 0)
// if (Errors[syntax_tree_node] != null)
// StatusLabel.Text += string.Format(" [BAD{0}]", Errors[syntax_tree_node]);
//this.VisualEnvironmentCompiler.ExecuteSourceLocationAction(
// PascalABCCompiler.Tools.ConvertSourceContextToSourceLocation((syntaxTreeSelectComboBox.SelectedItem as SyntaxTreeSelectComboBoxItem).FileName, syntax_tree_node.source_context),
// SourceLocationAction.SelectAndGotoBeg);
Visitor . visitSelectedNode ( treeView . SelectedNode ) ;
treeView . Invalidate ( ) ;
treeView . Refresh ( ) ;
treeView . Update ( ) ;
} * /
}
}