using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Tango.FSE.Procedures.Contracts; using Tango.FSE.Procedures.ViewModels; using Tango.Logging; using Tango.Scripting.Basic; using Tango.Scripting.Core; using Tango.Scripting.Editors; using Tango.SharedUI.Helpers; namespace Tango.FSE.Procedures.Views { /// /// Interaction logic for ProcedureDesignerView.xaml /// public partial class ProcedureDesignerView : UserControl, IProcedureDesignerView { private ProcedureDesignerViewVM _vm; public event EventHandler FileDropped; public ProcedureDesignerView() { InitializeComponent(); this.Register(); Loaded += (_, __) => _vm = DataContext as ProcedureDesignerViewVM; } private void OnScriptItemDoubleClick(object sender, MouseButtonEventArgs e) { _vm.OpenScript((sender as FrameworkElement).DataContext as Script); } private ScriptEditor GetCurrentEditor() { var editor = tabControl.FindVisualChildren().FirstOrDefault(x => x.IsVisible); return editor; } private List GetAllEditors() { return tabControl.FindVisualChildren().ToList(); } public void FormatCode() { GetCurrentEditor()?.FormatCode(); } public void HighlightCode(int position, int length, int line) { GetCurrentEditor()?.Highlight(position, length, line); } public void InsertCode(string code) { GetCurrentEditor()?.InsertCode(code); } public void InvalidateHighlighting() { Dispatcher.BeginInvoke(new Action(() => { foreach (var editor in tabControl.FindVisualChildren()) { editor.InvalidateHighlighting(true); } })); } public void Find(string text) { GetCurrentEditor()?.Find(text); } public void ReplaceNext(string text, string replace) { GetCurrentEditor()?.ReplaceNext(text, replace); ColorizeKeyword(text); } public int ReplaceAll(string text, string replace) { var editor = GetCurrentEditor(); if (editor != null) { int count = editor.ReplaceAll(text, replace); ColorizeKeyword(text); return count; } else { return 0; } } public void FocusCurrentEditor() { var editor = GetCurrentEditor(); if (editor != null) { editor.Focus(); Keyboard.Focus(editor); } } public void ColorizeKeyword(string text) { GetCurrentEditor()?.ColorizeByKeyword(text); } public void ResetColrization() { GetAllEditors().ForEach(x => x.ResetColorizationByKeyword()); } private void OnDialogItemDoubleClick(object sender, MouseButtonEventArgs e) { _vm.EditProcedureDialog((sender as FrameworkElement).DataContext as ProcedureDialog); } public void HighlightError(int position, int length) { GetCurrentEditor()?.HighlighError(position, length); } public void ClearErrors() { GetAllEditors().ForEach(x => x.ClearErrors()); } public void ScrollToLine(int lineNumber) { GetCurrentEditor().ScrollToLine(lineNumber); } public void HighlightRuntimeError(int lineNumber) { ScrollToLine(lineNumber); var editor = GetCurrentEditor(); editor.HighlightErrorLine(lineNumber); UIHelper.DoEvents(); Point? p = editor.GetLineVisualPosition(lineNumber); if (p != null) { Point point = p.Value; point = new Point(point.X, point.Y - editor.VerticalOffset); double height = editor.ActualHeight; if (point.Y > runTimeErrorDock.ActualHeight) { DockPanel.SetDock(runTimeErrorLineGrid, Dock.Bottom); runTimeErrorLineTransform.Angle = 0; Canvas.SetTop(runTimeErrorDock, point.Y - runTimeErrorDock.ActualHeight); } else { DockPanel.SetDock(runTimeErrorLineGrid, Dock.Top); runTimeErrorLineTransform.Angle = 90; Canvas.SetTop(runTimeErrorDock, point.Y); } Canvas.SetLeft(runTimeErrorDock, Math.Min(point.X, editor.ActualWidth - 110 - runTimeErrorDock.ActualWidth)); runTimeErrorCanvas.Visibility = Visibility.Visible; } } public void CloseRunTimeError() { runTimeErrorCanvas.Visibility = Visibility.Hidden; GetCurrentEditor().ResetColorizationByKeyword(); } public void HighlightDebugRequest(Object toDebug, int lineNumber) { ScrollToLine(lineNumber); var editor = GetCurrentEditor(); editor.HighlightDebugLine(lineNumber); UIHelper.DoEvents(); Point? p = editor.GetLineVisualPosition(lineNumber); if (p != null) { Point point = p.Value; } } public List GetBreakPoints() { List breakPoints = new List(); foreach (var editor in GetAllEditors()) { breakPoints.AddRange(editor.GetBreakPoints()); } return breakPoints; } public void HighlightBreakPointRequest(int lineNumber, List symbols) { UIHelper.DoEvents(); ScrollToLine(lineNumber); var editor = GetCurrentEditor(); editor.HighlightBreakPoint(lineNumber, symbols); UIHelper.DoEvents(); } public void ResetBreakPointRequest() { GetCurrentEditor().ResetBreakPointLine(); runTimeBreakPointCanvas.Visibility = Visibility.Hidden; } private void ScriptEditor_BreakPointSymbolPressed(object sender, BreakPointSymbolPressedEventArgs e) { try { var editor = GetCurrentEditor(); var point = new Point(e.Position.X, e.Position.Y - editor.VerticalOffset); Canvas.SetTop(runTimeBreakPointDock, point.Y); Canvas.SetLeft(runTimeBreakPointDock, Math.Min(point.X, editor.ActualWidth - 110 - runTimeBreakPointDock.ActualWidth)); try { runTimeBreakPointTreeView.SetExpansion(false); } catch { } runTimeBreakPointTreeView.DataContext = DebugNode.CreateNode(e.BreakPointSymbol.Name, e.BreakPointSymbol.SymbolObject); runTimeBreakPointCanvas.Visibility = Visibility.Visible; } catch (Exception ex) { LogManager.Default.Log(ex, "Error initializing break point debug window."); } } private void RunTimeBreakPointCanvas_MouseUp(object sender, MouseButtonEventArgs e) { runTimeBreakPointCanvas.Visibility = Visibility.Hidden; } public string GetCaretWord() { return GetCurrentEditor()?.GetCaretWord(); } private void OnFileDrop(object sender, DragEventArgs e) { try { string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); if (files != null && files.Length == 1) { var file = files.First(); FileDropped?.Invoke(this, file); } } catch { } } } }