using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows.Controls;
using System.Windows.Input;
using System.Xml;
using ClassicAssist.Data.Macros;
using ICSharpCode.AvalonEdit.CodeCompletion;
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Highlighting;
using ICSharpCode.AvalonEdit.Highlighting.Xshd;
using ICSharpCode.AvalonEdit.Search;
using Microsoft.Scripting.Utils;
namespace ClassicAssist.UI.Views
{
///
/// Interaction logic for MacrosTabControl.xaml
///
public partial class MacrosTabControl : UserControl
{
private List _completionData;
private CompletionWindow _completionWindow;
public MacrosTabControl()
{
InitializeComponent();
}
private void Grid_Initialized( object sender, EventArgs e )
{
CodeTextEditor.SyntaxHighlighting = HighlightingLoader.Load(
new XmlTextReader( Path.Combine( Path.GetDirectoryName( Assembly.GetExecutingAssembly().Location ),
"Python.Dark.xshd" ) ), HighlightingManager.Instance );
IEnumerable namespaces = Assembly.GetExecutingAssembly().GetTypes().Where( t =>
t.Namespace != null && t.IsPublic && t.IsClass && t.Namespace.EndsWith( "Macros.Commands" ) );
_completionData = new List();
foreach ( Type type in namespaces )
{
MethodInfo[] methods = type.GetMethods( BindingFlags.Public | BindingFlags.Static );
foreach ( MethodInfo methodInfo in methods )
{
CommandsDisplayAttribute attr = methodInfo.GetCustomAttribute();
if ( attr == null )
{
continue;
}
_completionData.Add(
new PythonCompletionData( methodInfo.Name, attr.Description, attr.InsertText ) );
}
}
CodeTextEditor.TextArea.TextEntered += OnTextEntered;
SearchPanel.Install( CodeTextEditor );
}
private void OnTextEntered( object sender, TextCompositionEventArgs e )
{
DocumentLine line = CodeTextEditor.TextArea.Document.Lines[CodeTextEditor.TextArea.Caret.Line - 1];
string trimmed = CodeTextEditor.TextArea.Document.GetText( line ).TrimStart( ' ', '\t' );
if ( trimmed.TrimStart( ' ', '\t' ).Length < 3 )
{
return;
}
List data = _completionData.Where( m =>
( (string) m.Content ).StartsWith( trimmed, StringComparison.InvariantCultureIgnoreCase ) ).ToList();
if ( data.Count <= 0 )
{
return;
}
_completionWindow = new CompletionWindow( CodeTextEditor.TextArea );
_completionWindow.CompletionList.CompletionData.AddRange( data );
_completionWindow.Show();
_completionWindow.Closed += delegate { _completionWindow = null; };
}
}
}