mirror of
https://github.com/ckaczor/FeedCenter.git
synced 2026-01-14 01:25:38 -05:00
- Modernize old async code - Update to .NET 10 - Adjust namespace - Bypass update check when debugging
286 lines
8.2 KiB
C#
286 lines
8.2 KiB
C#
using ChrisKaczor.InstalledBrowsers;
|
|
using FeedCenter.Options;
|
|
using FeedCenter.Properties;
|
|
using System;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Web.UI;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using FeedCenter.Feeds;
|
|
using Serilog;
|
|
using Serilog.Events;
|
|
|
|
namespace FeedCenter;
|
|
|
|
public partial class MainWindow
|
|
{
|
|
private void HandlePreviousToolbarButtonClick(object sender, RoutedEventArgs e)
|
|
{
|
|
PreviousFeed();
|
|
}
|
|
|
|
private void HandleNextToolbarButtonClick(object sender, RoutedEventArgs e)
|
|
{
|
|
NextFeed();
|
|
}
|
|
|
|
private async Task OpenAllFeedItemsIndividually()
|
|
{
|
|
// Create a new list of feed items
|
|
var feedItems = (from FeedItem feedItem in LinkTextList.Items select feedItem).ToList();
|
|
|
|
// Cache the settings object
|
|
var settings = Settings.Default;
|
|
|
|
// Start with a longer sleep interval to give time for the browser to come up
|
|
var sleepInterval = settings.OpenAllSleepIntervalFirst;
|
|
|
|
// Loop over all items
|
|
foreach (var feedItem in feedItems)
|
|
{
|
|
// Try to open the link
|
|
if (InstalledBrowser.OpenLink(Settings.Default.Browser, feedItem.Link))
|
|
{
|
|
// Mark the feed as read
|
|
await feedItem.MarkAsRead(_database);
|
|
|
|
// Remove the item
|
|
LinkTextList.Items.Remove(feedItem);
|
|
}
|
|
|
|
// Wait a little bit
|
|
Thread.Sleep(sleepInterval);
|
|
|
|
// Switch to the normal sleep interval
|
|
sleepInterval = settings.OpenAllSleepInterval;
|
|
}
|
|
}
|
|
|
|
private void HandleOptionsToolbarButtonClick(object sender, RoutedEventArgs e)
|
|
{
|
|
// Create the options form
|
|
var optionsWindow = new OptionsWindow { Owner = this };
|
|
|
|
// Show the options window
|
|
optionsWindow.ShowDialog();
|
|
|
|
// Refresh the database to current settings
|
|
ResetDatabase();
|
|
|
|
// Re-initialize the feed display
|
|
DisplayFeed();
|
|
|
|
UpdateErrorLink();
|
|
}
|
|
|
|
internal static void HandleException(Exception exception)
|
|
{
|
|
Log.Logger.Write(LogEventLevel.Debug, exception, "");
|
|
}
|
|
|
|
private async void HandleMarkReadToolbarButtonClick(object sender, RoutedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
await MarkAllItemsAsRead();
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
HandleException(exception);
|
|
}
|
|
}
|
|
|
|
private void HandleShowErrorsButtonClick(object sender, RoutedEventArgs e)
|
|
{
|
|
// Create the feed error window
|
|
var feedErrorWindow = new FeedErrorWindow();
|
|
|
|
// Display the window
|
|
feedErrorWindow.Display(this);
|
|
|
|
// Refresh the database to current settings
|
|
ResetDatabase();
|
|
|
|
// Re-initialize the feed display
|
|
DisplayFeed();
|
|
|
|
UpdateErrorLink();
|
|
}
|
|
|
|
private async void HandleRefreshMenuItemClick(object sender, RoutedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
var menuItem = (MenuItem) e.Source;
|
|
|
|
if (Equals(menuItem, MenuRefresh))
|
|
ReadCurrentFeed(true);
|
|
else if (Equals(menuItem, MenuRefreshAll))
|
|
await ReadFeeds(true);
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
HandleException(exception);
|
|
}
|
|
}
|
|
|
|
private async void HandleRefreshToolbarButtonClick(object sender, RoutedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
await ReadFeeds(true);
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
HandleException(exception);
|
|
}
|
|
}
|
|
|
|
private async void HandleOpenAllMenuItemClick(object sender, RoutedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
var menuItem = (MenuItem) e.Source;
|
|
|
|
if (Equals(menuItem, MenuOpenAllSinglePage))
|
|
await OpenAllFeedItemsOnSinglePage();
|
|
else if (Equals(menuItem, MenuOpenAllMultiplePages))
|
|
await OpenAllFeedItemsIndividually();
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
HandleException(exception);
|
|
}
|
|
}
|
|
|
|
private async void HandleOpenAllToolbarButtonClick(object sender, RoutedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
var multipleOpenAction = _currentFeed.MultipleOpenAction;
|
|
|
|
switch (multipleOpenAction)
|
|
{
|
|
case MultipleOpenAction.IndividualPages:
|
|
await OpenAllFeedItemsIndividually();
|
|
break;
|
|
case MultipleOpenAction.SinglePage:
|
|
await OpenAllFeedItemsOnSinglePage();
|
|
break;
|
|
}
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
HandleException(exception);
|
|
}
|
|
}
|
|
|
|
private void HandleEditCurrentFeedMenuItemClick(object sender, RoutedEventArgs e)
|
|
{
|
|
// Create a new feed window
|
|
var feedWindow = new FeedWindow(_database);
|
|
|
|
// Display the feed window and get the result
|
|
var result = feedWindow.Display(_currentFeed, this);
|
|
|
|
// If OK was clicked...
|
|
if (result.HasValue && result.Value)
|
|
{
|
|
// Save
|
|
_database.SaveChanges(() => { });
|
|
|
|
// Update feed
|
|
DisplayFeed();
|
|
}
|
|
}
|
|
|
|
private void HandleDeleteCurrentFeedMenuItemClick(object sender, RoutedEventArgs e)
|
|
{
|
|
// Confirm this delete since it is for real
|
|
if (MessageBox.Show(this, Properties.Resources.ConfirmDeleteFeed, string.Empty, MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) == MessageBoxResult.No)
|
|
return;
|
|
|
|
// Get the current feed
|
|
var feedToDelete = _currentFeed;
|
|
|
|
// Move to the next feed
|
|
NextFeed();
|
|
|
|
// Delete the feed
|
|
_database.SaveChanges(() => _database.Feeds.Remove(feedToDelete));
|
|
|
|
// Refresh the database to current settings
|
|
ResetDatabase();
|
|
|
|
// Re-initialize the feed display
|
|
DisplayFeed();
|
|
}
|
|
|
|
private async Task OpenAllFeedItemsOnSinglePage()
|
|
{
|
|
var fileName = Path.GetTempFileName() + ".html";
|
|
TextWriter textWriter = new StreamWriter(fileName);
|
|
|
|
await using (var htmlTextWriter = new HtmlTextWriter(textWriter))
|
|
{
|
|
htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.Html);
|
|
|
|
htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.Head);
|
|
|
|
htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.Title);
|
|
await htmlTextWriter.WriteAsync(_currentFeed.Title);
|
|
htmlTextWriter.RenderEndTag();
|
|
|
|
htmlTextWriter.AddAttribute("http-equiv", "Content-Type");
|
|
htmlTextWriter.AddAttribute("content", "text/html; charset=utf-8");
|
|
htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.Meta);
|
|
htmlTextWriter.RenderEndTag();
|
|
|
|
htmlTextWriter.RenderEndTag();
|
|
|
|
htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.Body);
|
|
|
|
var sortedItems = from item in _currentFeed.Items where !item.BeenRead orderby item.Sequence ascending select item;
|
|
|
|
var firstItem = true;
|
|
|
|
foreach (var item in sortedItems)
|
|
{
|
|
if (!firstItem)
|
|
{
|
|
htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.Hr);
|
|
htmlTextWriter.RenderEndTag();
|
|
}
|
|
|
|
htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.Div);
|
|
|
|
htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Href, item.Link);
|
|
htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.A);
|
|
await htmlTextWriter.WriteAsync(item.Title.Length == 0 ? item.Link : item.Title);
|
|
htmlTextWriter.RenderEndTag();
|
|
|
|
htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.Br);
|
|
htmlTextWriter.RenderEndTag();
|
|
|
|
await htmlTextWriter.WriteAsync(item.Description);
|
|
|
|
htmlTextWriter.RenderEndTag();
|
|
|
|
firstItem = false;
|
|
}
|
|
|
|
htmlTextWriter.RenderEndTag();
|
|
htmlTextWriter.RenderEndTag();
|
|
}
|
|
|
|
await textWriter.FlushAsync();
|
|
textWriter.Close();
|
|
|
|
InstalledBrowser.OpenLink(Settings.Default.Browser, fileName);
|
|
|
|
await MarkAllItemsAsRead();
|
|
}
|
|
} |