1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
7
using System.Windows.Controls;
8
using System.Windows.Input;
10
using ICSharpCode.AvalonEdit;
11
using ICSharpCode.Core;
12
using ICSharpCode.Core.Presentation;
13
using ICSharpCode.NRefactory;
14
using ICSharpCode.SharpDevelop;
15
using ICSharpCode.SharpDevelop.Bookmarks.Pad.Controls;
16
using ICSharpCode.SharpDevelop.Debugging;
17
using ICSharpCode.SharpDevelop.Dom;
18
using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver;
19
using ICSharpCode.SharpDevelop.Editor;
20
using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
21
using ICSharpCode.SharpDevelop.Gui;
22
using ICSharpCode.SharpDevelop.Project;
24
namespace Debugger.AddIn.Pads.Controls
26
public partial class ConditionCell : UserControl
28
private string language;
30
protected ConsoleControl console;
32
public static readonly DependencyProperty CommandTextProperty =
33
DependencyProperty.Register("CommandText", typeof(string), typeof(ConditionCell),
34
new UIPropertyMetadata(null, new PropertyChangedCallback(OnCommandTextChanged)));
36
private NRefactoryResolver resolver;
38
public ConditionCell()
40
InitializeComponent();
42
console = new ConsoleControl();
43
console.TextAreaTextEntered += new TextCompositionEventHandler(consoleControl_TextAreaTextEntered);
44
console.TextAreaPreviewKeyDown += new KeyEventHandler(console_TextAreaPreviewKeyDown);
45
console.LostFocus += new RoutedEventHandler(console_LostFocus);
46
console.HideScrollBar();
47
ConsolePanel.Content = console;
50
if (ProjectService.CurrentProject == null)
53
language = ProjectService.CurrentProject.Language;
54
resolver = new NRefactoryResolver(LanguageProperties.GetLanguage(language));
57
if (language == "VB" || language == "VBNet") {
58
console.SetHighlighting("VBNET");
61
console.SetHighlighting("C#");
66
/// Gets/sets the command text displayed at the command prompt.
68
public string CommandText {
69
get { return console.CommandText.Trim(); }
70
set { console.CommandText = value; }
73
private BreakpointBookmark Breakpoint {
76
return model.Mark as BreakpointBookmark;
80
private ListViewPadItemModel Model {
81
get { return Tag as ListViewPadItemModel; }
84
private ITextEditor TextEditor {
86
return console.TextEditor;
90
private void console_TextAreaPreviewKeyDown(object sender, KeyEventArgs e)
92
if (e.Key == Key.Return || e.Key == Key.Escape) {
94
if (e.Key == Key.Escape)
95
CommandText = string.Empty;
107
private void console_LostFocus(object sender, RoutedEventArgs e)
109
if (string.IsNullOrEmpty(CommandText) || !this.CheckSyntax())
115
private void UpdateBreakpoint()
117
Breakpoint.Condition = CommandText;
118
Model.Condition = CommandText;
119
Breakpoint.ScriptLanguage = language;
120
Model.Language = language;
122
if (!string.IsNullOrEmpty(console.CommandText)) {
123
Breakpoint.Action = BreakpointAction.Condition;
124
if (Breakpoint.IsEnabled)
125
Model.Image = BreakpointBookmark.BreakpointConditionalImage.ImageSource;
128
Breakpoint.Action = BreakpointAction.Break;
129
if (Breakpoint.IsEnabled)
130
Model.Image = BreakpointBookmark.BreakpointImage.ImageSource;
134
private bool CheckSyntax()
136
string command = CommandText;
137
if (string.IsNullOrEmpty(command))
140
// FIXME workaround the NRefactory issue that needs a ; at the end
141
if (language == "C#") {
142
if(!command.EndsWith(";"))
144
// FIXME only one string should be available; highlighting expects C#, supproted language, CSharp
148
SupportedLanguage supportedLanguage = (SupportedLanguage)Enum.Parse(typeof(SupportedLanguage), language.ToString(), true);
149
using (var parser = ParserFactory.CreateParser(supportedLanguage, new StringReader(TextEditor.Document.Text))) {
150
parser.ParseExpression();
151
if (parser.Errors.Count > 0) {
152
MessageService.ShowError(parser.Errors.ErrorOutput);
160
private void consoleControl_TextAreaTextEntered(object sender, TextCompositionEventArgs e)
162
foreach (char ch in e.Text) {
164
ShowDotCompletion(console.CommandText);
169
private void ShowDotCompletion(string currentText)
171
var seg = Breakpoint;
173
var expressionFinder = ParserService.GetExpressionFinder(seg.FileName.ToString());
174
var info = ParserService.GetParseInformation(seg.FileName.ToString());
176
string text = ParserService.GetParseableFileContent(seg.FileName.ToString()).Text;
178
int currentOffset = TextEditor.Caret.Offset - console.CommandOffset - 1;
180
var expr = expressionFinder.FindExpression(currentText, currentOffset);
182
expr.Region = new DomRegion(seg.LineNumber, seg.ColumnNumber, seg.LineNumber, seg.ColumnNumber);
184
var rr = resolver.Resolve(expr, info, text);
187
TextEditor.ShowCompletionWindow(new DotCodeCompletionItemProvider().GenerateCompletionListForResolveResult(rr, expr.Context));
191
private static void OnCommandTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
192
var cell = d as ConditionCell;
193
cell.CommandText = e.NewValue.ToString();
b'\\ No newline at end of file'