Imports EgtUILib Imports EgtWPFLib5 Imports ICSharpCode.AvalonEdit.Document Imports ICSharpCode.AvalonEdit.Rendering Imports System.IO Imports System.Text Imports System.Text.RegularExpressions Public Class ScriptWindowVM Inherits VMBase #Region "FIELD & PROPERTIES" Private m_sNameFile As String = String.Empty Public Property sNameFile As String Get Return m_sNameFile End Get Set(value As String) m_sNameFile = value NotifyPropertyChanged(NameOf(sNameFile)) End Set End Property Private m_sScriptText As String = String.Empty Public Property sScriptText As String Get Return m_sScriptText End Get Set(value As String) m_sScriptText = value NotifyPropertyChanged(NameOf(sScriptText)) End Set End Property Private m_nFontSizeList As New List(Of Integer) Public Property FontSizeList As List(Of Integer) Get Return m_nFontSizeList End Get Set(value As List(Of Integer)) m_nFontSizeList = value NotifyPropertyChanged(NameOf(FontSizeList)) End Set End Property Private m_nSelFontSize As Integer Public Property SelFontSize As Integer Get Return m_nSelFontSize End Get Set(value As Integer) m_nSelFontSize = value If Not IsNothing(m_nSelFontSize) Then ChangeFontSize(m_nSelFontSize) NotifyPropertyChanged(NameOf(SelFontSize)) End Set End Property Friend Sub SetSelFontSize(value As Integer) m_nSelFontSize = value NotifyPropertyChanged(NameOf(SelFontSize)) End Sub Private m_sFontFamilyList As New List(Of FontFamily) Public Property FontFamilyList As List(Of FontFamily) Get Return m_sFontFamilyList End Get Set(value As List(Of FontFamily)) m_sFontFamilyList = value NotifyPropertyChanged(NameOf(FontFamilyList)) End Set End Property Private m_sSelFontFamily As FontFamily Public Property SelFontFamily As FontFamily Get Return m_sSelFontFamily End Get Set(value As FontFamily) m_sSelFontFamily = value If Not IsNothing(m_sSelFontFamily) Then ChangeFontFamily(m_sSelFontFamily) NotifyPropertyChanged(NameOf(SelFontFamily)) End Set End Property Friend Sub SetSelFontFamily(value As FontFamily) m_sSelFontFamily = value NotifyPropertyChanged(NameOf(SelFontFamily)) End Sub Private m_bBoldIsChecked As Boolean = False Public Property BoldIsChecked As Boolean Get Return m_bBoldIsChecked End Get Set(value As Boolean) m_bBoldIsChecked = value NotifyPropertyChanged(NameOf(BoldIsChecked)) End Set End Property Private m_bItalicIsChecked As Boolean = False Public Property ItalicIsChecked As Boolean Get Return m_bItalicIsChecked End Get Set(value As Boolean) m_bItalicIsChecked = value NotifyPropertyChanged(NameOf(ItalicIsChecked)) End Set End Property Private m_bUnderlineChecked As Boolean = False Public Property UnderlineChecked As Boolean Get Return m_bUnderlineChecked End Get Set(value As Boolean) m_bUnderlineChecked = value NotifyPropertyChanged(NameOf(UnderlineChecked)) End Set End Property #Region "Messages" Public ReadOnly Property Title As String Get Return EgtMsg(110076) ' Script File End Get End Property Public ReadOnly Property Conferma_Msg As String Get Return EgtMsg(110075) ' Esegui End Get End Property Public ReadOnly Property Salva_Msg As String Get Return EgtMsg(110013) ' Salva End Get End Property Public ReadOnly Property Annulla_Msg As String Get Return EgtMsg(110004) ' Annulla End Get End Property #End Region ' Messages ' Definizione Comandi Private m_ConfermaCmd As ICommand Private m_cmdSaveAs As ICommand Private m_cmdAnnulla As ICommand Private m_cmdTextColor As ICommand Private m_cmdBold As ICommand Private m_cmdItalic As ICommand Private m_cmdUnderline As ICommand Private m_cmdAllign As ICommand #End Region ' Fields & Properties #Region "CONSTRUCTOR" Sub New() Map.SetRefScriptWindowVM(Me) If m_nFontSizeList.Count <= 0 Then CreateFontSizeList() If m_sFontFamilyList.Count <= 0 Then CreateFontFamilyList() SetToolbar() End Sub #End Region ' Constructor #Region "METHODS" Public Function SaveProject() As Boolean ' Determina il nome del file di default Dim sFile As String = If(String.IsNullOrWhiteSpace(m_sNameFile), "New.lua", $"{m_sNameFile}.lua") sFile = IO.Path.ChangeExtension(sFile, "lua") ' Assegnazione nome file con dialogo Dim SaveFileDialog As New EgtManageFileDialogV(Application.Current.MainWindow, New EgtManageFileDialogVM()) With { .Title = EgtMsg(110013), ' Salva .Filter = "lua files (*.lua)|*.lua", .FileName = sFile, .FilterIndex = 1, .InitialDirectory = Map.refMainWindowVM.MainWindowM.sTempDir, .ValidateNames = False, .OverwritePrompt = True, .Mode = 1 } ' Mostra la finestra di dialogo e ottieni il percorso del file selezionato Dim sFileName As String = String.Empty If SaveFileDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then Dim fileExtension = IO.Path.GetExtension(SaveFileDialog.SafeFileName) sFileName = IO.Path.Combine(SaveFileDialog.InitialDirectory, SaveFileDialog.SafeFileName & If(String.IsNullOrEmpty(fileExtension), SaveFileDialog.SelFilter.sExstension.Trim("*"c), String.Empty)) End If ' Verifica se il nome del file è stato selezionato If String.IsNullOrWhiteSpace(sFileName) Then Return False ' Salva il progetto e scrive lo script Lua Dim bOk = Map.refSceneHostVM.SaveProj(sFileName) WriteTextScriptLua(sFileName) ' Imposta lo stato della scena Map.refSceneHostVM.MainScene.SetStatusNull() Return bOk End Function Private Sub WriteTextScriptLua(sFileName As String) If String.IsNullOrWhiteSpace(sFileName) Then Return ' Validazione input File.WriteAllText(sFileName, m_sScriptText, Encoding.UTF8) ' Salva il file con codifica UTF-8 End Sub Private Sub SaveScript(sPathFileScript As String, sScriptText As String) If String.IsNullOrWhiteSpace(sPathFileScript) OrElse String.IsNullOrWhiteSpace(sScriptText) Then Return ' Validazione input Map.refSceneHostVM.SaveProj(sPathFileScript) ' Salva il progetto nel percorso specificato File.WriteAllText(sPathFileScript, sScriptText, Encoding.UTF8) ' Salva il contenuto con codifica UTF-8 End Sub Public Sub SetColorScriptText() Map.refScriptWindowV.LuaEditor.TextArea.TextView.LineTransformers.Add(New LuaRegexColorizer()) End Sub Private Sub CreateFontSizeList() ' Aggiunge solo font-size pari alla lista, con un semplice iteratore m_nFontSizeList.AddRange(Enumerable.Range(8, 13).Where(Function(size) size Mod 2 = 0)) End Sub Private Sub ChangeFontSize(nSelFontSize As Integer) Dim selectionStart = Map.refScriptWindowV.LuaEditor.SelectionStart Dim selectionLength = Map.refScriptWindowV.LuaEditor.SelectionLength ' Controlla se c'è una selezione valida If selectionLength > 0 Then ' Aggiungi il colorizer per cambiare la dimensione del font Map.refScriptWindowV.LuaEditor.TextArea.TextView.LineTransformers.Add(New FontSizeColorizer(selectionStart, selectionLength, nSelFontSize)) ' Ridisegna il controllo per applicare le modifiche Map.refScriptWindowV.LuaEditor.TextArea.TextView.Redraw() End If End Sub Private Sub CreateFontFamilyList() ' Aggiunge direttamente tutte le famiglie di font alla lista m_sFontFamilyList.AddRange(Fonts.SystemFontFamilies) End Sub Private Sub ChangeFontFamily(sSelFontFamily As FontFamily) Dim selectionStart As Integer = Map.refScriptWindowV.LuaEditor.SelectionStart Dim selectionLength As Integer = Map.refScriptWindowV.LuaEditor.SelectionLength Dim selectedText As String = Map.refScriptWindowV.LuaEditor.SelectedText ' Controlla che ci sia una selezione valida If selectionLength > 0 Then Dim fontFamily As New FontFamily(sSelFontFamily.Source) ' Aggiungi il colorizer per cambiare la font della selezione Map.refScriptWindowV.LuaEditor.TextArea.TextView.LineTransformers.Add(New FontFamilyColorizer(selectionStart, selectionLength, fontFamily)) ' Ridisegna il controllo per applicare le modifiche Map.refScriptWindowV.LuaEditor.TextArea.TextView.Redraw() End If End Sub Friend Sub SetToolbar() ' Recupera font e dimensione SetSelFontFamily(Map.refScriptWindowV.LuaEditor.FontFamily) SetSelFontSize(Map.refScriptWindowV.LuaEditor.FontSize) End Sub Private Sub ApplyBoldToSelection(editor As ICSharpCode.AvalonEdit.TextEditor) Dim selectionStart As Integer = editor.SelectionStart Dim selectionLength As Integer = editor.SelectionLength ' Controlla se c'è una selezione valida If selectionLength > 0 Then ' Aggiungi il colorizer per applicare il grassetto editor.TextArea.TextView.LineTransformers.Add(New BoldColorizer(selectionStart, selectionLength)) ' Ridisegna il controllo per applicare le modifiche editor.TextArea.TextView.Redraw() End If End Sub Private Sub ApplyItalicToSelection(editor As ICSharpCode.AvalonEdit.TextEditor) Dim selectionStart As Integer = editor.SelectionStart Dim selectionLength As Integer = editor.SelectionLength ' Verifica che ci sia una selezione valida If selectionLength > 0 Then ' Aggiungi il colorizer per mettere in corsivo editor.TextArea.TextView.LineTransformers.Add(New ItalicColorizer(selectionStart, selectionLength)) ' Ridisegna il controllo per applicare lo stile editor.TextArea.TextView.Redraw() End If End Sub Private Sub ApplyUnderlineToSelection(editor As ICSharpCode.AvalonEdit.TextEditor) Dim selectionStart As Integer = editor.SelectionStart Dim selectionLength As Integer = editor.SelectionLength ' Verifica che ci sia una selezione valida If selectionLength > 0 Then ' Aggiungi il colorizer per sottolineare il testo editor.TextArea.TextView.LineTransformers.Add(New UnderlineColorizer(selectionStart, selectionLength)) ' Ridisegna il controllo per applicare la sottolineatura editor.TextArea.TextView.Redraw() End If End Sub #End Region ' Methods #Region "COMMANDS" #Region "ConfermCmd" Public ReadOnly Property ConfermaCmd As ICommand Get If m_ConfermaCmd Is Nothing Then m_ConfermaCmd = New Command(AddressOf Conferma) End If Return m_ConfermaCmd End Get End Property Public Sub Conferma() ' Genera il percorso del file script Dim scriptFilePath As String = IO.Path.Combine(Map.refMainWindowVM.MainWindowM.sTempDir, $"{m_sNameFile}.lua") ' Salva il file script SaveScript(scriptFilePath, m_sScriptText) ' Esegue il file script EgtLuaExecFile(scriptFilePath) ' Imposta lo stato della gestione mouse diretto della scena a "nessuno" Map.refSceneHostVM.MainScene.SetStatusNull() End Sub #End Region ' ConfermaCmd #Region "SaveAsCommand" Public ReadOnly Property SalvaCmd As ICommand Get If m_cmdSaveAs Is Nothing Then m_cmdSaveAs = New Command(AddressOf SaveAs) End If Return m_cmdSaveAs End Get End Property Public Sub SaveAs() SaveProject() End Sub #End Region ' SaveAsCommand #Region "AnnullaCmd" Public ReadOnly Property AnnullaCmd As ICommand Get If m_cmdAnnulla Is Nothing Then m_cmdAnnulla = New Command(AddressOf Annulla) End If Return m_cmdAnnulla End Get End Property Public Sub Annulla() Map.refScriptWindowV.Close() Map.refTopPanelVM.SetIsEnableScriptBtn(True) End Sub #End Region ' AnnullaCmd #Region "TextColorCmd" Public ReadOnly Property TextColorCmd As ICommand Get If m_cmdTextColor Is Nothing Then m_cmdTextColor = New Command(AddressOf TextColor) End If Return m_cmdTextColor End Get End Property Public Sub TextColor() ' Recupero colori custom Dim defaultColor As New Color3d(10, 122, 150) Dim sCustomColors As String = String.Empty GetMainPrivateProfileString(S_COLORS, K_CUSTOMCOLORS, "", sCustomColors) ' Parsing dei colori custom in una lista di interi Dim nCustomColors = sCustomColors.Split(","c). Select(Function(color) Dim nColor As Integer Return If(Integer.TryParse(color, nColor), nColor, Nothing) End Function). Where(Function(nColor) nColor > 0).Cast(Of Integer)().ToList() ' Configurazione dialogo colori Dim colorDialog As New EgtColorPickerV(Application.Current.MainWindow, New EgtColorPickerVM()) With { .CustomColors = nCustomColors.ToArray(), .Color = defaultColor.ToColor() } ' Visualizzo il dialogo e gestisco l'output If colorDialog.ShowDialog() <> Windows.Forms.DialogResult.OK Then Return ' Conversione colore selezionato Dim selectedColor As System.Windows.Media.Color = System.Windows.Media.Color.FromRgb( CByte(colorDialog.Color.R), CByte(colorDialog.Color.G), CByte(colorDialog.Color.B) ) ' Applicazione del colore al testo selezionato Dim selectedText As String = Map.refScriptWindowV.LuaEditor.SelectedText Dim selectionStart As Integer = Map.refScriptWindowV.LuaEditor.SelectionStart Dim selectionLength As Integer = Map.refScriptWindowV.LuaEditor.SelectionLength ' Controlla se c'è una selezione valida If selectionLength > 0 Then ' Colore di evidenziazione, ad esempio giallo Dim highlightColor As Color = Colors.Yellow ' Aggiungi il colorizer per evidenziare la selezione Map.refScriptWindowV.LuaEditor.TextArea.TextView.LineTransformers.Add(New SelectionColorizer(selectionStart, selectionLength, selectedColor)) ' Ridisegna il controllo per applicare le modifiche Map.refScriptWindowV.LuaEditor.TextArea.TextView.Redraw() End If End Sub #End Region ' TextColorCmd #Region "BoldCmd" Public ReadOnly Property BoldCmd As ICommand Get If m_cmdBold Is Nothing Then m_cmdBold = New Command(AddressOf ApplyBold) End If Return m_cmdBold End Get End Property Public Sub ApplyBold() ApplyBoldToSelection(Map.refScriptWindowV.LuaEditor) End Sub #End Region ' BoldCmd #Region "ItalicCmd" Public ReadOnly Property ItalicCmd As ICommand Get If m_cmdItalic Is Nothing Then m_cmdItalic = New Command(AddressOf ApplyItalic) End If Return m_cmdItalic End Get End Property Public Sub ApplyItalic() ApplyItalicToSelection(Map.refScriptWindowV.LuaEditor) End Sub #End Region ' ItalicCmd #Region "UnderlineCmd" Public ReadOnly Property UnderlineCmd As ICommand Get If m_cmdUnderline Is Nothing Then m_cmdUnderline = New Command(AddressOf ApplyUnderline) End If Return m_cmdUnderline End Get End Property Public Sub ApplyUnderline() ApplyUnderlineToSelection(Map.refScriptWindowV.LuaEditor) End Sub #End Region ' UnderlineCmd #End Region ' Commands End Class ' Classe per gestire la colorazione tramite Regex Public Class LuaRegexColorizer Inherits DocumentColorizingTransformer #Region "FIELDS & PROPERTIES" ' Dizionario con Regex Precompilate e Colori Associati Private patterns As New Dictionary(Of Regex, System.Windows.Media.Color) From { {RegexM.KeywordRegex, ColorScriptM.KeywordColor}, {RegexM.ValueRegex, ColorScriptM.ValueColor}, {RegexM.FunctionRegex, ColorScriptM.FunctionColor}, {RegexM.InfoRegex, ColorScriptM.InfoColor}, {RegexM.EgtRegex, ColorScriptM.EgtColor}, {RegexM.BracketRegex, ColorScriptM.BracketColor}, {RegexM.TextRegex, ColorScriptM.TextColor}, {RegexM.NumberRegex, ColorScriptM.NumberColor}, {RegexM.CommentRegex, ColorScriptM.CommentColor}, {RegexM.PointRegex, ColorScriptM.FreeColor}, {RegexM.TableRegex, ColorScriptM.EgtColor}, {RegexM.EqualRegex, ColorScriptM.FreeColor} } #End Region ' Fields & Properties #Region "METHODS" Protected Overrides Sub ColorizeLine(line As DocumentLine) ' Applicare evidenziazione per ogni regex nel dizionario For Each kvp In patterns Dim regex As Regex = kvp.Key Dim color As Color = kvp.Value ' Evidenzia le corrispondenze Dim matches As MatchCollection = regex.Matches(CurrentContext.Document.GetText(line)) For Each match As Match In matches ChangeLinePart(line.Offset + match.Index, line.Offset + match.Index + match.Length, Sub(visual As VisualLineElement) visual.TextRunProperties.SetForegroundBrush(New SolidColorBrush(color)) End Sub) Next Next End Sub #End Region ' Methods End Class ' Classe per gestire la colorazione quando viene selezionata una parola Public Class SelectionColorizer Inherits DocumentColorizingTransformer #Region "FIELDS & PROPERTIES" Private ReadOnly StartOffset As Integer Private ReadOnly Length As Integer Private ReadOnly HighlightBrush As Brush #End Region ' Fields & Properties #Region "CONSTRUCTOR" Public Sub New(startOffset As Integer, length As Integer, color As Color) Me.StartOffset = startOffset Me.Length = length Me.HighlightBrush = New SolidColorBrush(color) End Sub #End Region ' Constructor #Region "METHODS" Protected Overrides Sub ColorizeLine(line As DocumentLine) Dim lineStart As Integer = line.Offset Dim lineEnd As Integer = lineStart + line.Length ' Se la selezione non riguarda questa linea, termina If StartOffset >= lineEnd OrElse (StartOffset + Length) <= lineStart Then Return ' Calcola l'inizio e la fine dell'area da colorare Dim start As Integer = Math.Max(StartOffset, lineStart) Dim [end] As Integer = Math.Min(StartOffset + Length, lineEnd) ' Applica lo stile ChangeLinePart(start, [end], Sub(visualLineElement As VisualLineElement) visualLineElement.TextRunProperties.SetForegroundBrush(HighlightBrush) End Sub) End Sub #End Region ' Methods End Class ' Classe per gestire la dimensione di una parola selezionata Public Class FontSizeColorizer Inherits DocumentColorizingTransformer #Region "FIELDS & PROPERTIES" Private ReadOnly StartOffset As Integer Private ReadOnly Length As Integer Private ReadOnly FontSize As Double #End Region ' Field & Properties #Region "CONSTRUCTOR" Public Sub New(startOffset As Integer, length As Integer, fontSize As Double) Me.StartOffset = startOffset Me.Length = length Me.FontSize = fontSize End Sub #End Region ' Constructor #Region "METHODS" Protected Overrides Sub ColorizeLine(line As DocumentLine) Dim lineStart As Integer = line.Offset Dim lineEnd As Integer = lineStart + line.Length ' Se la selezione non riguarda questa linea, termina If StartOffset >= lineEnd OrElse (StartOffset + Length) <= lineStart Then Return ' Calcola l'inizio e la fine dell'area da modificare Dim start As Integer = Math.Max(StartOffset, lineStart) Dim [end] As Integer = Math.Min(StartOffset + Length, lineEnd) ' Applica la dimensione del font ChangeLinePart(start, [end], Sub(visualLineElement As VisualLineElement) visualLineElement.TextRunProperties.SetFontRenderingEmSize(FontSize) End Sub) End Sub #End Region ' Methods End Class ' Classe per gestire la famiglia dei caratteri di una parola selezionata Public Class FontFamilyColorizer Inherits DocumentColorizingTransformer #Region "FIELDS & PROPERTIES" Private ReadOnly StartOffset As Integer Private ReadOnly Length As Integer Private ReadOnly FontFamily As FontFamily #End Region ' Fields & Properties #Region "CONSTRUCTOR" Public Sub New(startOffset As Integer, length As Integer, fontFamily As FontFamily) Me.StartOffset = startOffset Me.Length = length Me.FontFamily = fontFamily End Sub #End Region ' Constructor #Region "METHODS" Protected Overrides Sub ColorizeLine(line As DocumentLine) Dim lineStart As Integer = line.Offset Dim lineEnd As Integer = lineStart + line.Length ' Se la selezione non riguarda questa linea, esci If StartOffset >= lineEnd OrElse (StartOffset + Length) <= lineStart Then Return ' Calcola i limiti della parte di testo da modificare Dim start As Integer = Math.Max(StartOffset, lineStart) Dim [end] As Integer = Math.Min(StartOffset + Length, lineEnd) ' Applica la nuova FontFamily ChangeLinePart(start, [end], Sub(visualLineElement As VisualLineElement) Dim properties = visualLineElement.TextRunProperties.Clone() Dim typeface = properties.Typeface visualLineElement.TextRunProperties.SetTypeface(New Typeface(FontFamily, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal)) End Sub) End Sub #End Region ' Methods End Class ' Classe per gestire il grassetto del testo Public Class BoldColorizer Inherits DocumentColorizingTransformer #Region "FIELDS & PROPERTIES" Private ReadOnly StartOffset As Integer Private ReadOnly Length As Integer #End Region ' Fields & Properties #Region "CONSTRUCTOR" Public Sub New(startOffset As Integer, length As Integer) Me.StartOffset = startOffset Me.Length = length End Sub #End Region ' Constructor #Region "METHODS" Protected Overrides Sub ColorizeLine(line As DocumentLine) Dim lineStart As Integer = line.Offset Dim lineEnd As Integer = lineStart + line.Length ' Se la selezione cade fuori dalla linea attuale, esci If StartOffset >= lineEnd OrElse (StartOffset + Length) <= lineStart Then Return ' Calcola l'inizio e la fine dell'area da colorare Dim start As Integer = Math.Max(StartOffset, lineStart) Dim [end] As Integer = Math.Min(StartOffset + Length, lineEnd) ' Applica il grassetto modificando il Typeface ChangeLinePart(start, [end], Sub(visualLineElement As VisualLineElement) Dim properties = visualLineElement.TextRunProperties.Clone() Dim typeface = properties.Typeface If Map.refScriptWindowVM.BoldIsChecked Then visualLineElement.TextRunProperties.SetTypeface(New Typeface(typeface.FontFamily, FontStyles.Normal, FontWeights.Bold, typeface.Stretch)) Else visualLineElement.TextRunProperties.SetTypeface(New Typeface(typeface.FontFamily, FontStyles.Normal, FontWeights.Normal, typeface.Stretch)) End If End Sub) End Sub #End Region ' Methods End Class ' Classe per gestire il corsivo del testo Public Class ItalicColorizer Inherits DocumentColorizingTransformer #Region "FIELDS & PROPERTIES" Private ReadOnly StartOffset As Integer Private ReadOnly Length As Integer #End Region ' Fields & Properties #Region "CONSTRUCTOR" Public Sub New(startOffset As Integer, length As Integer) Me.StartOffset = startOffset Me.Length = length End Sub #End Region ' Constructor #Region "METHODS" Protected Overrides Sub ColorizeLine(line As DocumentLine) Dim lineStart As Integer = line.Offset Dim lineEnd As Integer = lineStart + line.Length ' Controlla se la selezione cade nella linea attuale If StartOffset >= lineEnd OrElse (StartOffset + Length) <= lineStart Then Return ' Calcola l'inizio e la fine dell'area da stilizzare Dim start As Integer = Math.Max(StartOffset, lineStart) Dim [end] As Integer = Math.Min(StartOffset + Length, lineEnd) ' Applica il corsivo ChangeLinePart(start, [end], Sub(visualLineElement As VisualLineElement) Dim properties = visualLineElement.TextRunProperties.Clone() Dim typeface = properties.Typeface If Map.refScriptWindowVM.ItalicIsChecked Then visualLineElement.TextRunProperties.SetTypeface(New Typeface(typeface.FontFamily, FontStyles.Italic, typeface.Weight, typeface.Stretch)) Else visualLineElement.TextRunProperties.SetTypeface(New Typeface(typeface.FontFamily, FontStyles.Normal, typeface.Weight, typeface.Stretch)) End If End Sub) End Sub #End Region ' Methods End Class ' Classe per gestire il sottolineato del testo Public Class UnderlineColorizer Inherits DocumentColorizingTransformer #Region "FIELDS & PROPERTIES" Private ReadOnly StartOffset As Integer Private ReadOnly Length As Integer #End Region ' Fields & Properties #Region "CONSTRUCTOR" Public Sub New(startOffset As Integer, length As Integer) Me.StartOffset = startOffset Me.Length = length End Sub #End Region ' Constructor #Region "METHODS" Protected Overrides Sub ColorizeLine(line As DocumentLine) Dim lineStart As Integer = line.Offset Dim lineEnd As Integer = lineStart + line.Length ' Controlla se la selezione cade nella linea attuale If StartOffset >= lineEnd OrElse (StartOffset + Length) <= lineStart Then Return ' Calcola i limiti della parte di testo da sottolineare Dim start As Integer = Math.Max(StartOffset, lineStart) Dim [end] As Integer = Math.Min(StartOffset + Length, lineEnd) ' Applica la sottolineatura ChangeLinePart(start, [end], Sub(visualLineElement As VisualLineElement) ' Aggiungi le decorazioni di sottolineatura If Map.refScriptWindowVM.UnderlineChecked Then visualLineElement.TextRunProperties.SetTextDecorations(TextDecorations.Underline) Else visualLineElement.TextRunProperties.SetTextDecorations(Nothing) End If End Sub) End Sub #End Region ' Methods End Class