using FastReport.Code; using FastReport.Data; using FastReport.Design.ToolWindows; using FastReport.Editor; using FastReport.Editor.Common; using FastReport.Editor.Syntax; using FastReport.Forms; using FastReport.Utils; using System; using System.Drawing; using System.Reflection; using System.Windows.Forms; namespace FastReport.Design.PageDesigners.Code { internal class CodePageDesigner : PageDesignerBase { #region Fields private SyntaxEdit edit; private TextSource source; private bool editInitialized; private string script; private bool canModify; Font defaultFont; #endregion #region Properties public SyntaxEdit Edit { get { if (!editInitialized) CreateEdit(); return edit; } } public TextSource Source { get { if (!editInitialized) CreateEdit(); return source; } } public string Script { get { return editInitialized ? Edit.Source.Text : script; } set { script = value; if (editInitialized) SetScriptText(); } } #endregion #region Private Methods private void CreateEdit() { editInitialized = true; source = new TextSource(); edit = new SyntaxEdit(); defaultFont = edit.Font; edit.Dock = DockStyle.Fill; edit.BorderStyle = EditBorderStyle.None; edit.Source = source; edit.AllowDrop = true; edit.DragOver += new DragEventHandler(Edit_DragOver); edit.DragDrop += new DragEventHandler(Edit_DragDrop); Controls.Add(edit); // do this after controls.add! edit.IndentOptions = IndentOptions.AutoIndent | IndentOptions.SmartIndent; edit.NavigateOptions = NavigateOptions.BeyondEol; edit.Braces.BracesOptions = BracesOptions.Highlight | BracesOptions.HighlightBounds; edit.Braces.BackColor = Color.LightGray; edit.Braces.Style = FontStyle.Regular; edit.Scroll.ScrollBars = RichTextBoxScrollBars.Both; edit.Scroll.Options = ScrollingOptions.AllowSplitHorz | ScrollingOptions.AllowSplitVert | ScrollingOptions.SmoothScroll; edit.Outlining.AllowOutlining = true; edit.DisplayLines.UseSpaces = true; edit.SplitHorz += new EventHandler(Edit_SplitHorz); edit.SplitVert += new EventHandler(Edit_SplitVert); edit.TextChanged += new EventHandler(Edit_TextChanged); edit.ImeMode = ImeMode.On; UpdateOptions(); UpdateEditColors(); UpdateFont(); LocalizeEditMenu(); SetScriptText(); } private void SetScriptText() { canModify = false; Edit.Source.Text = script; Edit.Modified = false; canModify = true; } private void UpdateEditColors() { edit.Gutter.BrushColor = UIStyleUtils.GetControlColor(Designer.UIStyle); edit.Gutter.PenColor = edit.Gutter.BrushColor; } private void Edit_SplitHorz(object sender, EventArgs e) { Edit.HorzSplitEdit.BorderStyle = Edit.BorderStyle; } private void Edit_SplitVert(object sender, EventArgs e) { Edit.VertSplitEdit.BorderStyle = Edit.BorderStyle; } private void Edit_DragOver(object sender, DragEventArgs e) { DictionaryWindow.DraggedItem item = DictionaryWindow.DragUtils.GetOne(e); if (item != null) { Point pt = Edit.PointToClient(new Point(e.X, e.Y)); HitTestInfo hit = new HitTestInfo(); Edit.GetHitTest(pt, ref hit); if (hit.Pos != -1 && hit.Line != -1) Edit.Position = new Point(hit.Pos, hit.Line); e.Effect = e.AllowedEffect; } } private void Edit_DragDrop(object sender, DragEventArgs e) { DictionaryWindow.DraggedItem item = DictionaryWindow.DragUtils.GetOne(e); if (item == null) return; CodeHelperBase codeHelper = Designer.ActiveReport.Report.CodeHelper; string text = ""; if (item.obj is Column) text = codeHelper.ReplaceColumnName(item.text, (item.obj as Column).DataType); else if (item.obj is SystemVariable) text = codeHelper.ReplaceVariableName(item.obj as Parameter); else if (item.obj is Parameter) text = codeHelper.ReplaceParameterName(item.obj as Parameter); else if (item.obj is Total) text = codeHelper.ReplaceTotalName(item.text); else if (item.obj is MethodInfo) text = item.text; else text = "Report.Calc(\"" + item.text + "\")"; Edit.Selection.InsertString(text); Edit.Focus(); } private void Edit_TextChanged(object sender, EventArgs e) { if (canModify) Designer.SetModified(this, "no-undo"); } public void CommitChanges() { if (Edit.Modified) { Edit.Modified = false; Designer.SetModified(this, "Script"); } } private void LocalizeEditMenu() { MyRes res = new MyRes("Designer,Menu,Edit"); StringConsts.MenuUndoCaption = res.Get("Undo"); StringConsts.MenuRedoCaption = res.Get("Redo"); StringConsts.MenuCutCaption = res.Get("Cut"); StringConsts.MenuCopyCaption = res.Get("Copy"); StringConsts.MenuPasteCaption = res.Get("Paste"); StringConsts.MenuDeleteCaption = res.Get("Delete"); StringConsts.MenuSelectAllCaption = res.Get("SelectAll"); } #endregion #region Public Methods public void UpdateLanguage() { SyntaxParser parser = Designer.ActiveReport.Report.CodeHelper.Parser; Edit.Lexer = parser; Source.Lexer = parser; Source.FormatText(); Designer.ActiveReport.Report.CodeHelper.RegisterAssemblies(); Edit.Refresh(); } public void UpdateOptions() { SyntaxConsts.DefaultHintDelay = CodePageSettings.EnableCodeCompletion ? 500 : int.MaxValue; SyntaxConsts.DefaultCompletionDelay = CodePageSettings.EnableCodeCompletion ? 100 : int.MaxValue; Edit.NavigateOptions = CodePageSettings.EnableVirtualSpace ? NavigateOptions.BeyondEol : NavigateOptions.None; Edit.DisplayLines.UseSpaces = CodePageSettings.UseSpaces; Edit.Outlining.AllowOutlining = CodePageSettings.AllowOutlining; Edit.DisplayLines.TabStops = new int[] { CodePageSettings.TabSize }; edit.Gutter.Options = CodePageSettings.LineNumbers ? GutterOptions.PaintLineNumbers : GutterOptions.None; } public void UpdateFont() { Edit.Font = this.LogicalToDevice(Storage.GetFont("CodePageDesigner,CodePage", defaultFont)); } public override bool CanCopy() => true; public override void Copy() { Edit.Selection.Copy(); } public override void Cut() { Edit.Selection.Cut(); } public override bool CanPaste() => true; public override void Paste() { Edit.Selection.Paste(); } public override bool CanUndo() { return Source.CanUndo(); } public override void Undo() { Source.Undo(); } public override bool CanRedo() { return Source.CanRedo(); } public override void Redo() { Source.Redo(); } public override void SelectAll() { Edit.Selection.SelectAll(); } public override void ResetModified() { if (editInitialized) Edit.Modified = false; } public override void FillObjects(bool resetSelection) { // do nothing } public override void PageActivated() { base.PageActivated(); UpdateOptions(); UpdateLanguage(); if (!Edit.Focused) Edit.Focus(); } public override void PageDeactivated() { base.PageDeactivated(); if (editInitialized) CommitChanges(); } #endregion #region IDesignerPlugin public override void SaveState() { CodePageSettings.SaveState(); } public override void RestoreState() { } public override DesignerOptionsPage GetOptionsPage() { return new CodePageOptions(this); } public override void UpdateUIStyle() { base.UpdateUIStyle(); if (editInitialized) UpdateEditColors(); } public override void Localize() { base.Localize(); if (editInitialized) LocalizeEditMenu(); } public override void UpdateDpiDependencies() { base.UpdateDpiDependencies(); if (editInitialized) UpdateFont(); } #endregion public CodePageDesigner(Designer designer) : base(designer) { Name = "Code"; RightToLeft = Config.RightToLeft ? RightToLeft.Yes : RightToLeft.No; } } }