diff --git a/CsvView/CsvView.csproj b/CsvView/CsvView.csproj index 1496670..8de198e 100644 --- a/CsvView/CsvView.csproj +++ b/CsvView/CsvView.csproj @@ -17,4 +17,9 @@ + + + + + diff --git a/CsvView/MainWindow.axaml b/CsvView/MainWindow.axaml index 0852b81..5e42ce7 100644 --- a/CsvView/MainWindow.axaml +++ b/CsvView/MainWindow.axaml @@ -2,10 +2,37 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:csvView="clr-namespace:CsvView" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="600" x:Class="CsvView.MainWindow" + x:DataType="csvView:MainWindowViewModel" Width="800" Height="600" Title="CsvView"> - Hello CvsView! + + + + + + + + + + / + + + + + + + + + + + + + + + + diff --git a/CsvView/MainWindow.axaml.cs b/CsvView/MainWindow.axaml.cs index 5c17c5c..4567d1f 100644 --- a/CsvView/MainWindow.axaml.cs +++ b/CsvView/MainWindow.axaml.cs @@ -1,5 +1,9 @@ +using System.Collections.Generic; +using System.Linq; using Avalonia.Controls; using Avalonia.Interactivity; +using Avalonia.Platform.Storage; +using CsvLib; namespace CsvView; @@ -8,5 +12,160 @@ public partial class MainWindow : Window public MainWindow() { InitializeComponent(); + RenderReg(0); } + + private async void BtnLoad_OnClick(object? sender, RoutedEventArgs e) + { + TopLevel? topLevel = GetTopLevel(this); + if (topLevel == null) { return; } + + IReadOnlyList files = await topLevel.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions + { + Title = "Open CSV File", + AllowMultiple = false, + FileTypeFilter = new List + { + new("CSV Files") { Patterns = new[] { "*.csv" } }, + new("Any File") { Patterns = new[] { "*" } }, + }, + }); + + if (files.Count <= 0) { return; } + + LoadFile(files[0].Path.LocalPath); + } + + private void BtnFirst_OnClick(object? sender, RoutedEventArgs e) + { + RenderReg(0); + } + + private void BtnPrevious_OnClick(object? sender, RoutedEventArgs e) + { + RenderReg(_currentReg - 1); + } + + private void TxtIndex_OnTextChanged(object? sender, TextChangedEventArgs e) + { + RenderReg(int.TryParse(TxtIndex.Text, out int newReg) ? newReg : _currentReg); + } + + private void BtnNext_OnClick(object? sender, RoutedEventArgs e) + { + RenderReg(_currentReg + 1); + } + + private void BtnLast_OnClick(object? sender, RoutedEventArgs e) + { + RenderReg(_totalRegs - 1); + } + + private string _loadedFile = string.Empty; + private long _currentReg; + private int _totalRegs; + private List _index = new(); + + + private void LoadFile(string fileName) + { + _loadedFile = fileName; + TxtFileName.Text = fileName; + + CsvIndexer csvIndexer = new(); + csvIndexer.LoadIndexOfFile(_loadedFile); + _index = csvIndexer.Index; + _totalRegs = _index.Count - 1; + + RenderReg(0); + } + + private MainWindowViewModel Index_LoadReg(int idx, int maxIndex) + { + CsvParser csvParser = new(); + csvParser.ParseFile(_loadedFile, _index[idx], 1); + MainWindowViewModel viewModel = new() + { + Index = idx, + MaxIndex = maxIndex, + Fields = csvParser.Data[0].Select(f => new FieldViewModel { Text = f, }).ToList(), + }; + return viewModel; + } + + bool _rendering; + private void RenderReg(long currentReg) + { + if (_rendering) { return; } + _rendering = true; + + if (_index.Count <= 0) + { + _currentReg = -1; + BtnFirst.IsEnabled = false; + BtnPrevious.IsEnabled = false; + TxtIndex.IsEnabled = false; + BtnNext.IsEnabled = false; + BtnLast.IsEnabled = false; + + DataContext = new MainWindowViewModel { Index = 0, Fields = new(), }; + _rendering = false; + return; + } + + bool first = false; + bool last = false; + if (currentReg <= 0) + { + currentReg = 0; + first = true; + } + if (currentReg >= (_totalRegs - 1)) + { + currentReg = _totalRegs - 1; + last = true; + } + + BtnFirst.IsEnabled = (first == false); + BtnPrevious.IsEnabled = (first == false); + TxtIndex.IsEnabled = true; + BtnNext.IsEnabled = (last == false); + BtnLast.IsEnabled = (last == false); + + if (_currentReg == currentReg) + { + _rendering = false; + return; + } + + _currentReg = currentReg; + + CsvParser csvParser = new(); + csvParser.ParseFile(_loadedFile, _index[(int)currentReg], 1); + MainWindowViewModel viewModel = new() + { + Index = (int)currentReg, + MaxIndex = _totalRegs, + Fields = csvParser.Data[0].Select(f => new FieldViewModel { Text = f, }).ToList(), + }; + + DataContext = viewModel; + + _rendering = false; + } + +} + +public class FieldViewModel +{ + public string Text { get; set; } = string.Empty; +} + +public class MainWindowViewModel +{ + public int? Index { get; set; } + + public int? MaxIndex { get; set; } + + public List? Fields { get; set; } }