using System.IO; using System.Net.Cache; using System.Net.Mime; using System.Text; using System.Text.Json; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; 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; namespace Bokhantarare; /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { private List books = new(); private List booksFiltered = new(); public MainWindow() { if (File.Exists("./books.json")) { books = JsonSerializer.Deserialize>(File.ReadAllText("./books.json")); } InitializeComponent(); ScrollBar.Minimum = 0; ScrollBar.Maximum = books.Count-6; if (ScrollBar.Maximum <= 0) { ScrollBar.Visibility = Visibility.Collapsed; } uppdateListedBooks(0); Console.WriteLine(Book.GetBookFromISBN("978-1-97470719-5")); AppDomain.CurrentDomain.ProcessExit += (_, __) => { File.WriteAllText("books.json", JsonSerializer.Serialize(books)); }; } public void uppdateListedBooks(int offset, List listedBooks = null) { if (listedBooks == null || listedBooks.Count == 0) { listedBooks = books; } if (offset > listedBooks.Count) { offset = 0; ScrollBar.Value = 0; } List shown = listedBooks.GetRange(offset, Math.Min(6, listedBooks.Count - offset)); int i = 0; Library.Children.Clear(); foreach (Book book in shown) { Grid grid = new Grid(); grid.Margin = new Thickness(0, 5, 0, 0); grid.SetValue(Grid.RowProperty, i); i++; ColumnDefinition def1 = new ColumnDefinition(); def1.Width = new GridLength(40); grid.ColumnDefinitions.Add(def1); ColumnDefinition def2 = new ColumnDefinition(); def2.Width = GridLength.Auto; grid.ColumnDefinitions.Add(def2); ColumnDefinition def7 = new ColumnDefinition(); def2.Width = GridLength.Auto; grid.ColumnDefinitions.Add(def7); BitmapImage coverBitmap = new BitmapImage(); coverBitmap.BeginInit(); coverBitmap.UriSource = new Uri($"https://covers.openlibrary.org/b/isbn/{book.ISBN}-S.jpg"); coverBitmap.CacheOption = BitmapCacheOption.OnLoad; // Ensure full load before use //coverBitmap.CreateOptions = BitmapCreateOptions.IgnoreImageCache; // Prevent caching issues coverBitmap.UriCachePolicy = new RequestCachePolicy(RequestCacheLevel.Default); // Network-friendly caching coverBitmap.EndInit(); Image cover = new Image(); cover.SetValue(Grid.ColumnProperty, 0); cover.Stretch = Stretch.Uniform; cover.Source = coverBitmap; cover.Margin = new Thickness(0, 0, 5, 0); grid.Children.Add(cover); Grid bookInfo = new Grid(); bookInfo.SetValue(Grid.ColumnProperty, 1); RowDefinition def3 = new RowDefinition(); def3.Height = GridLength.Auto; bookInfo.RowDefinitions.Add(def3); RowDefinition def4 = new RowDefinition(); bookInfo.RowDefinitions.Add(def4); TextBlock title = new TextBlock(); title.Text = book.Title; title.SetValue(Grid.RowProperty, 0); bookInfo.Children.Add(title); Grid spesificInfo = new Grid(); spesificInfo.SetValue(Grid.RowProperty, 1); spesificInfo.RowDefinitions.Add(new RowDefinition()); spesificInfo.RowDefinitions.Add(new RowDefinition()); TextBlock author = new TextBlock(); author.Text = $"Author{(book.Authors.Length == 1 ? "" : "s")} {(book.Authors.Length == 1 ? book.Authors[0] : string.Join(", ", book.Authors))}"; author.SetValue(Grid.RowProperty, 0); spesificInfo.Children.Add(author); TextBlock year = new TextBlock(); year.Text = $"Year {(book.PubYear)}"; year.SetValue(Grid.RowProperty, 1); spesificInfo.Children.Add(year); bookInfo.Children.Add(spesificInfo); grid.Children.Add(bookInfo); BitmapImage removeBitmap = new BitmapImage(); removeBitmap.BeginInit(); removeBitmap.UriSource = new Uri($"{Environment.CurrentDirectory}/recycle-bin.png"); removeBitmap.CacheOption = BitmapCacheOption.OnLoad; // Ensure full load before use //removeBitmap.CreateOptions = BitmapCreateOptions.IgnoreImageCache; // Prevent caching issues removeBitmap.UriCachePolicy = new RequestCachePolicy(RequestCacheLevel.Default); // Network-friendly caching removeBitmap.EndInit(); Image removeImage = new Image(); removeImage.SetValue(Grid.ColumnProperty, 0); removeImage.Stretch = Stretch.Uniform; removeImage.Source = removeBitmap; removeImage.MaxHeight = 20; removeImage.MaxWidth = 20; removeImage.Margin = new Thickness(0, 0, 5, 0); Button remove = new Button(); remove.Click += (_, __) => RemoveBook(book); remove.Content = removeImage; remove.MaxWidth = 30; remove.SetValue(Grid.ColumnProperty, 2); grid.Children.Add(remove); Library.Children.Add(grid); } Library.UpdateLayout(); } private void ISBN_OnTextChange(object sender, TextChangedEventArgs e) { if (sender is TextBox textBox) { ISBNPlaceholderText.Visibility = string.IsNullOrEmpty(textBox.Text) ? Visibility.Visible : Visibility.Collapsed; } } private void Title_OnTextChange(object sender, TextChangedEventArgs e) { if (sender is TextBox textBox) { TitlePlaceholderText.Visibility = string.IsNullOrEmpty(textBox.Text) ? Visibility.Visible : Visibility.Collapsed; } } private void CustomTitle_OnTextChange(object sender, TextChangedEventArgs e) { if (sender is TextBox textBox) { CustomTitlePlaceholderText.Visibility = string.IsNullOrEmpty(textBox.Text) ? Visibility.Visible : Visibility.Collapsed; } } private void CustomISBN_OnTextChange(object sender, TextChangedEventArgs e) { if (sender is TextBox textBox) { CustomISBNPlaceholderText.Visibility = string.IsNullOrEmpty(textBox.Text) ? Visibility.Visible : Visibility.Collapsed; } } private void CustomAuthor_OnTextChange(object sender, TextChangedEventArgs e) { if (sender is TextBox textBox) { CustomAuthorPlaceholderText.Visibility = string.IsNullOrEmpty(textBox.Text) ? Visibility.Visible : Visibility.Collapsed; } } private void CustomPubYear_OnTextChange(object sender, TextChangedEventArgs e) { if (sender is TextBox textBox) { CustomPubYearPlaceholderText.Visibility = string.IsNullOrEmpty(textBox.Text) ? Visibility.Visible : Visibility.Collapsed; } } private void CustomEntry(object sender, RoutedEventArgs e) { Book book = new Book(CustomISBN.Text, CustomTitle.Text, CustomAuthor.Text.Split(", "), CustomPubYear.Text); string messageBoxText = $"Are you sure you want to save the book?\nTitle: {book.Title}\nAuthors: {string.Join(", ", book.Authors)}\nPublising year: {book.PubYear}"; string caption = "Add Entry"; MessageBoxButton button = MessageBoxButton.YesNo; MessageBoxImage icon = MessageBoxImage.Question; MessageBoxResult result; result = MessageBox.Show(messageBoxText, caption, button, icon, MessageBoxResult.Yes); if (result == MessageBoxResult.Yes) { if (books.Any(b => b.Title == book.Title)) { MessageBox.Show("Book already in Library", "Found book", MessageBoxButton.OK, MessageBoxImage.Warning); } else { AddBook(book); } } } private void SearchByISBN(object sender, RoutedEventArgs e) { Book book; try { book = Book.GetBookFromISBN(ISBN.Text); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } MessageBox.Show($"Found: {book.Title}", "Found book", MessageBoxButton.OK, MessageBoxImage.Information); if (books.Any(b => b.Title == book.Title)) { MessageBox.Show("Book already in Library", "Found book", MessageBoxButton.OK, MessageBoxImage.Warning); } else { AddBook(book); } } private void AddBook(Book book) { books.Add(book); ScrollBar.Maximum = books.Count-6; uppdateListedBooks((int)Math.Floor(ScrollBar.Value*books.Count), booksFiltered); if (ScrollBar.Maximum > 6) { ScrollBar.Visibility = Visibility.Visible; } } private void RemoveBook(Book book) { books.Remove(book); ScrollBar.Maximum = books.Count-6; uppdateListedBooks((int)Math.Floor(ScrollBar.Value*books.Count)); if (ScrollBar.Maximum == 0) { ScrollBar.Visibility = Visibility.Collapsed; } } private void SearchByTitle(object sender, RoutedEventArgs e) { try { BareBookInfo[]? books = Book.GetBooksFromTitle(Title.Text); if (books == null) { MessageBox.Show("No books found", "No books", MessageBoxButton.OK, MessageBoxImage.Error); return; } Console.WriteLine($"Found {books.Length} with the title \"{Title.Text}\""); BookSelectionPage selectionPage = new BookSelectionPage(books); selectionPage.ShowDialog(); if (selectionPage.DialogResult.HasValue && selectionPage.DialogResult.Value) { BareBookInfo selectedBook = selectionPage.getSelectedBook(); AddBook(selectedBook.getBook()); } else { MessageBox.Show("No books found", "No books", MessageBoxButton.OK, MessageBoxImage.Error); return; } } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); } } private void ScrollView(object sender, ScrollEventArgs e) { if (sender is ScrollBar scrollBar) { uppdateListedBooks((int)Math.Floor(scrollBar.Value*books.Count), booksFiltered); } } private void Search_OnTextChange(object sender, TextChangedEventArgs e) { if (sender is TextBox textBox) { SearchPlaceholderText.Visibility = string.IsNullOrEmpty(textBox.Text) ? Visibility.Visible : Visibility.Collapsed; if (string.IsNullOrEmpty(textBox.Text)) { ScrollBar.Maximum = books.Count - 6; if (ScrollBar.Maximum <= 0) { ScrollBar.Visibility = Visibility.Collapsed; } else { ScrollBar.Visibility = Visibility.Visible; } ScrollBar.Value = 0; booksFiltered = null; uppdateListedBooks((int)Math.Floor(ScrollBar.Value*books.Count), booksFiltered); } else { booksFiltered = books.Where(b => b.Title.ToLower().Contains(textBox.Text.ToLower())).ToList(); ScrollBar.Maximum = booksFiltered.Count - 6; if (ScrollBar.Maximum <= 0) { ScrollBar.Visibility = Visibility.Collapsed; } else { ScrollBar.Visibility = Visibility.Visible; } ScrollBar.Value = 0; uppdateListedBooks((int)Math.Floor(ScrollBar.Value*books.Count), booksFiltered); } } } private void ScrolLibrary(object sender, MouseWheelEventArgs e) { int value = (int)Math.Floor(ScrollBar.Value + e.Delta / 120); ScrollBar.Value = Math.Min(ScrollBar.Maximum, value); uppdateListedBooks((int)Math.Floor(ScrollBar.Value*books.Count), booksFiltered); } }