diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..2d99c50 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "submodules/OPMLCore.NET"] + path = submodules/OPMLCore.NET + url = https://github.com/fnya/OPMLCore.NET + branch = master diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..c779b69 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,364 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +[Ss]ubmodules/* \ No newline at end of file diff --git a/src/.gitkeep b/src/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/src/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/.gitmodules b/src/.gitmodules new file mode 100644 index 0000000..2d99c50 --- /dev/null +++ b/src/.gitmodules @@ -0,0 +1,4 @@ +[submodule "submodules/OPMLCore.NET"] + path = submodules/OPMLCore.NET + url = https://github.com/fnya/OPMLCore.NET + branch = master diff --git a/src/App.config b/src/App.config new file mode 100644 index 0000000..775e457 --- /dev/null +++ b/src/App.config @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AppProps.cs b/src/AppProps.cs new file mode 100644 index 0000000..b93c359 --- /dev/null +++ b/src/AppProps.cs @@ -0,0 +1,26 @@ +using Cordial.Models; +using System; +using System.Collections.Generic; +using System.IO; + +namespace Cordial +{ + public class AppProps + { + public static string AppName = "Cordial"; + public static string CreatorName = "exsersewo"; + public static string AppFullName = Path.Combine(CreatorName, AppName).Replace("\\", "/"); + public static readonly string BaseDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), AppFullName); + public static readonly string LogDirectory = Path.Combine(BaseDirectory, "logs"); + public static readonly string ConfigurationDirectory = Path.Combine(BaseDirectory, "config"); + public static readonly string DefaultPodcastDownloadDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyMusic), "Podcasts"); + public static readonly string RepoUrl = Path.Combine("https://github.com", AppFullName); + public static string[] Contributors = new[] { CreatorName }; + public static List OpenSourceProjects = new List + { + new GithubStruct("fnya", "https://github.com/fnya/OPMLCore.NET"), + new GithubStruct("Argotic team", "https://github.com/argotic-syndication-framework/Argotic"), + new GithubStruct("GitHub", "https://github.com/octokit/octokit.net") + }; + } +} diff --git a/src/Cordial.csproj b/src/Cordial.csproj new file mode 100644 index 0000000..57efcca --- /dev/null +++ b/src/Cordial.csproj @@ -0,0 +1,224 @@ + + + + + Debug + AnyCPU + {7385FD85-EE39-4DB2-9853-7AD2736FAB18} + WinExe + Cordial + Cordial + v4.7.2 + 512 + true + true + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 0.1.0.%2a + false + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + bin\PreRelease\ + TRACE;PRERELEASE + true + pdbonly + AnyCPU + 7.3 + prompt + true + + + bin\PreRelease Debug\ + TRACE;PRERELEASE; DEBUG + false + pdbonly + AnyCPU + 7.3 + prompt + false + + + Cordial.Program + + + + packages\Argotic.Common.2008.0.2.0\lib\Net35\Argotic.Common.dll + + + packages\Argotic.Core.2008.0.2.0\lib\Net35\Argotic.Core.dll + + + packages\Argotic.Extensions.2008.0.2.0\lib\Net35\Argotic.Extensions.dll + + + packages\Argotic.Web.2008.0.2.0\lib\Net35\Argotic.Web.dll + + + packages\Microsoft.Bcl.AsyncInterfaces.5.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll + + + packages\Octokit.0.48.0\lib\net46\Octokit.dll + + + + packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + + packages\System.Memory.4.5.4\lib\net461\System.Memory.dll + + + + packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll + + + packages\System.Text.Encodings.Web.5.0.0\lib\net461\System.Text.Encodings.Web.dll + + + packages\System.Text.Json.5.0.0\lib\net461\System.Text.Json.dll + + + packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + + packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll + + + + + + + + + + + + + + + + Form + + + Form1.cs + + + + + + + + + + + True + True + en-gb.resx + + + True + True + nl-nl.resx + + + ResXFileCodeGenerator + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + ResXFileCodeGenerator + en-gb.Designer.cs + + + ResXFileCodeGenerator + nl-nl.Designer.cs + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + {e015f989-878b-4ff6-a9d2-724abbe9a959} + OPMLCore.NET + + + + + + + + False + Microsoft .NET Framework 4.7.2 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + + XCOPY "$(SolutionDir)\Resources" "$(TargetDir)\Resources\" /S /Y +RD /S /Q "$(TargetDir)\Resources\Icon" +DEL "$(TargetDir)\Resources\Languages\*.cs" + + + RD /S /Q "$(TargetDir)\Resources\" + + \ No newline at end of file diff --git a/src/Cordial.sln b/src/Cordial.sln new file mode 100644 index 0000000..6c50199 --- /dev/null +++ b/src/Cordial.sln @@ -0,0 +1,41 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30615.102 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cordial", "Cordial.csproj", "{7385FD85-EE39-4DB2-9853-7AD2736FAB18}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OPMLCore.NET", "submodules\OPMLCore.NET\src\OPMLCore.NET\OPMLCore.NET.csproj", "{E015F989-878B-4FF6-A9D2-724ABBE9A959}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + PreRelease Debug|Any CPU = PreRelease Debug|Any CPU + PreRelease|Any CPU = PreRelease|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7385FD85-EE39-4DB2-9853-7AD2736FAB18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7385FD85-EE39-4DB2-9853-7AD2736FAB18}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7385FD85-EE39-4DB2-9853-7AD2736FAB18}.PreRelease Debug|Any CPU.ActiveCfg = PreRelease Debug|Any CPU + {7385FD85-EE39-4DB2-9853-7AD2736FAB18}.PreRelease Debug|Any CPU.Build.0 = PreRelease Debug|Any CPU + {7385FD85-EE39-4DB2-9853-7AD2736FAB18}.PreRelease|Any CPU.ActiveCfg = PreRelease|Any CPU + {7385FD85-EE39-4DB2-9853-7AD2736FAB18}.PreRelease|Any CPU.Build.0 = PreRelease|Any CPU + {7385FD85-EE39-4DB2-9853-7AD2736FAB18}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7385FD85-EE39-4DB2-9853-7AD2736FAB18}.Release|Any CPU.Build.0 = Release|Any CPU + {E015F989-878B-4FF6-A9D2-724ABBE9A959}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E015F989-878B-4FF6-A9D2-724ABBE9A959}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E015F989-878B-4FF6-A9D2-724ABBE9A959}.PreRelease Debug|Any CPU.ActiveCfg = PreRelease Debug|Any CPU + {E015F989-878B-4FF6-A9D2-724ABBE9A959}.PreRelease Debug|Any CPU.Build.0 = PreRelease Debug|Any CPU + {E015F989-878B-4FF6-A9D2-724ABBE9A959}.PreRelease|Any CPU.ActiveCfg = PreRelease|Any CPU + {E015F989-878B-4FF6-A9D2-724ABBE9A959}.PreRelease|Any CPU.Build.0 = PreRelease|Any CPU + {E015F989-878B-4FF6-A9D2-724ABBE9A959}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E015F989-878B-4FF6-A9D2-724ABBE9A959}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {037502FE-ECE8-4F20-9416-31EB1732ADDC} + EndGlobalSection +EndGlobal diff --git a/src/External/MessageBoxManager.cs b/src/External/MessageBoxManager.cs new file mode 100644 index 0000000..5915d43 --- /dev/null +++ b/src/External/MessageBoxManager.cs @@ -0,0 +1,225 @@ +/* + * @Author Alex C. Duma + * @Url https://www.codeproject.com/Articles/18399/Localizing-System-MessageBox + * @Date 2 May 2007 + * @License CPOL 1.02 https://www.codeproject.com/info/cpol10.aspx + */ + +#pragma warning disable 0618 +using System.Runtime.InteropServices; +using System.Security.Permissions; +using System.Text; + +[assembly: SecurityPermission(SecurityAction.RequestMinimum, UnmanagedCode = true)] +namespace System.Windows.Forms +{ + public class MessageBoxManager + { + private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); + private delegate bool EnumChildProc(IntPtr hWnd, IntPtr lParam); + + private const int WH_CALLWNDPROCRET = 12; + private const int WM_DESTROY = 0x0002; + private const int WM_INITDIALOG = 0x0110; + private const int WM_TIMER = 0x0113; + private const int WM_USER = 0x400; + private const int DM_GETDEFID = WM_USER + 0; + + private const int MBOK = 1; + private const int MBCancel = 2; + private const int MBAbort = 3; + private const int MBRetry = 4; + private const int MBIgnore = 5; + private const int MBYes = 6; + private const int MBNo = 7; + + + [DllImport("user32.dll")] + private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll")] + private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); + + [DllImport("user32.dll")] + private static extern int UnhookWindowsHookEx(IntPtr idHook); + + [DllImport("user32.dll")] + private static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll", EntryPoint = "GetWindowTextLengthW", CharSet = CharSet.Unicode)] + private static extern int GetWindowTextLength(IntPtr hWnd); + + [DllImport("user32.dll", EntryPoint = "GetWindowTextW", CharSet = CharSet.Unicode)] + private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int maxLength); + + [DllImport("user32.dll")] + private static extern int EndDialog(IntPtr hDlg, IntPtr nResult); + + [DllImport("user32.dll")] + private static extern bool EnumChildWindows(IntPtr hWndParent, EnumChildProc lpEnumFunc, IntPtr lParam); + + [DllImport("user32.dll", EntryPoint = "GetClassNameW", CharSet = CharSet.Unicode)] + private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); + + [DllImport("user32.dll")] + private static extern int GetDlgCtrlID(IntPtr hwndCtl); + + [DllImport("user32.dll")] + private static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); + + [DllImport("user32.dll", EntryPoint = "SetWindowTextW", CharSet = CharSet.Unicode)] + private static extern bool SetWindowText(IntPtr hWnd, string lpString); + + + [StructLayout(LayoutKind.Sequential)] + public struct CWPRETSTRUCT + { + public IntPtr lResult; + public IntPtr lParam; + public IntPtr wParam; + public uint message; + public IntPtr hwnd; + }; + + private static HookProc hookProc; + private static EnumChildProc enumProc; + [ThreadStatic] + private static IntPtr hHook; + [ThreadStatic] + private static int nButton; + + /// + /// OK text + /// + public static string OK = "&OK"; + /// + /// Cancel text + /// + public static string Cancel = "&Cancel"; + /// + /// Abort text + /// + public static string Abort = "&Abort"; + /// + /// Retry text + /// + public static string Retry = "&Retry"; + /// + /// Ignore text + /// + public static string Ignore = "&Ignore"; + /// + /// Yes text + /// + public static string Yes = "&Yes"; + /// + /// No text + /// + public static string No = "&No"; + + static MessageBoxManager() + { + hookProc = new HookProc(MessageBoxHookProc); + enumProc = new EnumChildProc(MessageBoxEnumProc); + hHook = IntPtr.Zero; + } + + /// + /// Enables MessageBoxManager functionality + /// + /// + /// MessageBoxManager functionality is enabled on current thread only. + /// Each thread that needs MessageBoxManager functionality has to call this method. + /// + public static void Register() + { + if (hHook != IntPtr.Zero) + throw new NotSupportedException("One hook per thread allowed."); + hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, hookProc, IntPtr.Zero, AppDomain.GetCurrentThreadId()); + } + + /// + /// Disables MessageBoxManager functionality + /// + /// + /// Disables MessageBoxManager functionality on current thread only. + /// + public static void Unregister() + { + if (hHook != IntPtr.Zero) + { + UnhookWindowsHookEx(hHook); + hHook = IntPtr.Zero; + } + } + + private static IntPtr MessageBoxHookProc(int nCode, IntPtr wParam, IntPtr lParam) + { + if (nCode < 0) + return CallNextHookEx(hHook, nCode, wParam, lParam); + + CWPRETSTRUCT msg = (CWPRETSTRUCT)Marshal.PtrToStructure(lParam, typeof(CWPRETSTRUCT)); + IntPtr hook = hHook; + + if (msg.message == WM_INITDIALOG) + { + int nLength = GetWindowTextLength(msg.hwnd); + StringBuilder className = new StringBuilder(10); + GetClassName(msg.hwnd, className, className.Capacity); + if (className.ToString() == "#32770") + { + nButton = 0; + EnumChildWindows(msg.hwnd, enumProc, IntPtr.Zero); + if (nButton == 1) + { + IntPtr hButton = GetDlgItem(msg.hwnd, MBCancel); + if (hButton != IntPtr.Zero) + SetWindowText(hButton, OK); + } + } + } + + return CallNextHookEx(hook, nCode, wParam, lParam); + } + + private static bool MessageBoxEnumProc(IntPtr hWnd, IntPtr lParam) + { + StringBuilder className = new StringBuilder(10); + GetClassName(hWnd, className, className.Capacity); + if (className.ToString() == "Button") + { + int ctlId = GetDlgCtrlID(hWnd); + switch (ctlId) + { + case MBOK: + SetWindowText(hWnd, OK); + break; + case MBCancel: + SetWindowText(hWnd, Cancel); + break; + case MBAbort: + SetWindowText(hWnd, Abort); + break; + case MBRetry: + SetWindowText(hWnd, Retry); + break; + case MBIgnore: + SetWindowText(hWnd, Ignore); + break; + case MBYes: + SetWindowText(hWnd, Yes); + break; + case MBNo: + SetWindowText(hWnd, No); + break; + + } + nButton++; + } + + return true; + } + + + } +} \ No newline at end of file diff --git a/src/Form1.Designer.cs b/src/Form1.Designer.cs new file mode 100644 index 0000000..7c5daec --- /dev/null +++ b/src/Form1.Designer.cs @@ -0,0 +1,875 @@ + +namespace Cordial +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.DataGridView dataGridView1; + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + this.fileMenuStrip = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.importFeedsFromOpmlToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exportFeedsAsOpmlToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.preferencesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.closeWindowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.quitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.closeNotificationTray = new System.Windows.Forms.ToolStripMenuItem(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.selectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.checkAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.catchupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.checkSelectedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.addAFeedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeFeedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.feedPropertiesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.schedulerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.selectLanguageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.checkForUpdateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.reportAProblemToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.downloadsPage = new System.Windows.Forms.TabPage(); + this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.panel1 = new System.Windows.Forms.Panel(); + this.removeSelectedButton = new System.Windows.Forms.Button(); + this.cancelSelectedButton = new System.Windows.Forms.Button(); + this.statusStrip2 = new System.Windows.Forms.StatusStrip(); + this.liveDownloadCounter = new System.Windows.Forms.ToolStripStatusLabel(); + this.downloadSpeed = new System.Windows.Forms.ToolStripStatusLabel(); + this.subscriptionsPage = new System.Windows.Forms.TabPage(); + this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); + this.checkNewButton = new System.Windows.Forms.Button(); + this.cactchUpButton = new System.Windows.Forms.Button(); + this.subscriptionSearchBox = new System.Windows.Forms.TextBox(); + this.checkSelectedButton = new System.Windows.Forms.Button(); + this.addNewFeed = new System.Windows.Forms.Button(); + this.feedPropertiesButton = new System.Windows.Forms.Button(); + this.removeFeedButton = new System.Windows.Forms.Button(); + this.schedulerButton = new System.Windows.Forms.Button(); + this.cleanupPage = new System.Windows.Forms.TabPage(); + this.logPage = new System.Windows.Forms.TabPage(); + this.logRTB = new System.Windows.Forms.RichTextBox(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.notificationIcon = new System.Windows.Forms.NotifyIcon(this.components); + this.notificationMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.showWindowNotificationMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.runCheckNotificationMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.quitNotificationMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.opmlFileOpen = new System.Windows.Forms.OpenFileDialog(); + this.opmlFileSave = new System.Windows.Forms.SaveFileDialog(); + this.nameDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.statusDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.mBDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.locationDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.podcastBindingSource = new System.Windows.Forms.BindingSource(this.components); + dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(dataGridView1)).BeginInit(); + this.fileMenuStrip.SuspendLayout(); + this.tabControl1.SuspendLayout(); + this.downloadsPage.SuspendLayout(); + this.tableLayoutPanel2.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + this.panel1.SuspendLayout(); + this.statusStrip2.SuspendLayout(); + this.subscriptionsPage.SuspendLayout(); + this.tableLayoutPanel3.SuspendLayout(); + this.logPage.SuspendLayout(); + this.notificationMenuStrip.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.podcastBindingSource)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + dataGridView1.AllowUserToAddRows = false; + dataGridView1.AllowUserToDeleteRows = false; + dataGridView1.AutoGenerateColumns = false; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle1.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + dataGridView1.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.nameDataGridViewTextBoxColumn, + this.statusDataGridViewTextBoxColumn, + this.mBDataGridViewTextBoxColumn, + this.locationDataGridViewTextBoxColumn}); + dataGridView1.DataSource = this.podcastBindingSource; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle2.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + dataGridView1.DefaultCellStyle = dataGridViewCellStyle2; + dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; + dataGridView1.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically; + dataGridView1.Location = new System.Drawing.Point(2, 26); + dataGridView1.Margin = new System.Windows.Forms.Padding(2); + dataGridView1.Name = "dataGridView1"; + dataGridView1.ReadOnly = true; + dataGridView1.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + dataGridView1.RowHeadersVisible = false; + dataGridView1.RowHeadersWidth = 51; + dataGridView1.RowTemplate.Height = 24; + dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + dataGridView1.ShowCellErrors = false; + dataGridView1.ShowEditingIcon = false; + dataGridView1.ShowRowErrors = false; + dataGridView1.Size = new System.Drawing.Size(796, 436); + dataGridView1.TabIndex = 0; + // + // fileMenuStrip + // + this.fileMenuStrip.ImageScalingSize = new System.Drawing.Size(20, 20); + this.fileMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.editToolStripMenuItem, + this.viewToolStripMenuItem, + this.toolsToolStripMenuItem, + this.helpToolStripMenuItem}); + this.fileMenuStrip.Location = new System.Drawing.Point(0, 0); + this.fileMenuStrip.Name = "fileMenuStrip"; + this.fileMenuStrip.Padding = new System.Windows.Forms.Padding(4, 2, 0, 2); + this.fileMenuStrip.Size = new System.Drawing.Size(808, 24); + this.fileMenuStrip.TabIndex = 0; + this.fileMenuStrip.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.importFeedsFromOpmlToolStripMenuItem, + this.exportFeedsAsOpmlToolStripMenuItem, + this.preferencesToolStripMenuItem, + this.toolStripSeparator3, + this.closeNotificationTray, + this.closeWindowToolStripMenuItem, + this.quitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.fileToolStripMenuItem.Text = "File"; + // + // importFeedsFromOpmlToolStripMenuItem + // + this.importFeedsFromOpmlToolStripMenuItem.Name = "importFeedsFromOpmlToolStripMenuItem"; + this.importFeedsFromOpmlToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.O))); + this.importFeedsFromOpmlToolStripMenuItem.Size = new System.Drawing.Size(285, 22); + this.importFeedsFromOpmlToolStripMenuItem.Text = "Import feeds from opml..."; + this.importFeedsFromOpmlToolStripMenuItem.Click += new System.EventHandler(this.importFeedsFromOpmlToolStripMenuItem_Click); + // + // exportFeedsAsOpmlToolStripMenuItem + // + this.exportFeedsAsOpmlToolStripMenuItem.Name = "exportFeedsAsOpmlToolStripMenuItem"; + this.exportFeedsAsOpmlToolStripMenuItem.Size = new System.Drawing.Size(285, 22); + this.exportFeedsAsOpmlToolStripMenuItem.Text = "Export feeds as opml"; + this.exportFeedsAsOpmlToolStripMenuItem.Click += new System.EventHandler(this.exportFeedsAsOpmlToolStripMenuItem_Click); + // + // preferencesToolStripMenuItem + // + this.preferencesToolStripMenuItem.Name = "preferencesToolStripMenuItem"; + this.preferencesToolStripMenuItem.Size = new System.Drawing.Size(285, 22); + this.preferencesToolStripMenuItem.Text = "Preferences..."; + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(282, 6); + // + // closeWindowToolStripMenuItem + // + this.closeWindowToolStripMenuItem.Name = "closeWindowToolStripMenuItem"; + this.closeWindowToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.W))); + this.closeWindowToolStripMenuItem.Size = new System.Drawing.Size(285, 22); + this.closeWindowToolStripMenuItem.Text = "Close window"; + this.closeWindowToolStripMenuItem.Click += new System.EventHandler(this.closeWindowToolStripMenuItem_Click); + // + // quitToolStripMenuItem + // + this.quitToolStripMenuItem.Name = "quitToolStripMenuItem"; + this.quitToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Q))); + this.quitToolStripMenuItem.Size = new System.Drawing.Size(285, 22); + this.quitToolStripMenuItem.Text = "Quit"; + this.quitToolStripMenuItem.Click += new System.EventHandler(this.quitToolStripMenuItem_Click); + // + // closeNotificationTray + // + this.closeNotificationTray.Name = "closeNotificationTray"; + this.closeNotificationTray.Size = new System.Drawing.Size(285, 22); + this.closeNotificationTray.Text = "Close to Notification Try"; + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.selectAllToolStripMenuItem}); + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(39, 20); + this.editToolStripMenuItem.Text = "Edit"; + // + // selectAllToolStripMenuItem + // + this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem"; + this.selectAllToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.A))); + this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(162, 22); + this.selectAllToolStripMenuItem.Text = "Select all"; + // + // viewToolStripMenuItem + // + this.viewToolStripMenuItem.Name = "viewToolStripMenuItem"; + this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.viewToolStripMenuItem.Text = "View"; + // + // toolsToolStripMenuItem + // + this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.checkAllToolStripMenuItem, + this.catchupToolStripMenuItem, + this.checkSelectedToolStripMenuItem, + this.toolStripSeparator1, + this.addAFeedToolStripMenuItem, + this.removeFeedToolStripMenuItem, + this.feedPropertiesToolStripMenuItem, + this.schedulerToolStripMenuItem, + this.toolStripSeparator2, + this.selectLanguageToolStripMenuItem}); + this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem"; + this.toolsToolStripMenuItem.Size = new System.Drawing.Size(47, 20); + this.toolsToolStripMenuItem.Text = "Tools"; + // + // checkAllToolStripMenuItem + // + this.checkAllToolStripMenuItem.Name = "checkAllToolStripMenuItem"; + this.checkAllToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F5; + this.checkAllToolStripMenuItem.Size = new System.Drawing.Size(187, 22); + this.checkAllToolStripMenuItem.Text = "Check all"; + // + // catchupToolStripMenuItem + // + this.catchupToolStripMenuItem.Name = "catchupToolStripMenuItem"; + this.catchupToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F6; + this.catchupToolStripMenuItem.Size = new System.Drawing.Size(187, 22); + this.catchupToolStripMenuItem.Text = "Catch-up"; + // + // checkSelectedToolStripMenuItem + // + this.checkSelectedToolStripMenuItem.Enabled = false; + this.checkSelectedToolStripMenuItem.Name = "checkSelectedToolStripMenuItem"; + this.checkSelectedToolStripMenuItem.Size = new System.Drawing.Size(187, 22); + this.checkSelectedToolStripMenuItem.Text = "Check Selected"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(184, 6); + // + // addAFeedToolStripMenuItem + // + this.addAFeedToolStripMenuItem.Name = "addAFeedToolStripMenuItem"; + this.addAFeedToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); + this.addAFeedToolStripMenuItem.Size = new System.Drawing.Size(187, 22); + this.addAFeedToolStripMenuItem.Text = "Add a Feed..."; + // + // removeFeedToolStripMenuItem + // + this.removeFeedToolStripMenuItem.Enabled = false; + this.removeFeedToolStripMenuItem.Name = "removeFeedToolStripMenuItem"; + this.removeFeedToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D))); + this.removeFeedToolStripMenuItem.Size = new System.Drawing.Size(187, 22); + this.removeFeedToolStripMenuItem.Text = "Remove Feed"; + // + // feedPropertiesToolStripMenuItem + // + this.feedPropertiesToolStripMenuItem.Enabled = false; + this.feedPropertiesToolStripMenuItem.Name = "feedPropertiesToolStripMenuItem"; + this.feedPropertiesToolStripMenuItem.Size = new System.Drawing.Size(187, 22); + this.feedPropertiesToolStripMenuItem.Text = "Feed properties..."; + // + // schedulerToolStripMenuItem + // + this.schedulerToolStripMenuItem.Name = "schedulerToolStripMenuItem"; + this.schedulerToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.L))); + this.schedulerToolStripMenuItem.Size = new System.Drawing.Size(187, 22); + this.schedulerToolStripMenuItem.Text = "Scheduler..."; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(184, 6); + // + // selectLanguageToolStripMenuItem + // + this.selectLanguageToolStripMenuItem.Name = "selectLanguageToolStripMenuItem"; + this.selectLanguageToolStripMenuItem.Size = new System.Drawing.Size(187, 22); + this.selectLanguageToolStripMenuItem.Text = "Select language"; + // + // helpToolStripMenuItem + // + this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.checkForUpdateToolStripMenuItem, + this.reportAProblemToolStripMenuItem, + this.toolStripSeparator4, + this.aboutToolStripMenuItem}); + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.helpToolStripMenuItem.Text = "Help"; + // + // checkForUpdateToolStripMenuItem + // + this.checkForUpdateToolStripMenuItem.Name = "checkForUpdateToolStripMenuItem"; + this.checkForUpdateToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.checkForUpdateToolStripMenuItem.Text = "Check for Update...."; + this.checkForUpdateToolStripMenuItem.Click += new System.EventHandler(this.checkForUpdateToolStripMenuItem_Click); + // + // reportAProblemToolStripMenuItem + // + this.reportAProblemToolStripMenuItem.Name = "reportAProblemToolStripMenuItem"; + this.reportAProblemToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.reportAProblemToolStripMenuItem.Text = "Report a Problem"; + this.reportAProblemToolStripMenuItem.Click += new System.EventHandler(this.reportAProblemToolStripMenuItem_Click); + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(177, 6); + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.aboutToolStripMenuItem.Text = "About"; + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.downloadsPage); + this.tabControl1.Controls.Add(this.subscriptionsPage); + this.tabControl1.Controls.Add(this.cleanupPage); + this.tabControl1.Controls.Add(this.logPage); + this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl1.Location = new System.Drawing.Point(0, 24); + this.tabControl1.Margin = new System.Windows.Forms.Padding(2); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(808, 490); + this.tabControl1.TabIndex = 2; + // + // downloadsPage + // + this.downloadsPage.Controls.Add(this.tableLayoutPanel2); + this.downloadsPage.Controls.Add(this.statusStrip2); + this.downloadsPage.Location = new System.Drawing.Point(4, 22); + this.downloadsPage.Margin = new System.Windows.Forms.Padding(2); + this.downloadsPage.Name = "downloadsPage"; + this.downloadsPage.Padding = new System.Windows.Forms.Padding(2); + this.downloadsPage.Size = new System.Drawing.Size(800, 464); + this.downloadsPage.TabIndex = 0; + this.downloadsPage.Text = "Downloads"; + this.downloadsPage.UseVisualStyleBackColor = true; + // + // tableLayoutPanel2 + // + this.tableLayoutPanel2.ColumnCount = 2; + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.Controls.Add(this.tableLayoutPanel1, 0, 0); + this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Top; + this.tableLayoutPanel2.Location = new System.Drawing.Point(2, 2); + this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(2); + this.tableLayoutPanel2.Name = "tableLayoutPanel2"; + this.tableLayoutPanel2.RowCount = 1; + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.Size = new System.Drawing.Size(796, 41); + this.tableLayoutPanel2.TabIndex = 3; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.46008F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 66.53992F)); + this.tableLayoutPanel1.Controls.Add(this.panel1, 0, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Top; + this.tableLayoutPanel1.Location = new System.Drawing.Point(2, 2); + this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(2); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 1; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(394, 37); + this.tableLayoutPanel1.TabIndex = 2; + // + // panel1 + // + this.panel1.Controls.Add(this.removeSelectedButton); + this.panel1.Controls.Add(this.cancelSelectedButton); + this.panel1.Location = new System.Drawing.Point(2, 2); + this.panel1.Margin = new System.Windows.Forms.Padding(2); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(127, 32); + this.panel1.TabIndex = 4; + // + // removeSelectedButton + // + this.removeSelectedButton.Dock = System.Windows.Forms.DockStyle.Right; + this.removeSelectedButton.Location = new System.Drawing.Point(15, 0); + this.removeSelectedButton.Margin = new System.Windows.Forms.Padding(2); + this.removeSelectedButton.Name = "removeSelectedButton"; + this.removeSelectedButton.Size = new System.Drawing.Size(56, 32); + this.removeSelectedButton.TabIndex = 0; + this.removeSelectedButton.Text = "button1"; + this.removeSelectedButton.UseVisualStyleBackColor = true; + // + // cancelSelectedButton + // + this.cancelSelectedButton.Dock = System.Windows.Forms.DockStyle.Right; + this.cancelSelectedButton.Location = new System.Drawing.Point(71, 0); + this.cancelSelectedButton.Margin = new System.Windows.Forms.Padding(2); + this.cancelSelectedButton.Name = "cancelSelectedButton"; + this.cancelSelectedButton.Size = new System.Drawing.Size(56, 32); + this.cancelSelectedButton.TabIndex = 1; + this.cancelSelectedButton.Text = "button2"; + this.cancelSelectedButton.UseVisualStyleBackColor = true; + // + // statusStrip2 + // + this.statusStrip2.ImageScalingSize = new System.Drawing.Size(20, 20); + this.statusStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.liveDownloadCounter, + this.downloadSpeed}); + this.statusStrip2.Location = new System.Drawing.Point(2, 440); + this.statusStrip2.Name = "statusStrip2"; + this.statusStrip2.Padding = new System.Windows.Forms.Padding(1, 0, 10, 0); + this.statusStrip2.Size = new System.Drawing.Size(796, 22); + this.statusStrip2.SizingGrip = false; + this.statusStrip2.TabIndex = 1; + this.statusStrip2.Text = "statusStrip2"; + // + // liveDownloadCounter + // + this.liveDownloadCounter.Name = "liveDownloadCounter"; + this.liveDownloadCounter.Size = new System.Drawing.Size(101, 17); + this.liveDownloadCounter.Text = "Live downloads: 0"; + // + // downloadSpeed + // + this.downloadSpeed.Name = "downloadSpeed"; + this.downloadSpeed.Size = new System.Drawing.Size(139, 17); + this.downloadSpeed.Text = "Download speed: 0.0kB/s"; + // + // subscriptionsPage + // + this.subscriptionsPage.Controls.Add(dataGridView1); + this.subscriptionsPage.Controls.Add(this.tableLayoutPanel3); + this.subscriptionsPage.Location = new System.Drawing.Point(4, 22); + this.subscriptionsPage.Margin = new System.Windows.Forms.Padding(2); + this.subscriptionsPage.Name = "subscriptionsPage"; + this.subscriptionsPage.Padding = new System.Windows.Forms.Padding(2); + this.subscriptionsPage.Size = new System.Drawing.Size(800, 464); + this.subscriptionsPage.TabIndex = 1; + this.subscriptionsPage.Text = "Subscriptions"; + this.subscriptionsPage.UseVisualStyleBackColor = true; + // + // tableLayoutPanel3 + // + this.tableLayoutPanel3.AutoSize = true; + this.tableLayoutPanel3.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tableLayoutPanel3.ColumnCount = 10; + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel3.Controls.Add(this.checkNewButton, 1, 0); + this.tableLayoutPanel3.Controls.Add(this.cactchUpButton, 2, 0); + this.tableLayoutPanel3.Controls.Add(this.subscriptionSearchBox, 8, 0); + this.tableLayoutPanel3.Controls.Add(this.checkSelectedButton, 6, 0); + this.tableLayoutPanel3.Controls.Add(this.addNewFeed, 3, 0); + this.tableLayoutPanel3.Controls.Add(this.feedPropertiesButton, 5, 0); + this.tableLayoutPanel3.Controls.Add(this.removeFeedButton, 4, 0); + this.tableLayoutPanel3.Controls.Add(this.schedulerButton, 7, 0); + this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Top; + this.tableLayoutPanel3.Location = new System.Drawing.Point(2, 2); + this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(2); + this.tableLayoutPanel3.Name = "tableLayoutPanel3"; + this.tableLayoutPanel3.RowCount = 1; + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel3.Size = new System.Drawing.Size(796, 24); + this.tableLayoutPanel3.TabIndex = 1; + // + // checkNewButton + // + this.checkNewButton.Dock = System.Windows.Forms.DockStyle.Right; + this.checkNewButton.Location = new System.Drawing.Point(100, 2); + this.checkNewButton.Margin = new System.Windows.Forms.Padding(2); + this.checkNewButton.Name = "checkNewButton"; + this.checkNewButton.Size = new System.Drawing.Size(56, 20); + this.checkNewButton.TabIndex = 0; + this.checkNewButton.Text = "Check for new podcasts"; + this.checkNewButton.UseVisualStyleBackColor = true; + // + // cactchUpButton + // + this.cactchUpButton.Dock = System.Windows.Forms.DockStyle.Right; + this.cactchUpButton.Location = new System.Drawing.Point(179, 2); + this.cactchUpButton.Margin = new System.Windows.Forms.Padding(2); + this.cactchUpButton.Name = "cactchUpButton"; + this.cactchUpButton.Size = new System.Drawing.Size(56, 20); + this.cactchUpButton.TabIndex = 1; + this.cactchUpButton.Text = "Catch-up"; + this.cactchUpButton.UseVisualStyleBackColor = true; + // + // subscriptionSearchBox + // + this.subscriptionSearchBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom))); + this.subscriptionSearchBox.Location = new System.Drawing.Point(634, 2); + this.subscriptionSearchBox.Margin = new System.Windows.Forms.Padding(2); + this.subscriptionSearchBox.Name = "subscriptionSearchBox"; + this.subscriptionSearchBox.Size = new System.Drawing.Size(75, 20); + this.subscriptionSearchBox.TabIndex = 7; + // + // checkSelectedButton + // + this.checkSelectedButton.Dock = System.Windows.Forms.DockStyle.Right; + this.checkSelectedButton.Enabled = false; + this.checkSelectedButton.Location = new System.Drawing.Point(495, 2); + this.checkSelectedButton.Margin = new System.Windows.Forms.Padding(2); + this.checkSelectedButton.Name = "checkSelectedButton"; + this.checkSelectedButton.Size = new System.Drawing.Size(56, 20); + this.checkSelectedButton.TabIndex = 5; + this.checkSelectedButton.Text = "Check/Download Selected"; + this.checkSelectedButton.UseVisualStyleBackColor = true; + // + // addNewFeed + // + this.addNewFeed.Dock = System.Windows.Forms.DockStyle.Right; + this.addNewFeed.Location = new System.Drawing.Point(258, 2); + this.addNewFeed.Margin = new System.Windows.Forms.Padding(2); + this.addNewFeed.Name = "addNewFeed"; + this.addNewFeed.Size = new System.Drawing.Size(56, 20); + this.addNewFeed.TabIndex = 2; + this.addNewFeed.Text = "Add New Feed"; + this.addNewFeed.UseVisualStyleBackColor = true; + // + // feedPropertiesButton + // + this.feedPropertiesButton.Dock = System.Windows.Forms.DockStyle.Right; + this.feedPropertiesButton.Enabled = false; + this.feedPropertiesButton.Location = new System.Drawing.Point(416, 2); + this.feedPropertiesButton.Margin = new System.Windows.Forms.Padding(2); + this.feedPropertiesButton.Name = "feedPropertiesButton"; + this.feedPropertiesButton.Size = new System.Drawing.Size(56, 20); + this.feedPropertiesButton.TabIndex = 4; + this.feedPropertiesButton.Text = "Properties"; + this.feedPropertiesButton.UseVisualStyleBackColor = true; + // + // removeFeedButton + // + this.removeFeedButton.Dock = System.Windows.Forms.DockStyle.Right; + this.removeFeedButton.Enabled = false; + this.removeFeedButton.Location = new System.Drawing.Point(337, 2); + this.removeFeedButton.Margin = new System.Windows.Forms.Padding(2); + this.removeFeedButton.Name = "removeFeedButton"; + this.removeFeedButton.Size = new System.Drawing.Size(56, 20); + this.removeFeedButton.TabIndex = 3; + this.removeFeedButton.Text = "Remove selected Feed"; + this.removeFeedButton.UseVisualStyleBackColor = true; + // + // schedulerButton + // + this.schedulerButton.Dock = System.Windows.Forms.DockStyle.Right; + this.schedulerButton.Location = new System.Drawing.Point(574, 2); + this.schedulerButton.Margin = new System.Windows.Forms.Padding(2); + this.schedulerButton.Name = "schedulerButton"; + this.schedulerButton.Size = new System.Drawing.Size(56, 20); + this.schedulerButton.TabIndex = 6; + this.schedulerButton.Text = "Scheduler"; + this.schedulerButton.UseVisualStyleBackColor = true; + // + // cleanupPage + // + this.cleanupPage.Location = new System.Drawing.Point(4, 22); + this.cleanupPage.Margin = new System.Windows.Forms.Padding(2); + this.cleanupPage.Name = "cleanupPage"; + this.cleanupPage.Padding = new System.Windows.Forms.Padding(2); + this.cleanupPage.Size = new System.Drawing.Size(800, 464); + this.cleanupPage.TabIndex = 2; + this.cleanupPage.Text = "Cleanup"; + this.cleanupPage.UseVisualStyleBackColor = true; + // + // logPage + // + this.logPage.Controls.Add(this.logRTB); + this.logPage.Location = new System.Drawing.Point(4, 22); + this.logPage.Margin = new System.Windows.Forms.Padding(2); + this.logPage.Name = "logPage"; + this.logPage.Padding = new System.Windows.Forms.Padding(2); + this.logPage.Size = new System.Drawing.Size(800, 464); + this.logPage.TabIndex = 3; + this.logPage.Text = "Log"; + this.logPage.UseVisualStyleBackColor = true; + // + // logRTB + // + this.logRTB.Cursor = System.Windows.Forms.Cursors.Default; + this.logRTB.Dock = System.Windows.Forms.DockStyle.Fill; + this.logRTB.Location = new System.Drawing.Point(2, 2); + this.logRTB.Margin = new System.Windows.Forms.Padding(2); + this.logRTB.Name = "logRTB"; + this.logRTB.ReadOnly = true; + this.logRTB.Size = new System.Drawing.Size(796, 460); + this.logRTB.TabIndex = 0; + this.logRTB.Text = ""; + // + // statusStrip1 + // + this.statusStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); + this.statusStrip1.Location = new System.Drawing.Point(0, 514); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Padding = new System.Windows.Forms.Padding(1, 0, 10, 0); + this.statusStrip1.Size = new System.Drawing.Size(808, 22); + this.statusStrip1.TabIndex = 0; + this.statusStrip1.Text = "statusStrip1"; + // + // notificationIcon + // + this.notificationIcon.BalloonTipTitle = "Cordial"; + this.notificationIcon.ContextMenuStrip = this.notificationMenuStrip; + this.notificationIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notificationIcon.Icon"))); + this.notificationIcon.Text = "Cordial"; + this.notificationIcon.Visible = true; + this.notificationIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.notificationIcon_MouseDoubleClick); + // + // notificationMenuStrip + // + this.notificationMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.showWindowNotificationMenu, + this.runCheckNotificationMenu, + this.toolStripSeparator5, + this.quitNotificationMenu}); + this.notificationMenuStrip.Name = "notificationMenuStrip"; + this.notificationMenuStrip.Size = new System.Drawing.Size(181, 76); + // + // showWindowNotificationMenu + // + this.showWindowNotificationMenu.Name = "showWindowNotificationMenu"; + this.showWindowNotificationMenu.Size = new System.Drawing.Size(180, 22); + this.showWindowNotificationMenu.Text = "toolStripMenuItem1"; + // + // runCheckNotificationMenu + // + this.runCheckNotificationMenu.Name = "runCheckNotificationMenu"; + this.runCheckNotificationMenu.Size = new System.Drawing.Size(180, 22); + this.runCheckNotificationMenu.Text = "toolStripMenuItem2"; + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new System.Drawing.Size(177, 6); + // + // quitNotificationMenu + // + this.quitNotificationMenu.Name = "quitNotificationMenu"; + this.quitNotificationMenu.Size = new System.Drawing.Size(180, 22); + this.quitNotificationMenu.Text = "toolStripMenuItem3"; + // + // opmlFileOpen + // + this.opmlFileOpen.Filter = "OMPL files|*.opml"; + this.opmlFileOpen.Title = "Open File"; + // + // opmlFileSave + // + this.opmlFileSave.Filter = "OPML files|*.opml"; + this.opmlFileSave.Title = "Save to file"; + // + // nameDataGridViewTextBoxColumn + // + this.nameDataGridViewTextBoxColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.nameDataGridViewTextBoxColumn.DataPropertyName = "Name"; + this.nameDataGridViewTextBoxColumn.FillWeight = 60F; + this.nameDataGridViewTextBoxColumn.HeaderText = "Name"; + this.nameDataGridViewTextBoxColumn.MinimumWidth = 6; + this.nameDataGridViewTextBoxColumn.Name = "nameDataGridViewTextBoxColumn"; + this.nameDataGridViewTextBoxColumn.ReadOnly = true; + // + // statusDataGridViewTextBoxColumn + // + this.statusDataGridViewTextBoxColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.statusDataGridViewTextBoxColumn.DataPropertyName = "Status"; + this.statusDataGridViewTextBoxColumn.FillWeight = 30F; + this.statusDataGridViewTextBoxColumn.HeaderText = "Status"; + this.statusDataGridViewTextBoxColumn.MinimumWidth = 6; + this.statusDataGridViewTextBoxColumn.Name = "statusDataGridViewTextBoxColumn"; + this.statusDataGridViewTextBoxColumn.ReadOnly = true; + // + // mBDataGridViewTextBoxColumn + // + this.mBDataGridViewTextBoxColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.mBDataGridViewTextBoxColumn.DataPropertyName = "MB"; + this.mBDataGridViewTextBoxColumn.FillWeight = 20F; + this.mBDataGridViewTextBoxColumn.HeaderText = "MB"; + this.mBDataGridViewTextBoxColumn.MinimumWidth = 6; + this.mBDataGridViewTextBoxColumn.Name = "mBDataGridViewTextBoxColumn"; + this.mBDataGridViewTextBoxColumn.ReadOnly = true; + // + // locationDataGridViewTextBoxColumn + // + this.locationDataGridViewTextBoxColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.locationDataGridViewTextBoxColumn.DataPropertyName = "Location"; + this.locationDataGridViewTextBoxColumn.HeaderText = "Location"; + this.locationDataGridViewTextBoxColumn.MinimumWidth = 6; + this.locationDataGridViewTextBoxColumn.Name = "locationDataGridViewTextBoxColumn"; + this.locationDataGridViewTextBoxColumn.ReadOnly = true; + // + // podcastBindingSource + // + this.podcastBindingSource.DataSource = typeof(Cordial.Models.Podcast); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(808, 536); + this.Controls.Add(this.tabControl1); + this.Controls.Add(this.statusStrip1); + this.Controls.Add(this.fileMenuStrip); + this.MainMenuStrip = this.fileMenuStrip; + this.Margin = new System.Windows.Forms.Padding(2); + this.Name = "Form1"; + this.Text = "Form1"; + ((System.ComponentModel.ISupportInitialize)(dataGridView1)).EndInit(); + this.fileMenuStrip.ResumeLayout(false); + this.fileMenuStrip.PerformLayout(); + this.tabControl1.ResumeLayout(false); + this.downloadsPage.ResumeLayout(false); + this.downloadsPage.PerformLayout(); + this.tableLayoutPanel2.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.statusStrip2.ResumeLayout(false); + this.statusStrip2.PerformLayout(); + this.subscriptionsPage.ResumeLayout(false); + this.subscriptionsPage.PerformLayout(); + this.tableLayoutPanel3.ResumeLayout(false); + this.tableLayoutPanel3.PerformLayout(); + this.logPage.ResumeLayout(false); + this.notificationMenuStrip.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.podcastBindingSource)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MenuStrip fileMenuStrip; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage downloadsPage; + private System.Windows.Forms.TabPage subscriptionsPage; + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripMenuItem checkAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem catchupToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem checkSelectedToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem addAFeedToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeFeedToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem importFeedsFromOpmlToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exportFeedsAsOpmlToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem preferencesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem closeWindowToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem quitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem feedPropertiesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem schedulerToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem selectLanguageToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem checkForUpdateToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem reportAProblemToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; + private System.Windows.Forms.TabPage cleanupPage; + private System.Windows.Forms.TabPage logPage; + private System.Windows.Forms.RichTextBox logRTB; + private System.Windows.Forms.NotifyIcon notificationIcon; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Button removeSelectedButton; + private System.Windows.Forms.Button cancelSelectedButton; + private System.Windows.Forms.StatusStrip statusStrip2; + private System.Windows.Forms.ToolStripStatusLabel liveDownloadCounter; + private System.Windows.Forms.ToolStripStatusLabel downloadSpeed; + private System.Windows.Forms.OpenFileDialog opmlFileOpen; + private System.Windows.Forms.SaveFileDialog opmlFileSave; + private System.Windows.Forms.BindingSource podcastBindingSource; + private System.Windows.Forms.DataGridViewTextBoxColumn nameDataGridViewTextBoxColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn statusDataGridViewTextBoxColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn mBDataGridViewTextBoxColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn locationDataGridViewTextBoxColumn; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3; + private System.Windows.Forms.Button addNewFeed; + private System.Windows.Forms.Button removeFeedButton; + private System.Windows.Forms.Button feedPropertiesButton; + private System.Windows.Forms.Button checkSelectedButton; + private System.Windows.Forms.Button schedulerButton; + private System.Windows.Forms.TextBox subscriptionSearchBox; + private System.Windows.Forms.Button checkNewButton; + private System.Windows.Forms.Button cactchUpButton; + private System.Windows.Forms.ContextMenuStrip notificationMenuStrip; + private System.Windows.Forms.ToolStripMenuItem showWindowNotificationMenu; + private System.Windows.Forms.ToolStripMenuItem runCheckNotificationMenu; + private System.Windows.Forms.ToolStripMenuItem quitNotificationMenu; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripMenuItem closeNotificationTray; + } +} + diff --git a/src/Form1.cs b/src/Form1.cs new file mode 100644 index 0000000..ffbe630 --- /dev/null +++ b/src/Form1.cs @@ -0,0 +1,396 @@ +using Cordial.Globalization; +using Cordial.Models; +using Octokit; +using OPMLCore.NET; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Resources; +using System.Threading.Tasks; +using System.Windows.Forms; +using Configuration = Cordial.Models.Configuration; + +namespace Cordial +{ + public partial class Form1 : Form + { + List Feeds; + string downloadDestination; + List Subscriptions; + LocaleManager locale; + Configuration currentConfiguration; + GitHubClient githubClient; +#if PRERELEASE + bool isPreRelease = true; +#else + bool isPreRelease = false; +#endif + + public Form1() + { + if (!Directory.Exists(AppProps.DefaultPodcastDownloadDir)) + { + Directory.CreateDirectory(AppProps.DefaultPodcastDownloadDir); + } + + InitializeComponent(); + + Log.Configure(logRTB); + + currentConfiguration = Configuration.Load(); + + Feeds = currentConfiguration.Podcasts; + downloadDestination = currentConfiguration.Destination; + + currentConfiguration.Language = currentConfiguration.Language; + + locale = LocaleManager.InitialiseLocales(); + + foreach (var localeEntry in locale.Locales) + { + ToolStripMenuItem item = new ToolStripMenuItem(localeEntry.Value.GetString("human_name"), image: null, onClick: (e, sender) => + { + currentConfiguration.Language = localeEntry.Key; + + currentConfiguration.Save(); + + Log.Info($"Using \"{localeEntry.Value.GetString("human_name")}\" as current language"); + + UpdateLanguage(); + }) + { + Checked = true, + CheckState = currentConfiguration.Language == localeEntry.Key ? CheckState.Checked : CheckState.Unchecked, + }; + + selectLanguageToolStripMenuItem.DropDownItems.Add(item); + + if (currentConfiguration.Language == localeEntry.Key) + { + Log.Info($"Using \"{localeEntry.Value.GetString("human_name")}\" as current language"); + } + } + + showWindowNotificationMenu.Visible = false; + showWindowNotificationMenu.Click += ShowWindowNotificationMenu_Click; + closeNotificationTray.Click += CloseNotificationTray_Click; + closeNotificationTray.Checked = currentConfiguration.CloseNotifTray; + + UpdateLanguage(); + + UpdateSubscriptions(); + } + + private void ShowWindowNotificationMenu_Click(object sender, EventArgs e) + { + Visible = true; + showWindowNotificationMenu.Visible = false; + } + + void UpdateSubscriptions() + { + if (Subscriptions == null) + { + Subscriptions = new List(); + } + + Subscriptions.Clear(); + + foreach (var feed in Feeds) + { + ulong mb = 0; + string podcastPath = Path.Combine(downloadDestination, feed.Name); + if (Directory.Exists(podcastPath)) + { + mb = (ulong)new DirectoryInfo(podcastPath).GetFiles().Sum(z => z.Length) / 1000000; + } + + Subscriptions.Add(new Podcast + { + Name = feed.Name, + Status = PodcastStatus.NewlySubscribed, + MB = mb, + Location = feed.URL.OriginalString + }); + } + + podcastBindingSource.DataSource = Subscriptions; + } + + string GetLanguageString(string key, ResourceManager targetResource, ResourceManager defaultResource = null) + { + var value = key; + + if (locale != null) + { + if (defaultResource == null) + { + defaultResource = locale.GetDefaultLocale(); + } + + value = targetResource.GetString(key); + + if (string.IsNullOrEmpty(value)) + { + value = defaultResource.GetString(key); + + if (string.IsNullOrEmpty(value)) + { + value = key; + } + } + } + + return value; + } + + void UpdateLanguage() + { + var currentLocale = locale != null ? locale.GetLocale(currentConfiguration.Language) : null; + var defaultLocale = locale != null ? locale.GetDefaultLocale() : null; + + foreach (var item in selectLanguageToolStripMenuItem.DropDownItems) + { + if (item is ToolStripMenuItem tsmi) + { + if (tsmi.Text == currentLocale.GetString("human_name")) + { + tsmi.CheckState = CheckState.Checked; + } + else + { + tsmi.CheckState = CheckState.Unchecked; + } + } + } + + //statustray + liveDownloadCounter.Text = GetLanguageString("generic_livedownloads", currentLocale, defaultLocale).Replace("{0}", "0"); + downloadSpeed.Text = GetLanguageString("generic_downloadspeed", currentLocale, defaultLocale).Replace("{0}", "0"); + + //toolstrip + fileToolStripMenuItem.Text = GetLanguageString("generic_file", currentLocale, defaultLocale); + editToolStripMenuItem.Text = GetLanguageString("generic_edit", currentLocale, defaultLocale); + viewToolStripMenuItem.Text = GetLanguageString("generic_view", currentLocale, defaultLocale); + toolsToolStripMenuItem.Text = GetLanguageString("generic_tools", currentLocale, defaultLocale); + helpToolStripMenuItem.Text = GetLanguageString("generic_help", currentLocale, defaultLocale); + + //pages + downloadsPage.Text = GetLanguageString("generic_downloads", currentLocale, defaultLocale); + subscriptionsPage.Text = GetLanguageString("generic_subscriptions", currentLocale, defaultLocale); + cleanupPage.Text = GetLanguageString("generic_cleanup", currentLocale, defaultLocale); + logPage.Text = GetLanguageString("generic_log", currentLocale, defaultLocale); + + //file + importFeedsFromOpmlToolStripMenuItem.Text = GetLanguageString("file_importopml", currentLocale, defaultLocale); + exportFeedsAsOpmlToolStripMenuItem.Text = GetLanguageString("file_exportopml", currentLocale, defaultLocale); + preferencesToolStripMenuItem.Text = GetLanguageString("file_preferences", currentLocale, defaultLocale); + closeWindowToolStripMenuItem.Text = GetLanguageString("file_close", currentLocale, defaultLocale); + closeNotificationTray.Text = GetLanguageString("file_closetotray", currentLocale, defaultLocale); + quitToolStripMenuItem.Text = GetLanguageString("file_quit", currentLocale, defaultLocale); + + //edit + selectAllToolStripMenuItem.Text = GetLanguageString("edit_selectall", currentLocale, defaultLocale); + + //view + + + //tools + checkAllToolStripMenuItem.Text = GetLanguageString("tools_checkall", currentLocale, defaultLocale); + catchupToolStripMenuItem.Text = GetLanguageString("tools_catchup", currentLocale, defaultLocale); + checkSelectedToolStripMenuItem.Text = GetLanguageString("tools_checkselected", currentLocale, defaultLocale); + addAFeedToolStripMenuItem.Text = GetLanguageString("tools_addfeed", currentLocale, defaultLocale); + removeFeedToolStripMenuItem.Text = GetLanguageString("tools_removefeed", currentLocale, defaultLocale); + feedPropertiesToolStripMenuItem.Text = GetLanguageString("tools_feedprops", currentLocale, defaultLocale); + schedulerToolStripMenuItem.Text = GetLanguageString("tools_scheduler", currentLocale, defaultLocale); + selectLanguageToolStripMenuItem.Text = GetLanguageString("tools_selectlang", currentLocale, defaultLocale); + + //help + checkForUpdateToolStripMenuItem.Text = GetLanguageString("help_checkupdates", currentLocale, defaultLocale); + reportAProblemToolStripMenuItem.Text = GetLanguageString("help_reportproblem", currentLocale, defaultLocale); + aboutToolStripMenuItem.Text = string.Format(GetLanguageString("help_about", currentLocale, defaultLocale), AppProps.AppName); + + //notification context menu + showWindowNotificationMenu.Text = GetLanguageString("file_showwindow", currentLocale, defaultLocale); + runCheckNotificationMenu.Text = GetLanguageString("generic_runcheck", currentLocale, defaultLocale); + quitNotificationMenu.Text = quitToolStripMenuItem.Text; + } + + bool closeOverride = false; + private void quitToolStripMenuItem_Click(object sender, EventArgs e) + { + closeOverride = true; + this.Close(); + } + + protected override void OnClosing(CancelEventArgs e) + { + if (closeNotificationTray.CheckState == CheckState.Checked && !closeOverride) + { + Visible = false; + showWindowNotificationMenu.Visible = true; + } + else + { + base.OnClosing(e); + } + } + + protected override void OnClosed(EventArgs e) + { + if (closeNotificationTray.CheckState == CheckState.Checked && !closeOverride) + { + + } + else + { + base.OnClosed(e); + } + } + + private void importFeedsFromOpmlToolStripMenuItem_Click(object sender, EventArgs e) + { + if (opmlFileOpen.ShowDialog() == DialogResult.OK) + { + if (opmlFileOpen.Multiselect) + { + foreach (var filePath in opmlFileOpen.FileNames) + { + ImportOPML(filePath); + } + } + else + { + ImportOPML(opmlFileOpen.FileName); + } + } + } + + private void exportFeedsAsOpmlToolStripMenuItem_Click(object sender, EventArgs e) + { + opmlFileSave.ShowDialog(); + } + + void ImportOPML(string filePath) + { + Opml opmldoc = new Opml(filePath); + + Log.Info($"Opened: {filePath}"); + + foreach (var rssOutline in opmldoc.Body.Outlines[0].Outlines) + { + Feeds.Add(new RSSFeed(rssOutline.Title, rssOutline.XMLUrl)); + + Log.Info($"Added: {rssOutline.Title}"); + } + + Configuration.Save(Configuration.GenerateConfiguration(downloadDestination, Feeds)); + + UpdateSubscriptions(); + } + + private void notificationIcon_MouseDoubleClick(object sender, MouseEventArgs e) + { + Visible = true; + showWindowNotificationMenu.Visible = false; + } + + private void closeWindowToolStripMenuItem_Click(object sender, EventArgs e) + { + if (closeNotificationTray.CheckState == CheckState.Checked && !closeOverride) + { + Visible = false; + showWindowNotificationMenu.Visible = true; + } + else + { + this.Close(); + } + } + + private void CloseNotificationTray_Click(object sender, EventArgs e) + { + if (sender is ToolStripMenuItem tsmi) + { + tsmi.Checked = currentConfiguration.CloseNotifTray = !currentConfiguration.CloseNotifTray; + currentConfiguration.Save(); + } + } + + private void reportAProblemToolStripMenuItem_Click(object sender, EventArgs e) + { + System.Diagnostics.Process.Start(Path.Combine(AppProps.RepoUrl, "issues", "new", "choose")); + } + + private void checkForUpdateToolStripMenuItem_Click(object sender, EventArgs e) + { + if (githubClient == null) + { + githubClient = new GitHubClient(new ProductHeaderValue(AppProps.AppName, Assembly.GetExecutingAssembly().GetName().Version.ToString())); + } + + Task.Run(async () => + { +#if DEBUG + var releases = await githubClient.Repository.Release.GetAll("xercsis", $"Cordial-Test"); +#else + var releases = await githubClient.Repository.Release.GetAll(AppProps.CreatorName, AppProps.AppName); +#endif + + if (releases.Any()) + { + var assName = Assembly.GetExecutingAssembly().GetName(); + + Release latestRelease = null; + + if (isPreRelease) + { + latestRelease = releases.FirstOrDefault(rel => rel.Prerelease); + } + else + { + latestRelease = releases.FirstOrDefault(rel => !rel.Prerelease); + } + + if (latestRelease != null) + { + var tagVersion = new Version(latestRelease.TagName); + + if (tagVersion > assName.Version) + { + showUpdateBox(); + } + } + } + }); + } + + [STAThread] + void showUpdateBox() + { + var currentLocale = locale != null ? locale.GetLocale(currentConfiguration.Language) : null; + var defaultLocale = locale != null ? locale.GetDefaultLocale() : null; + + MessageBoxManager.Yes = GetLanguageString("generic_yes", currentLocale, defaultLocale); + MessageBoxManager.No = GetLanguageString("generic_no", currentLocale, defaultLocale); + + MessageBoxManager.Register(); + + var dialogueResult = MessageBox.Show( + GetLanguageString("update_maintext", currentLocale, defaultLocale), + GetLanguageString("update_caption", currentLocale, defaultLocale), + MessageBoxButtons.YesNo + ); + + MessageBoxManager.Unregister(); + + if (dialogueResult == DialogResult.Yes) + { + + } + } + } +} diff --git a/src/Form1.resx b/src/Form1.resx new file mode 100644 index 0000000..ce5bb26 --- /dev/null +++ b/src/Form1.resx @@ -0,0 +1,728 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + 1319, 17 + + + 17, 17 + + + 722, 17 + + + 287, 17 + + + 424, 17 + + + 1346, 17 + + + + + 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 + AABJRU5ErkJggg== + + + + 859, 17 + + + 1026, 17 + + \ No newline at end of file diff --git a/src/LocaleManager.cs b/src/LocaleManager.cs new file mode 100644 index 0000000..af1dad7 --- /dev/null +++ b/src/LocaleManager.cs @@ -0,0 +1,82 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Resources; +using System.Runtime.Serialization; +using System.Text.RegularExpressions; +using System.Windows.Forms; + +namespace Cordial.Globalization +{ + public class LocaleManager + { + private static Dictionary locales = new Dictionary(); + private static Dictionary localehumannames = new Dictionary(); + public Dictionary Locales { get => locales; } + public Dictionary LocaleHumanNames { get => localehumannames; } + public const string DefaultLocale = "en-gb"; + + public ResourceManager GetDefaultLocale() + { + if (locales.TryGetValue(DefaultLocale, out var resMan)) + { + return resMan; + } + + throw new System.NullReferenceException("Couldn't get default locale, is it registered?"); + } + + public static LocaleManager InitialiseLocales() + { + LocaleManager localeinstance = new LocaleManager(); + + if (!locales.Any()) + { + string[] list = Directory.GetFiles(Path.Combine(Application.StartupPath, "Resources", "Languages"), "*.resx"); + + Assembly currentAssembly = Assembly.GetExecutingAssembly(); + + foreach (string str in list) + { + Regex regex = new Regex("[a-zA-Z-]*.resx"); + + string language = regex.Match(str).ToString().Replace(".resx", string.Empty); + + if (string.IsNullOrEmpty(language)) continue; + + if (!locales.ContainsKey(language)) + { + var niceKey = language.Replace("-", "_"); + + var languageClass = currentAssembly.GetType($"Cordial.Resources.Languages.{niceKey}"); + + var instance = FormatterServices.GetUninitializedObject(languageClass.GetType()); + + var resProp = languageClass.GetRuntimeProperties().FirstOrDefault(x => x.Name == "ResourceManager"); + + var resMan = resProp.GetValue(instance) as ResourceManager; + + locales.Add(language, resMan); + localehumannames.Add(resMan.GetString("human_name"), language); + + Log.Info($"Registered \"{resMan.GetString("human_name")}\" into locale database"); + } + } + + Log.Info($"Registered: {locales.Count}/{list.Length} languages into locale database"); + } + + return localeinstance; + } + + public ResourceManager GetLocale(string id) + { + var locale = locales.FirstOrDefault(x => x.Key == id); + if (locale.Value != null) + return locale.Value; + else + return null; + } + } +} \ No newline at end of file diff --git a/src/Log.cs b/src/Log.cs new file mode 100644 index 0000000..2d5d265 --- /dev/null +++ b/src/Log.cs @@ -0,0 +1,108 @@ +using System; +using System.Globalization; +using System.IO; +using System.Windows.Forms; + +namespace Cordial +{ + public static class Log + { + readonly static string CurrentLogFileName = + DateTime.UtcNow.ToString( + "yyyy-MM-dd", + CultureInfo.InvariantCulture + ) + ".log"; + + static RichTextBox RichTextBox; + static StreamWriter LogFile; + + public static void Configure(RichTextBox rtb) + { + RichTextBox = rtb; + + if (!Directory.Exists(AppProps.BaseDirectory)) + { + Directory.CreateDirectory(AppProps.BaseDirectory); + } + + if (!Directory.Exists(AppProps.LogDirectory)) + { + Directory.CreateDirectory(AppProps.LogDirectory); + } + + LogFile = new StreamWriter( + File.Open( + Path.Combine(AppProps.LogDirectory, CurrentLogFileName), + FileMode.Append, + FileAccess.Write, + FileShare.Read + ) + ) + { + AutoFlush = true, + NewLine = Environment.NewLine + }; + } + + public static void Info(string message) + { + var log = GetMessage("INF", message, null); + + if (RichTextBox != null) + { + RichTextBox.AppendText(log); + RichTextBox.AppendText(Environment.NewLine); + } + if (LogFile != null) + { + LogFile.WriteLine(log); + } + + Console.WriteLine(log); + } + public static void Warning(string message, Exception exception) + { + var log = GetMessage("WAR", message, exception); + + if (RichTextBox != null) + { + RichTextBox.AppendText(log); + RichTextBox.AppendText(Environment.NewLine); + } + if (LogFile != null) + { + LogFile.WriteLine(log); + } + + Console.WriteLine(log); + } + public static void Error(string message, Exception exception) + { + var log = GetMessage("ERR", message, exception); + + if (RichTextBox != null) + { + RichTextBox.AppendText(log); + RichTextBox.AppendText(Environment.NewLine); + } + if (LogFile != null) + { + LogFile.WriteLine(log); + } + + Console.WriteLine(log); + } + + static string GetMessage(string level, string message, Exception exception) + { + string logContent = $"[{DateTime.Now:yyyy/MM/dd HH:mm:ss}] [{level}] {message}"; + + if (exception != null) + { + logContent += $"\n{exception}"; + } + + return logContent; + } + } +} diff --git a/src/Models/Configuration.cs b/src/Models/Configuration.cs new file mode 100644 index 0000000..edb8e01 --- /dev/null +++ b/src/Models/Configuration.cs @@ -0,0 +1,81 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.Json; + +namespace Cordial.Models +{ + public class Configuration + { + public string Language { get; set; } = "en-gb"; + public bool CloseNotifTray { get; set; } = false; + public string Destination { get; set; } = AppProps.DefaultPodcastDownloadDir; + public List Podcasts { get; set; } = new List(); + + public static Configuration GenerateConfiguration(string dest, IEnumerable podcasts) + => new Configuration + { + Destination = dest, + Podcasts = podcasts.ToList() + }; + + public static Configuration Default + => new Configuration(); + + public void Save() + => Save(this); + + public static string Save(Configuration configuration, string location = null) + { + if (string.IsNullOrEmpty(location)) + { + if (!Directory.Exists(AppProps.ConfigurationDirectory)) + { + Directory.CreateDirectory(AppProps.ConfigurationDirectory); + } + + location = Path.Combine(AppProps.ConfigurationDirectory, "default.json"); + } + + File.WriteAllText(location, JsonSerializer.Serialize(configuration, new JsonSerializerOptions + { + WriteIndented = true + })); + + Log.Info($"Written configuration to: {location}"); + + return location; + } + + public static Configuration Load(string location = null) + { + if (string.IsNullOrEmpty(location)) + { + if (!Directory.Exists(AppProps.ConfigurationDirectory)) + { + Directory.CreateDirectory(AppProps.ConfigurationDirectory); + } + + if (!File.Exists(Path.Combine(AppProps.ConfigurationDirectory, "default.json"))) + { + location = Save(Default); + } + else + { + location = Path.Combine(AppProps.ConfigurationDirectory, "default.json"); + } + } + + var data = File.ReadAllText(location); + + var config = JsonSerializer.Deserialize(data, new JsonSerializerOptions + { + WriteIndented = true + }); + + Log.Info($"Loaded configuration from: {location}"); + + return config; + } + } +} diff --git a/src/Models/GithubStruct.cs b/src/Models/GithubStruct.cs new file mode 100644 index 0000000..fff2fa9 --- /dev/null +++ b/src/Models/GithubStruct.cs @@ -0,0 +1,21 @@ +using System; + +namespace Cordial.Models +{ + public class GithubStruct + { + public string Author { get; internal set; } + public Uri RepoUrl { get; internal set; } + + public GithubStruct(string author, Uri repo) + { + Author = author; + RepoUrl = repo; + } + + public GithubStruct(string author, string repo) : this(author, new Uri(repo)) + { + + } + } +} diff --git a/src/Models/Podcast.cs b/src/Models/Podcast.cs new file mode 100644 index 0000000..169535e --- /dev/null +++ b/src/Models/Podcast.cs @@ -0,0 +1,10 @@ +namespace Cordial.Models +{ + public class Podcast + { + public string Name { get; set; } + public PodcastStatus Status { get; set; } + public ulong MB { get; set; } + public string Location { get; set; } + } +} diff --git a/src/Models/PodcastStatus.cs b/src/Models/PodcastStatus.cs new file mode 100644 index 0000000..d94faa8 --- /dev/null +++ b/src/Models/PodcastStatus.cs @@ -0,0 +1,10 @@ +namespace Cordial.Models +{ + public enum PodcastStatus + { + NewlySubscribed = 0, + Subscribed = 1, + Downloading = 2, + Syncing = 3 + } +} diff --git a/src/Models/RSSFeed.cs b/src/Models/RSSFeed.cs new file mode 100644 index 0000000..c36da88 --- /dev/null +++ b/src/Models/RSSFeed.cs @@ -0,0 +1,20 @@ +using System; + +namespace Cordial.Models +{ + public class RSSFeed + { + public string Name { get; set; } + public Uri URL { get; set; } + + public RSSFeed() { } + + public RSSFeed(string name, Uri url) + { + Name = name; + URL = url; + } + + public RSSFeed(string name, string url) : this(name, new Uri(url)) { } + } +} diff --git a/src/Program.cs b/src/Program.cs new file mode 100644 index 0000000..01fb7f1 --- /dev/null +++ b/src/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Cordial +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} diff --git a/src/Properties/AssemblyInfo.cs b/src/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..20cf63f --- /dev/null +++ b/src/Properties/AssemblyInfo.cs @@ -0,0 +1,38 @@ +using System.Resources; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Cordial")] +[assembly: AssemblyDescription("A podcast aggregator")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("exsersewo")] +[assembly: AssemblyProduct("Cordial")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7385fd85-ee39-4db2-9853-7ad2736fab18")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("0.1.0.0")] +[assembly: AssemblyFileVersion("0.1.0.0")] +[assembly: NeutralResourcesLanguage("en-GB")] diff --git a/src/Properties/DataSources/Podcast.datasource b/src/Properties/DataSources/Podcast.datasource new file mode 100644 index 0000000..b780099 --- /dev/null +++ b/src/Properties/DataSources/Podcast.datasource @@ -0,0 +1,93 @@ + + + + + + System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cordial.Podcast, Cordial, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Properties/Resources.Designer.cs b/src/Properties/Resources.Designer.cs new file mode 100644 index 0000000..00e2861 --- /dev/null +++ b/src/Properties/Resources.Designer.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + + +namespace Cordial.Properties +{ + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Cordial.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/src/Properties/Resources.resx b/src/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/src/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/Properties/Settings.Designer.cs b/src/Properties/Settings.Designer.cs new file mode 100644 index 0000000..e7cdfb3 --- /dev/null +++ b/src/Properties/Settings.Designer.cs @@ -0,0 +1,29 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + + +namespace Cordial.Properties +{ + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/src/Properties/Settings.settings b/src/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/src/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/Resources/Icon/lime.ico b/src/Resources/Icon/lime.ico new file mode 100644 index 0000000..ab357a7 Binary files /dev/null and b/src/Resources/Icon/lime.ico differ diff --git a/src/Resources/Languages/en-gb.Designer.cs b/src/Resources/Languages/en-gb.Designer.cs new file mode 100644 index 0000000..9a45b93 --- /dev/null +++ b/src/Resources/Languages/en-gb.Designer.cs @@ -0,0 +1,405 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Cordial.Resources.Languages { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class en_gb { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal en_gb() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Cordial.Resources.Languages.en-gb", typeof(en_gb).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Select All. + /// + internal static string edit_selectall { + get { + return ResourceManager.GetString("edit_selectall", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close Window. + /// + internal static string file_close { + get { + return ResourceManager.GetString("file_close", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close to Notification Tray. + /// + internal static string file_closetotray { + get { + return ResourceManager.GetString("file_closetotray", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Export feeds as ompl. + /// + internal static string file_exportopml { + get { + return ResourceManager.GetString("file_exportopml", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Import feeds from opml.... + /// + internal static string file_importopml { + get { + return ResourceManager.GetString("file_importopml", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Preferences.... + /// + internal static string file_preferences { + get { + return ResourceManager.GetString("file_preferences", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Quit. + /// + internal static string file_quit { + get { + return ResourceManager.GetString("file_quit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Window. + /// + internal static string file_showwindow { + get { + return ResourceManager.GetString("file_showwindow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cleanup. + /// + internal static string generic_cleanup { + get { + return ResourceManager.GetString("generic_cleanup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Download. + /// + internal static string generic_download { + get { + return ResourceManager.GetString("generic_download", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Downloads. + /// + internal static string generic_downloads { + get { + return ResourceManager.GetString("generic_downloads", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Download speed: {0}kB/s. + /// + internal static string generic_downloadspeed { + get { + return ResourceManager.GetString("generic_downloadspeed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit. + /// + internal static string generic_edit { + get { + return ResourceManager.GetString("generic_edit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to File. + /// + internal static string generic_file { + get { + return ResourceManager.GetString("generic_file", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Help. + /// + internal static string generic_help { + get { + return ResourceManager.GetString("generic_help", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Live Downloads: {0}. + /// + internal static string generic_livedownloads { + get { + return ResourceManager.GetString("generic_livedownloads", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Log. + /// + internal static string generic_log { + get { + return ResourceManager.GetString("generic_log", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No. + /// + internal static string generic_no { + get { + return ResourceManager.GetString("generic_no", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Run Check. + /// + internal static string generic_runcheck { + get { + return ResourceManager.GetString("generic_runcheck", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Subscribe. + /// + internal static string generic_subscribe { + get { + return ResourceManager.GetString("generic_subscribe", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Subscriptions. + /// + internal static string generic_subscriptions { + get { + return ResourceManager.GetString("generic_subscriptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tools. + /// + internal static string generic_tools { + get { + return ResourceManager.GetString("generic_tools", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to View. + /// + internal static string generic_view { + get { + return ResourceManager.GetString("generic_view", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Yes. + /// + internal static string generic_yes { + get { + return ResourceManager.GetString("generic_yes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to About. + /// + internal static string help_about { + get { + return ResourceManager.GetString("help_about", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Check for updates.... + /// + internal static string help_checkupdates { + get { + return ResourceManager.GetString("help_checkupdates", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Report a problem. + /// + internal static string help_reportproblem { + get { + return ResourceManager.GetString("help_reportproblem", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to English (Great Britain). + /// + internal static string human_name { + get { + return ResourceManager.GetString("human_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add Feed. + /// + internal static string tools_addfeed { + get { + return ResourceManager.GetString("tools_addfeed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Catch-up. + /// + internal static string tools_catchup { + get { + return ResourceManager.GetString("tools_catchup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Check All. + /// + internal static string tools_checkall { + get { + return ResourceManager.GetString("tools_checkall", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Check Selected. + /// + internal static string tools_checkselected { + get { + return ResourceManager.GetString("tools_checkselected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Feed Properties. + /// + internal static string tools_feedprops { + get { + return ResourceManager.GetString("tools_feedprops", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove Feed. + /// + internal static string tools_removefeed { + get { + return ResourceManager.GetString("tools_removefeed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scheduler. + /// + internal static string tools_scheduler { + get { + return ResourceManager.GetString("tools_scheduler", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select Language. + /// + internal static string tools_selectlang { + get { + return ResourceManager.GetString("tools_selectlang", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An update is available. + /// + internal static string update_caption { + get { + return ResourceManager.GetString("update_caption", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There's a new version available, do you wish to update?. + /// + internal static string update_maintext { + get { + return ResourceManager.GetString("update_maintext", resourceCulture); + } + } + } +} diff --git a/src/Resources/Languages/en-gb.resx b/src/Resources/Languages/en-gb.resx new file mode 100644 index 0000000..ec071fb --- /dev/null +++ b/src/Resources/Languages/en-gb.resx @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + English (Great Britain) + + + Cleanup + + + Download + + + Downloads + + + Edit + + + File + + + Help + + + Log + + + Subscribe + + + Subscriptions + + + Tools + + + View + + + Select All + + + Close Window + + + Export feeds as ompl + + + Import feeds from opml... + + + Preferences... + + + Quit + + + Download speed: {0}kB/s + + + Live Downloads: {0} + + + About + + + Check for updates... + + + Report a problem + + + Add Feed + + + Catch-up + + + Check All + + + Check Selected + + + Feed Properties + + + Remove Feed + + + Scheduler + + + Select Language + + + Show Window + + + Run Check + + + Close to Notification Tray + + + No + + + Yes + + + An update is available + + + There's a new version available, do you wish to update? + + \ No newline at end of file diff --git a/src/Resources/Languages/nl-nl.Designer.cs b/src/Resources/Languages/nl-nl.Designer.cs new file mode 100644 index 0000000..6301c4b --- /dev/null +++ b/src/Resources/Languages/nl-nl.Designer.cs @@ -0,0 +1,396 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Cordial.Resources.Languages { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class nl_nl { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal nl_nl() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Cordial.Resources.Languages.nl-nl", typeof(nl_nl).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Selecteer alles. + /// + internal static string edit_selectall { + get { + return ResourceManager.GetString("edit_selectall", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Venster sluiten. + /// + internal static string file_close { + get { + return ResourceManager.GetString("file_close", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sluit naar systeemvak. + /// + internal static string file_closetotray { + get { + return ResourceManager.GetString("file_closetotray", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exporteer feeds naar OPML. + /// + internal static string file_exportopml { + get { + return ResourceManager.GetString("file_exportopml", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Importeer feeds uit OPML. + /// + internal static string file_importopml { + get { + return ResourceManager.GetString("file_importopml", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Voorkeuren. + /// + internal static string file_preferences { + get { + return ResourceManager.GetString("file_preferences", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Afsluiten. + /// + internal static string file_quit { + get { + return ResourceManager.GetString("file_quit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Toon venster. + /// + internal static string file_showwindow { + get { + return ResourceManager.GetString("file_showwindow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Schoonmaken. + /// + internal static string generic_cleanup { + get { + return ResourceManager.GetString("generic_cleanup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Downloaden. + /// + internal static string generic_download { + get { + return ResourceManager.GetString("generic_download", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Download snelheid: {0}kB/s. + /// + internal static string generic_downloadspeed { + get { + return ResourceManager.GetString("generic_downloadspeed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bewerken. + /// + internal static string generic_edit { + get { + return ResourceManager.GetString("generic_edit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bestand. + /// + internal static string generic_file { + get { + return ResourceManager.GetString("generic_file", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Help. + /// + internal static string generic_help { + get { + return ResourceManager.GetString("generic_help", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Live Downloads: {0}. + /// + internal static string generic_livedownloads { + get { + return ResourceManager.GetString("generic_livedownloads", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logboek. + /// + internal static string generic_log { + get { + return ResourceManager.GetString("generic_log", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nee. + /// + internal static string generic_no { + get { + return ResourceManager.GetString("generic_no", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Voer Check uit. + /// + internal static string generic_runcheck { + get { + return ResourceManager.GetString("generic_runcheck", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Abonneren. + /// + internal static string generic_subscribe { + get { + return ResourceManager.GetString("generic_subscribe", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Abonnementen. + /// + internal static string generic_subscriptions { + get { + return ResourceManager.GetString("generic_subscriptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Gereedschap. + /// + internal static string generic_tools { + get { + return ResourceManager.GetString("generic_tools", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Beeld. + /// + internal static string generic_view { + get { + return ResourceManager.GetString("generic_view", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ja. + /// + internal static string generic_yes { + get { + return ResourceManager.GetString("generic_yes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Over {0}. + /// + internal static string help_about { + get { + return ResourceManager.GetString("help_about", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controleer op updates. + /// + internal static string help_checkupdates { + get { + return ResourceManager.GetString("help_checkupdates", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Meld een probleem. + /// + internal static string help_reportproblem { + get { + return ResourceManager.GetString("help_reportproblem", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dutch (Nederlands). + /// + internal static string human_name { + get { + return ResourceManager.GetString("human_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Feed toevoegen. + /// + internal static string tools_addfeed { + get { + return ResourceManager.GetString("tools_addfeed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Binnenhalen. + /// + internal static string tools_catchup { + get { + return ResourceManager.GetString("tools_catchup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controleer alles. + /// + internal static string tools_checkall { + get { + return ResourceManager.GetString("tools_checkall", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Selectievakje geselecteerd. + /// + internal static string tools_checkselected { + get { + return ResourceManager.GetString("tools_checkselected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Feed eigenschappen. + /// + internal static string tools_feedprops { + get { + return ResourceManager.GetString("tools_feedprops", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Feed verwijderen. + /// + internal static string tools_removefeed { + get { + return ResourceManager.GetString("tools_removefeed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rooster. + /// + internal static string tools_scheduler { + get { + return ResourceManager.GetString("tools_scheduler", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Selecteer taal. + /// + internal static string tools_selectlang { + get { + return ResourceManager.GetString("tools_selectlang", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Er is een update beschikbaar.. + /// + internal static string update_caption { + get { + return ResourceManager.GetString("update_caption", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Er is een nieuwe versie beschikbaar, wilt u updaten?. + /// + internal static string update_maintext { + get { + return ResourceManager.GetString("update_maintext", resourceCulture); + } + } + } +} diff --git a/src/Resources/Languages/nl-nl.resx b/src/Resources/Languages/nl-nl.resx new file mode 100644 index 0000000..f417061 --- /dev/null +++ b/src/Resources/Languages/nl-nl.resx @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Dutch (Nederlands) + + + Schoonmaken + + + Downloaden + + + Bewerken + + + Bestand + + + Help + + + Logboek + + + Abonneren + + + Abonnementen + + + Gereedschap + + + Beeld + + + Nee + + + Ja + + + Er is een update beschikbaar. + + + Er is een nieuwe versie beschikbaar, wilt u updaten? + + + Selecteer alles + + + Venster sluiten + + + Sluit naar systeemvak + + + Exporteer feeds naar OPML + + + Importeer feeds uit OPML + + + Voorkeuren + + + Afsluiten + + + Toon venster + + + Download snelheid: {0}kB/s + + + Live Downloads: {0} + + + Voer Check uit + + + Over {0} + + + Controleer op updates + + + Meld een probleem + + + Feed toevoegen + + + Binnenhalen + + + Controleer alles + + + Selectievakje geselecteerd + + + Feed eigenschappen + + + Feed verwijderen + + + Rooster + + + Selecteer taal + + \ No newline at end of file diff --git a/src/packages.config b/src/packages.config new file mode 100644 index 0000000..15d0373 --- /dev/null +++ b/src/packages.config @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/submodules/OPMLCore.NET b/submodules/OPMLCore.NET new file mode 160000 index 0000000..8d37cd0 --- /dev/null +++ b/submodules/OPMLCore.NET @@ -0,0 +1 @@ +Subproject commit 8d37cd062b3180fdcc3c92155f516335c5e68740