diff --git a/source/Boot/Playgrounds/Kudzu-SourceView/App.xaml b/source/Boot/Playgrounds/Kudzu-SourceView/App.xaml index cfb16bdea..72afbefa6 100644 --- a/source/Boot/Playgrounds/Kudzu-SourceView/App.xaml +++ b/source/Boot/Playgrounds/Kudzu-SourceView/App.xaml @@ -1,7 +1,7 @@  + StartupUri="MainWindow.xaml"> diff --git a/source/Boot/Playgrounds/Kudzu-SourceView/Kudzu-SourceView.csproj b/source/Boot/Playgrounds/Kudzu-SourceView/Kudzu-SourceView.csproj index 4d05d8f38..4c5b992ae 100644 --- a/source/Boot/Playgrounds/Kudzu-SourceView/Kudzu-SourceView.csproj +++ b/source/Boot/Playgrounds/Kudzu-SourceView/Kudzu-SourceView.csproj @@ -58,7 +58,7 @@ MSBuild:Compile Designer - + MSBuild:Compile Designer @@ -66,8 +66,8 @@ App.xaml Code - - Window1.xaml + + MainWindow.xaml Code diff --git a/source/Boot/Playgrounds/Kudzu-SourceView/Window1.xaml b/source/Boot/Playgrounds/Kudzu-SourceView/MainWindow.xaml similarity index 63% rename from source/Boot/Playgrounds/Kudzu-SourceView/Window1.xaml rename to source/Boot/Playgrounds/Kudzu-SourceView/MainWindow.xaml index 7c02a2ac3..0696e11e2 100644 --- a/source/Boot/Playgrounds/Kudzu-SourceView/Window1.xaml +++ b/source/Boot/Playgrounds/Kudzu-SourceView/MainWindow.xaml @@ -3,6 +3,6 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> - + diff --git a/source/Boot/Playgrounds/Kudzu-SourceView/Window1.xaml.cs b/source/Boot/Playgrounds/Kudzu-SourceView/MainWindow.xaml.cs similarity index 55% rename from source/Boot/Playgrounds/Kudzu-SourceView/Window1.xaml.cs rename to source/Boot/Playgrounds/Kudzu-SourceView/MainWindow.xaml.cs index 41739d794..a2ca745d9 100644 --- a/source/Boot/Playgrounds/Kudzu-SourceView/Window1.xaml.cs +++ b/source/Boot/Playgrounds/Kudzu-SourceView/MainWindow.xaml.cs @@ -13,12 +13,18 @@ using System.Windows.Navigation; using System.Windows.Shapes; namespace Kudzu_SourceView { - /// - /// Interaction logic for Window1.xaml - /// public partial class Window1 : Window { public Window1() { InitializeComponent(); + button1.Click += new RoutedEventHandler(button1_Click); } + + void button1_Click(object sender, RoutedEventArgs e) { + var xView = new Cosmos.Build.Windows.ViewSourceWindow(); + xView.LoadSourceFile(@"C:\source\Cosmos\source\Cosmos\Cosmos.Kernel\Keyboard.cs"); + xView.SelectText(1, 4, 3, 8); + xView.Show(); + } + } } diff --git a/source/Cosmos.Build.Windows/DebugWindow.xaml.cs b/source/Cosmos.Build.Windows/DebugWindow.xaml.cs index fc78434ec..17ac73628 100644 --- a/source/Cosmos.Build.Windows/DebugWindow.xaml.cs +++ b/source/Cosmos.Build.Windows/DebugWindow.xaml.cs @@ -82,38 +82,6 @@ namespace Cosmos.Build.Windows { } - private static void GetLineInfo(string aData, int aLineStart, int aColumnStart, int aLineEnd, int aColumnEnd, out int oCharStart, out int oCharCount) { - int xCurrentPos = 0; - int xCurrentLine = 1; - oCharCount = 0; - oCharStart = 0; - while (xCurrentPos < aData.Length) { - int xTempPos = aData.IndexOfAny(new char[] { '\r', '\n' }, xCurrentPos); - if (xTempPos == -1) { - if (oCharStart > 0) { - oCharCount = xCurrentPos - oCharStart; - } - return; - } - xCurrentLine += 1; - xCurrentPos = xTempPos; - if (aData[xCurrentPos] == '\r' && aData.Length > (xCurrentPos + 1) && aData[xCurrentPos + 1] == '\n') { - xCurrentPos += 2; - } else { - xCurrentPos += 1; - } - if (xCurrentLine == aLineStart) { - oCharStart = xCurrentPos + aColumnStart; - } - if (xCurrentLine == aLineEnd) { - oCharCount = (xCurrentPos + aColumnEnd) - oCharStart; - } - if (oCharCount > 0 && oCharStart > 0) { - return; - } - } - } - private void lboxLog_MouseDoubleClick(object sender, MouseButtonEventArgs e) { var xItem = lboxLog.SelectedItem; string xItemStr = xItem as String; @@ -122,27 +90,12 @@ namespace Cosmos.Build.Windows { if (mDebugMode == DebugModeEnum.Source) { var xSourceInfo = mSourceMappings.GetMapping(UInt32.Parse(xItemStr.Substring(2), System.Globalization.NumberStyles.HexNumber)); var xViewSrc = new ViewSourceWindow(); - //int xCharStart; - //int xCharCount; - //GetLineInfo(xViewSrc.tboxSource.Text, xSourceInfo.Line, xSourceInfo.Column, xSourceInfo.LineEnd, xSourceInfo.ColumnEnd, out xCharStart, out xCharCount); - //if( - //int xCharStart = xViewSrc.tboxSource.GetCharacterIndexFromLineIndex(xSourceInfo.Line); - //int xCharEnd = xViewSrc.tboxSource.GetCharacterIndexFromLineIndex(xSourceInfo.LineEnd); - //xCharStart += xSourceInfo.Column; - //xCharEnd += xSourceInfo.ColumnEnd; - int xCharStart; - int xCharLength; xViewSrc.LoadSourceFile(xSourceInfo.SourceFile); - GetLineInfo(xViewSrc.tboxSource.Text, xSourceInfo.Line, xSourceInfo.Column, xSourceInfo.LineEnd, xSourceInfo.ColumnEnd, out xCharStart, out xCharLength); - //xViewSrc.tboxSource.ScrollToLine(xSourceInfo.Line); - //xViewSrc.tboxSource.Select(xCharStart, xCharEnd - xCharStart); - xViewSrc.CharStart = xCharStart - 1; - xViewSrc.CharLength = xCharLength; + xViewSrc.SelectText(xSourceInfo.Line, xSourceInfo.Column, xSourceInfo.LineEnd, xSourceInfo.ColumnEnd); xViewSrc.ShowDialog(); } else { throw new Exception("Debug mode not supported!"); } - //xViewSrc.tboxSource.s } } else { var xViewSrc = new ViewSourceWindow(); diff --git a/source/Cosmos.Build.Windows/ViewSourceWindow.xaml b/source/Cosmos.Build.Windows/ViewSourceWindow.xaml index 5bb7d2f07..e64ec049f 100644 --- a/source/Cosmos.Build.Windows/ViewSourceWindow.xaml +++ b/source/Cosmos.Build.Windows/ViewSourceWindow.xaml @@ -1,13 +1,8 @@  - - - - + Title="View Source" Height="500" Width="500"> + + + diff --git a/source/Cosmos.Build.Windows/ViewSourceWindow.xaml.cs b/source/Cosmos.Build.Windows/ViewSourceWindow.xaml.cs index 8140f4de0..b0224816d 100644 --- a/source/Cosmos.Build.Windows/ViewSourceWindow.xaml.cs +++ b/source/Cosmos.Build.Windows/ViewSourceWindow.xaml.cs @@ -13,32 +13,69 @@ using System.Windows.Shapes; namespace Cosmos.Build.Windows { public partial class ViewSourceWindow: Window { + protected List mLines = new List(); + public ViewSourceWindow() { InitializeComponent(); } - public int CharStart; - public int CharLength; - public void LoadSourceFile(string aPathname) { - // Old - tboxSource.Text = System.IO.File.ReadAllText(aPathname); - // New var xSourceCode = System.IO.File.ReadAllLines(aPathname); var xPara = new Paragraph(); + fdsvSource.Document = new FlowDocument(); fdsvSource.Document.Blocks.Add(xPara); foreach (var xLine in xSourceCode) { - xPara.Inlines.Add(xLine); + var xRun = new Run(xLine); + mLines.Add(xRun); + xPara.Inlines.Add(xRun); xPara.Inlines.Add(new LineBreak()); } } - private void Window_Loaded(object sender, RoutedEventArgs e) { - // Old - tboxSource.Focus(); - tboxSource.Select(CharStart, CharLength); - // New - } + protected void Select(int aLine, int aColBegin, int aLength) { + if (aLength != 0) { + var xPara = (Paragraph)fdsvSource.Document.Blocks.FirstBlock; + var xSelectedLine = mLines[aLine]; + string xText = xSelectedLine.Text; + if (aLength == -1) { + aLength = xText.Length - aColBegin; + } + string xSubText; + + if (aColBegin > 0) { + var xRunLeft = new Run(xText.Substring(0, aColBegin - 1)); + xPara.Inlines.InsertBefore(xSelectedLine, xRunLeft); + } + + var xRunSelected = new Run(xText.Substring(aColBegin, aLength)); + xRunSelected.Background = Brushes.Red; + xPara.Inlines.InsertBefore(xSelectedLine, xRunSelected); + + if (aColBegin + aLength < xText.Length) { + var xRunRight = new Run(xText.Substring(aColBegin + aLength)); + xPara.Inlines.InsertBefore(xSelectedLine, xRunRight); + } + + xPara.Inlines.Remove(xSelectedLine); + } + } + + public void SelectText(int aLineBegin, int aColBegin, int aLineEnd, int aColEnd) { + aLineBegin--; + aColBegin--; + aLineEnd--; + aColEnd--; + //Currently can only be called once - need to fix it to reset so it can be called multiple times + if (aLineBegin == aLineEnd) { + Select(aLineBegin, aColBegin, aColEnd - aColBegin); + } else { + Select(aLineBegin, aColBegin, -1); + for (int i = aLineBegin + 1; i <= aLineEnd - 1; i++) { + Select(i, 0, -1); + } + Select(aLineEnd, 0, aColEnd + 1); + } + } } } \ No newline at end of file