diff --git a/src/Greenshot/Components/UpdateService.cs b/src/Greenshot/Components/UpdateService.cs index 7055a1e72..c8e73dfe2 100644 --- a/src/Greenshot/Components/UpdateService.cs +++ b/src/Greenshot/Components/UpdateService.cs @@ -24,6 +24,7 @@ #region Usings using System; +using System.Diagnostics; using System.Linq; using System.ServiceModel.Syndication; using System.Text.RegularExpressions; @@ -42,39 +43,39 @@ using Greenshot.Ui.Notifications.ViewModels; namespace Greenshot.Components { - /// - /// This processes the information, if there are updates available. - /// - [Service(nameof(UpdateService), nameof(MainFormStartup))] - public class UpdateService : IStartup, IShutdown, IVersionProvider - { - private static readonly LogSource Log = new LogSource(); + /// + /// This processes the information, if there are updates available. + /// + [Service(nameof(UpdateService), nameof(MainFormStartup))] + public class UpdateService : IStartup, IShutdown, IVersionProvider + { + private static readonly LogSource Log = new LogSource(); private static readonly Regex VersionRegex = new Regex(@"^.*[^-]-(?[0-9\.]+)\-(?(release|beta|rc[0-9]+))\.exe.*", RegexOptions.Compiled | RegexOptions.IgnoreCase); - private static readonly Uri UpdateFeed = new Uri("http://getgreenshot.org/project-feed/"); + private static readonly Uri UpdateFeed = new Uri("http://getgreenshot.org/project-feed/"); private readonly CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource(); private readonly ICoreConfiguration _coreConfiguration; - private readonly IEventAggregator _eventAggregator; - private readonly Func> _updateNotificationViewModelFactory; + private readonly IEventAggregator _eventAggregator; + private readonly Func> _updateNotificationViewModelFactory; - /// - public Version CurrentVersion { get; } + /// + public Version CurrentVersion { get; } - /// - public Version LatestVersion { get; private set; } + /// + public Version LatestVersion { get; private set; } /// /// The latest beta version /// - public Version BetaVersion { get; private set; } + public Version BetaVersion { get; private set; } - /// - /// The latest RC version - /// - public Version ReleaseCandidateVersion { get; private set; } + /// + /// The latest RC version + /// + public Version ReleaseCandidateVersion { get; private set; } - /// - public bool IsUpdateAvailable => LatestVersion > CurrentVersion; + /// + public bool IsUpdateAvailable => LatestVersion > CurrentVersion; /// /// Constructor with dependencies @@ -86,26 +87,27 @@ namespace Greenshot.Components ICoreConfiguration coreConfiguration, IEventAggregator eventAggregator, Func> updateNotificationViewModelFactory) - { - _coreConfiguration = coreConfiguration; - _eventAggregator = eventAggregator; - _updateNotificationViewModelFactory = updateNotificationViewModelFactory; - LatestVersion = CurrentVersion = GetType().Assembly.GetName().Version; - _coreConfiguration.LastSaveWithVersion = CurrentVersion.ToString(); - } + { + _coreConfiguration = coreConfiguration; + _eventAggregator = eventAggregator; + _updateNotificationViewModelFactory = updateNotificationViewModelFactory; + var version = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location); + LatestVersion = CurrentVersion = new Version(version.FileMajorPart, version.FileMinorPart, version.FileBuildPart); + _coreConfiguration.LastSaveWithVersion = CurrentVersion.ToString(); + } - /// - public void Startup() - { - var ignore = BackgroundTask(() => TimeSpan.FromDays(_coreConfiguration.UpdateCheckInterval), UpdateCheck, _cancellationTokenSource.Token); - } + /// + public void Startup() + { + var ignore = BackgroundTask(() => TimeSpan.FromDays(_coreConfiguration.UpdateCheckInterval), UpdateCheck, _cancellationTokenSource.Token); + } /// public void Shutdown() - { - if (!_cancellationTokenSource.IsCancellationRequested) - { - _cancellationTokenSource.Cancel(); + { + if (!_cancellationTokenSource.IsCancellationRequested) + { + _cancellationTokenSource.Cancel(); } } @@ -116,48 +118,48 @@ namespace Greenshot.Components /// Func which returns a task /// CancellationToken /// Task - private async Task BackgroundTask(Func intervalFactory, Func reoccurringTask, CancellationToken cancellationToken = default) + private async Task BackgroundTask(Func intervalFactory, Func reoccurringTask, CancellationToken cancellationToken = default) { // Initial delay, to make sure this doesn't happen at the startup await Task.Delay(20000, cancellationToken); Log.Info().WriteLine("Starting background task to check for updates"); - await Task.Run(async () => - { - while (!cancellationToken.IsCancellationRequested) - { - var interval = intervalFactory(); - var task = reoccurringTask; + await Task.Run(async () => + { + while (!cancellationToken.IsCancellationRequested) + { + var interval = intervalFactory(); + var task = reoccurringTask; // If the check is disabled, handle that here - if (TimeSpan.Zero == interval) - { - interval = TimeSpan.FromMinutes(10); - task = c => Task.FromResult(true); - } + if (TimeSpan.Zero == interval) + { + interval = TimeSpan.FromMinutes(10); + task = c => Task.FromResult(true); + } try - { - await task(cancellationToken).ConfigureAwait(false); + { + await task(cancellationToken).ConfigureAwait(false); } - catch (Exception ex) - { + catch (Exception ex) + { Log.Error().WriteLine(ex, "Error occured when trying to check for updates."); - } + } - try - { - await Task.Delay(interval, cancellationToken).ConfigureAwait(false); - } - catch (TaskCanceledException) - { + try + { + await Task.Delay(interval, cancellationToken).ConfigureAwait(false); + } + catch (TaskCanceledException) + { // Ignore, this always happens - } - catch (Exception ex) - { - Log.Error().WriteLine(ex, "Error occured await for the next update check."); - } + } + catch (Exception ex) + { + Log.Error().WriteLine(ex, "Error occured await for the next update check."); + } } - }, cancellationToken).ConfigureAwait(false); + }, cancellationToken).ConfigureAwait(false); } /// @@ -165,50 +167,50 @@ namespace Greenshot.Components /// /// CancellationToken /// Task - private async Task UpdateCheck(CancellationToken cancellationToken = default) - { - Log.Info().WriteLine("Checking for updates from {0}", UpdateFeed); - var updateFeed = await UpdateFeed.GetAsAsync(cancellationToken); - if (updateFeed == null) - { - return; - } + private async Task UpdateCheck(CancellationToken cancellationToken = default) + { + Log.Info().WriteLine("Checking for updates from {0}", UpdateFeed); + var updateFeed = await UpdateFeed.GetAsAsync(cancellationToken); + if (updateFeed == null) + { + return; + } _coreConfiguration.LastUpdateCheck = DateTime.Now; ProcessFeed(updateFeed); - - if (IsUpdateAvailable) - { - ShowUpdate(LatestVersion); + + if (IsUpdateAvailable) + { + ShowUpdate(LatestVersion); } } - /// - /// This takes care of creating the toast view model, publishing it, and disposing afterwards - /// - private void ShowUpdate(Version latestVersion) - { - // Create the ViewModel "part" - var message = _updateNotificationViewModelFactory(latestVersion); - // Prepare to dispose the view model parts automatically if it's finished - void DisposeHandler(object sender, DeactivationEventArgs args) - { - message.Value.Deactivated -= DisposeHandler; - message.Dispose(); - } + /// + /// This takes care of creating the toast view model, publishing it, and disposing afterwards + /// + private void ShowUpdate(Version latestVersion) + { + // Create the ViewModel "part" + var message = _updateNotificationViewModelFactory(latestVersion); + // Prepare to dispose the view model parts automatically if it's finished + void DisposeHandler(object sender, DeactivationEventArgs args) + { + message.Value.Deactivated -= DisposeHandler; + message.Dispose(); + } - message.Value.Deactivated += DisposeHandler; + message.Value.Deactivated += DisposeHandler; // Show the ViewModel as toast - _eventAggregator.PublishOnUIThread(message.Value); - } + _eventAggregator.PublishOnUIThread(message.Value); + } /// /// Process the update feed to get the latest version /// /// - public void ProcessFeed(SyndicationFeed updateFeed) + public void ProcessFeed(SyndicationFeed updateFeed) { var versions = from link in updateFeed.Items.SelectMany(i => i.Links) @@ -217,28 +219,28 @@ namespace Greenshot.Components group match by Regex.Replace(match.Groups["type"].Value, @"[\d-]", string.Empty) into groupedVersions select groupedVersions.OrderByDescending(m => new Version(m.Groups["version"].Value)).First(); - foreach (var versionMatch in versions) - { - var version = new Version(versionMatch.Groups["version"].Value); - var type = versionMatch.Groups["type"].Value; - if (string.IsNullOrEmpty(type)) - { - continue; - } - Log.Debug().WriteLine("Got {0} {1}", type, version); - if ("release".Equals(type, StringComparison.OrdinalIgnoreCase)) - { - LatestVersion = version; - } - if ("beta".Equals(type, StringComparison.OrdinalIgnoreCase)) - { - BetaVersion = version; - } - if ("rc".Equals(type, StringComparison.OrdinalIgnoreCase)) + foreach (var versionMatch in versions) + { + var version = new Version(versionMatch.Groups["version"].Value); + var type = versionMatch.Groups["type"].Value; + if (string.IsNullOrEmpty(type)) { - ReleaseCandidateVersion = version; - } + continue; + } + Log.Debug().WriteLine("Got {0} {1}", type, version); + if ("release".Equals(type, StringComparison.OrdinalIgnoreCase)) + { + LatestVersion = version; + } + if ("beta".Equals(type, StringComparison.OrdinalIgnoreCase)) + { + BetaVersion = version; + } + if ("rc".Equals(type, StringComparison.OrdinalIgnoreCase)) + { + ReleaseCandidateVersion = version; + } } } - } + } } \ No newline at end of file diff --git a/src/Greenshot/Forms/AboutForm.Designer.cs b/src/Greenshot/Forms/AboutForm.Designer.cs index dbecfc046..b408c5159 100644 --- a/src/Greenshot/Forms/AboutForm.Designer.cs +++ b/src/Greenshot/Forms/AboutForm.Designer.cs @@ -117,7 +117,7 @@ namespace Greenshot.Forms { this.linkLblBugs.Size = new System.Drawing.Size(465, 23); this.linkLblBugs.TabIndex = 8; this.linkLblBugs.TabStop = true; - this.linkLblBugs.Text = "http://getgreenshot.org/tickets/?version=" + Assembly.GetEntryAssembly().GetName().Version; + this.linkLblBugs.Text = "http://getgreenshot.org/tickets/?version=" + _versionProvider.CurrentVersion; this.linkLblBugs.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelClicked); // // lblBugs @@ -135,7 +135,7 @@ namespace Greenshot.Forms { this.linkLblDonations.Size = new System.Drawing.Size(465, 23); this.linkLblDonations.TabIndex = 10; this.linkLblDonations.TabStop = true; - this.linkLblDonations.Text = "http://getgreenshot.org/support/?version=" + Assembly.GetEntryAssembly().GetName().Version; + this.linkLblDonations.Text = "http://getgreenshot.org/support/?version=" + _versionProvider.CurrentVersion; this.linkLblDonations.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelClicked); // // lblDonations diff --git a/src/Greenshot/Forms/AboutForm.cs b/src/Greenshot/Forms/AboutForm.cs index f6ffe5d8e..eda85d816 100644 --- a/src/Greenshot/Forms/AboutForm.cs +++ b/src/Greenshot/Forms/AboutForm.cs @@ -45,371 +45,373 @@ using Greenshot.Gfx; namespace Greenshot.Forms { - /// - /// The about form - /// - public sealed partial class AboutForm : AnimatingForm - { - private readonly IGreenshotLanguage _greenshotlanguage; + /// + /// The about form + /// + public sealed partial class AboutForm : AnimatingForm + { + private readonly IGreenshotLanguage _greenshotlanguage; + private readonly IVersionProvider _versionProvider; - private static readonly LogSource Log = new LogSource(); - // Variables are used to define the location of the dots + private static readonly LogSource Log = new LogSource(); + // Variables are used to define the location of the dots private const int w = 13; - private const int p1 = 7; - private const int p2 = p1 + w; - private const int p3 = p2 + w; - private const int p4 = p3 + w; - private const int p5 = p4 + w; - private const int p6 = p5 + w; - private const int p7 = p6 + w; - private readonly Color _backColor = Color.FromArgb(61, 61, 61); - private readonly ColorAnimator _backgroundAnimation; - private readonly IList _colorFlow = new List(); - private readonly IDisposable _dpiSubscription; + private const int p1 = 7; + private const int p2 = p1 + w; + private const int p3 = p2 + w; + private const int p4 = p3 + w; + private const int p5 = p4 + w; + private const int p6 = p5 + w; + private const int p7 = p6 + w; + private readonly Color _backColor = Color.FromArgb(61, 61, 61); + private readonly ColorAnimator _backgroundAnimation; + private readonly IList _colorFlow = new List(); + private readonly IDisposable _dpiSubscription; - // 0 1 2 3 4 - // 5 6 - // 7 8 - // 9 10 11 12 13 - // 14 15 16 17 - // 18 19 20 21 22 23 + // 0 1 2 3 4 + // 5 6 + // 7 8 + // 9 10 11 12 13 + // 14 15 16 17 + // 18 19 20 21 22 23 - // The order in which we draw the dots & flow the collors. - private readonly IList _flowOrder = new List {4, 3, 2, 1, 0, 5, 6, 7, 8, 9, 10, 14, 15, 18, 19, 20, 21, 22, 23, 16, 17, 13, 12, 11}; + // The order in which we draw the dots & flow the collors. + private readonly IList _flowOrder = new List {4, 3, 2, 1, 0, 5, 6, 7, 8, 9, 10, 14, 15, 18, 19, 20, 21, 22, 23, 16, 17, 13, 12, 11}; - /// - /// The location of every dot in the "G" - /// - private readonly IList _gSpots = new List - { - // Top row - new Point(p2, p1), // 0 - new Point(p3, p1), // 1 - new Point(p4, p1), // 2 - new Point(p5, p1), // 3 - new Point(p6, p1), // 4 + /// + /// The location of every dot in the "G" + /// + private readonly IList _gSpots = new List + { + // Top row + new Point(p2, p1), // 0 + new Point(p3, p1), // 1 + new Point(p4, p1), // 2 + new Point(p5, p1), // 3 + new Point(p6, p1), // 4 - // Second row - new Point(p1, p2), // 5 - new Point(p2, p2), // 6 + // Second row + new Point(p1, p2), // 5 + new Point(p2, p2), // 6 - // Third row - new Point(p1, p3), // 7 - new Point(p2, p3), // 8 + // Third row + new Point(p1, p3), // 7 + new Point(p2, p3), // 8 - // Fourth row - new Point(p1, p4), // 9 - new Point(p2, p4), // 10 - new Point(p5, p4), // 11 - new Point(p6, p4), // 12 - new Point(p7, p4), // 13 + // Fourth row + new Point(p1, p4), // 9 + new Point(p2, p4), // 10 + new Point(p5, p4), // 11 + new Point(p6, p4), // 12 + new Point(p7, p4), // 13 - // Fifth row - new Point(p1, p5), // 14 - new Point(p2, p5), // 15 - new Point(p6, p5), // 16 - new Point(p7, p5), // 17 + // Fifth row + new Point(p1, p5), // 14 + new Point(p2, p5), // 15 + new Point(p6, p5), // 16 + new Point(p7, p5), // 17 - // Sixth row - new Point(p1, p6), // 18 - new Point(p2, p6), // 19 - new Point(p3, p6), // 20 - new Point(p4, p6), // 21 - new Point(p5, p6), // 22 - new Point(p6, p6) // 23 - }; + // Sixth row + new Point(p1, p6), // 18 + new Point(p2, p6), // 19 + new Point(p3, p6), // 20 + new Point(p4, p6), // 21 + new Point(p5, p6), // 22 + new Point(p6, p6) // 23 + }; - private readonly Color _pixelColor = Color.FromArgb(138, 255, 0); - private readonly IList _pixelColors = new List(); - private readonly IList _pixels = new List(); - private readonly Random _rand = new Random(); - private Bitmap _bitmap; - private int _colorIndex; - private bool _hasAnimationsLeft; - private int _scrollCount; + private readonly Color _pixelColor = Color.FromArgb(138, 255, 0); + private readonly IList _pixelColors = new List(); + private readonly IList _pixels = new List(); + private readonly Random _rand = new Random(); + private Bitmap _bitmap; + private int _colorIndex; + private bool _hasAnimationsLeft; + private int _scrollCount; - // Variables used for the color-cycle - private int _waitFrames; + // Variables used for the color-cycle + private int _waitFrames; - /// - /// Constructor - /// - public AboutForm( - ICoreConfiguration coreConfiguration, - IGreenshotLanguage greenshotlanguage, - IVersionProvider versionProvider + /// + /// Constructor + /// + public AboutForm( + ICoreConfiguration coreConfiguration, + IGreenshotLanguage greenshotlanguage, + IVersionProvider versionProvider ) : base(coreConfiguration, greenshotlanguage) - { - _greenshotlanguage = greenshotlanguage; - // Make sure our resources are removed again. - Disposed += Cleanup; - FormClosing += Cleanup; + { + _greenshotlanguage = greenshotlanguage; + _versionProvider = versionProvider; + // Make sure our resources are removed again. + Disposed += Cleanup; + FormClosing += Cleanup; - // Enable animation for this form, when we don't set this the timer doesn't start as soon as the form is loaded. - EnableAnimation = true; - // - // The InitializeComponent() call is required for Windows Forms designer support. - // - InitializeComponent(); + // Enable animation for this form, when we don't set this the timer doesn't start as soon as the form is loaded. + EnableAnimation = true; + // + // The InitializeComponent() call is required for Windows Forms designer support. + // + InitializeComponent(); - // Use the self drawn image, first we create the background to be the backcolor (as we animate from this) - _bitmap = BitmapFactory.CreateEmpty(90, 90, PixelFormat.Format24bppRgb, BackColor); - pictureBox1.Image = _bitmap; + // Use the self drawn image, first we create the background to be the backcolor (as we animate from this) + _bitmap = BitmapFactory.CreateEmpty(90, 90, PixelFormat.Format24bppRgb, BackColor); + pictureBox1.Image = _bitmap; - _dpiSubscription = FormDpiHandler.OnDpiChanged.Subscribe(info => - { - pictureBox1.Size = FormDpiHandler.ScaleWithCurrentDpi(new NativeSize(90,90)); + _dpiSubscription = FormDpiHandler.OnDpiChanged.Subscribe(info => + { + pictureBox1.Size = FormDpiHandler.ScaleWithCurrentDpi(new NativeSize(90,90)); }); var versionInfo = $@"Greenshot {versionProvider.CurrentVersion} {(coreConfiguration.IsPortable ? " Portable" : "")} ({OsInfo.Bits} bit)"; - if (versionProvider.IsUpdateAvailable) - { - versionInfo += $" latest is: {versionProvider.LatestVersion}"; - } - lblTitle.Text = versionInfo; - // Number of frames the pixel animation takes + if (versionProvider.IsUpdateAvailable) + { + versionInfo += $" latest is: {versionProvider.LatestVersion}"; + } + lblTitle.Text = versionInfo; + // Number of frames the pixel animation takes var frames = FramesForMillis(2000); - // The number of frames the color-cycle waits before it starts - _waitFrames = FramesForMillis(6000); + // The number of frames the color-cycle waits before it starts + _waitFrames = FramesForMillis(6000); - // Every pixel is created after pixelWaitFrames frames, which is increased in the loop. - var pixelWaitFrames = FramesForMillis(2000); - // Create pixels - for (var index = 0; index < _gSpots.Count; index++) - { - // Read the pixels in the order of the flow - var gSpot = _gSpots[_flowOrder[index]]; - // Create the animation, first we do nothing (on the final destination) - RectangleAnimator pixelAnimation; + // Every pixel is created after pixelWaitFrames frames, which is increased in the loop. + var pixelWaitFrames = FramesForMillis(2000); + // Create pixels + for (var index = 0; index < _gSpots.Count; index++) + { + // Read the pixels in the order of the flow + var gSpot = _gSpots[_flowOrder[index]]; + // Create the animation, first we do nothing (on the final destination) + RectangleAnimator pixelAnimation; - // Make the pixel grom from the middle, if this offset isn't used it looks like it's shifted - var offset = (w - 2) / 2; + // Make the pixel grom from the middle, if this offset isn't used it looks like it's shifted + var offset = (w - 2) / 2; - // If the optimize for Terminal Server is set we make the animation without much ado - if (IsTerminalServerSession) - { - // No animation - pixelAnimation = new RectangleAnimator(new Rectangle(gSpot.X, gSpot.Y, w - 2, w - 2), new Rectangle(gSpot.X, gSpot.Y, w - 2, w - 2), 1, EasingTypes.Cubic); - } - else - { - // Create the animation, first we do nothing (on the final destination) - var standingStill = new Rectangle(gSpot.X + offset, gSpot.Y + offset, 0, 0); - pixelAnimation = new RectangleAnimator(standingStill, standingStill, pixelWaitFrames, EasingTypes.Quintic); - // And than we size to the wanted size. - pixelAnimation.QueueDestinationLeg(new Rectangle(gSpot.X, gSpot.Y, w - 2, w - 2), frames); - } - // Increase the wait frames - pixelWaitFrames += FramesForMillis(100); - // Add to the list of to be animated pixels - _pixels.Add(pixelAnimation); - // Add a color to the list for this pixel. - _pixelColors.Add(_pixelColor); - } - // Make sure the frame "loop" knows we have to animate - _hasAnimationsLeft = true; + // If the optimize for Terminal Server is set we make the animation without much ado + if (IsTerminalServerSession) + { + // No animation + pixelAnimation = new RectangleAnimator(new Rectangle(gSpot.X, gSpot.Y, w - 2, w - 2), new Rectangle(gSpot.X, gSpot.Y, w - 2, w - 2), 1, EasingTypes.Cubic); + } + else + { + // Create the animation, first we do nothing (on the final destination) + var standingStill = new Rectangle(gSpot.X + offset, gSpot.Y + offset, 0, 0); + pixelAnimation = new RectangleAnimator(standingStill, standingStill, pixelWaitFrames, EasingTypes.Quintic); + // And than we size to the wanted size. + pixelAnimation.QueueDestinationLeg(new Rectangle(gSpot.X, gSpot.Y, w - 2, w - 2), frames); + } + // Increase the wait frames + pixelWaitFrames += FramesForMillis(100); + // Add to the list of to be animated pixels + _pixels.Add(pixelAnimation); + // Add a color to the list for this pixel. + _pixelColors.Add(_pixelColor); + } + // Make sure the frame "loop" knows we have to animate + _hasAnimationsLeft = true; - // Pixel Color cycle colors, here we use a pre-animated loop which stores the values. - var pixelColorAnimator = new ColorAnimator(_pixelColor, Color.FromArgb(255, 255, 255), 6, EasingTypes.Quadratic); - pixelColorAnimator.QueueDestinationLeg(_pixelColor, 6, EasingTypes.Quadratic, EasingModes.EaseOut); - do - { - _colorFlow.Add(pixelColorAnimator.Current); - pixelColorAnimator.Next(); - } while (pixelColorAnimator.HasNext); + // Pixel Color cycle colors, here we use a pre-animated loop which stores the values. + var pixelColorAnimator = new ColorAnimator(_pixelColor, Color.FromArgb(255, 255, 255), 6, EasingTypes.Quadratic); + pixelColorAnimator.QueueDestinationLeg(_pixelColor, 6, EasingTypes.Quadratic, EasingModes.EaseOut); + do + { + _colorFlow.Add(pixelColorAnimator.Current); + pixelColorAnimator.Next(); + } while (pixelColorAnimator.HasNext); - // color animation for the background - _backgroundAnimation = new ColorAnimator(BackColor, _backColor, FramesForMillis(5000)); - } + // color animation for the background + _backgroundAnimation = new ColorAnimator(BackColor, _backColor, FramesForMillis(5000)); + } - /// - /// Cleanup all the allocated resources - /// - private void Cleanup(object sender, EventArgs e) - { - if (_bitmap != null) - { - _bitmap.Dispose(); - _bitmap = null; - } - _dpiSubscription.Dispose(); + /// + /// Cleanup all the allocated resources + /// + private void Cleanup(object sender, EventArgs e) + { + if (_bitmap != null) + { + _bitmap.Dispose(); + _bitmap = null; + } + _dpiSubscription.Dispose(); } - /// - /// This is called when a link is clicked - /// - /// - /// - private void LinkLabelClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - if (!(sender is LinkLabel linkLabel)) - { - return; - } - try - { - linkLabel.LinkVisited = true; - Process.Start(linkLabel.Text); - } - catch (Exception) - { + /// + /// This is called when a link is clicked + /// + /// + /// + private void LinkLabelClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + if (!(sender is LinkLabel linkLabel)) + { + return; + } + try + { + linkLabel.LinkVisited = true; + Process.Start(linkLabel.Text); + } + catch (Exception) + { MessageBox.Show(string.Format(_greenshotlanguage.ErrorOpenlink, linkLabel.Text), _greenshotlanguage.Error); - } - } + } + } - /// - /// Called from the AnimatingForm, for every frame - /// - protected override void Animate() - { - if (_bitmap == null) - { - return; - } - if (!IsTerminalServerSession) - { - // Color cycle - if (_waitFrames != 0) - { - _waitFrames--; - // Check if there is something else to do, if not we return so we don't occupy the CPU - if (!_hasAnimationsLeft) - { - return; - } - } - else if (_scrollCount < _pixelColors.Count + _colorFlow.Count) - { - // Scroll colors, the scrollCount is the amount of pixels + the amount of colors to cycle. - for (var index = _pixelColors.Count - 1; index > 0; index--) - { - _pixelColors[index] = _pixelColors[index - 1]; - } - // Keep adding from the colors to cycle until there is nothing left - if (_colorIndex < _colorFlow.Count) - { - _pixelColors[0] = _colorFlow[_colorIndex++]; - } - _scrollCount++; - } - else - { - // Reset values, wait X time for the next one - _waitFrames = FramesForMillis(3000 + _rand.Next(35000)); - _colorIndex = 0; - _scrollCount = 0; - // Check if there is something else to do, if not we return so we don't occupy the CPU - if (!_hasAnimationsLeft) - { - return; - } - } - } - else if (!_hasAnimationsLeft) - { - return; - } + /// + /// Called from the AnimatingForm, for every frame + /// + protected override void Animate() + { + if (_bitmap == null) + { + return; + } + if (!IsTerminalServerSession) + { + // Color cycle + if (_waitFrames != 0) + { + _waitFrames--; + // Check if there is something else to do, if not we return so we don't occupy the CPU + if (!_hasAnimationsLeft) + { + return; + } + } + else if (_scrollCount < _pixelColors.Count + _colorFlow.Count) + { + // Scroll colors, the scrollCount is the amount of pixels + the amount of colors to cycle. + for (var index = _pixelColors.Count - 1; index > 0; index--) + { + _pixelColors[index] = _pixelColors[index - 1]; + } + // Keep adding from the colors to cycle until there is nothing left + if (_colorIndex < _colorFlow.Count) + { + _pixelColors[0] = _colorFlow[_colorIndex++]; + } + _scrollCount++; + } + else + { + // Reset values, wait X time for the next one + _waitFrames = FramesForMillis(3000 + _rand.Next(35000)); + _colorIndex = 0; + _scrollCount = 0; + // Check if there is something else to do, if not we return so we don't occupy the CPU + if (!_hasAnimationsLeft) + { + return; + } + } + } + else if (!_hasAnimationsLeft) + { + return; + } - // Draw the "G" - using (var graphics = Graphics.FromImage(_bitmap)) - { - graphics.SmoothingMode = SmoothingMode.HighQuality; - graphics.InterpolationMode = InterpolationMode.HighQualityBilinear; - graphics.CompositingQuality = CompositingQuality.HighQuality; - graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + // Draw the "G" + using (var graphics = Graphics.FromImage(_bitmap)) + { + graphics.SmoothingMode = SmoothingMode.HighQuality; + graphics.InterpolationMode = InterpolationMode.HighQualityBilinear; + graphics.CompositingQuality = CompositingQuality.HighQuality; + graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; - graphics.Clear(_backgroundAnimation.Next()); + graphics.Clear(_backgroundAnimation.Next()); - graphics.TranslateTransform(2, -2); - graphics.RotateTransform(20); + graphics.TranslateTransform(2, -2); + graphics.RotateTransform(20); - using (var brush = new SolidBrush(_pixelColor)) - { - var index = 0; - // We asume there is nothing to animate in the next Animate loop - _hasAnimationsLeft = false; - // Pixels of the G - foreach (var pixel in _pixels) - { - brush.Color = _pixelColors[index++]; - graphics.FillEllipse(brush, pixel.Current); - // If a pixel still has frames left, the hasAnimationsLeft will be true - _hasAnimationsLeft = _hasAnimationsLeft || pixel.HasNext; - pixel.Next(); - } - } - } - pictureBox1.Invalidate(); - } + using (var brush = new SolidBrush(_pixelColor)) + { + var index = 0; + // We asume there is nothing to animate in the next Animate loop + _hasAnimationsLeft = false; + // Pixels of the G + foreach (var pixel in _pixels) + { + brush.Color = _pixelColors[index++]; + graphics.FillEllipse(brush, pixel.Current); + // If a pixel still has frames left, the hasAnimationsLeft will be true + _hasAnimationsLeft = _hasAnimationsLeft || pixel.HasNext; + pixel.Next(); + } + } + } + pictureBox1.Invalidate(); + } - /// - /// CmdKey handler - /// - /// - /// - /// - [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] - protected override bool ProcessCmdKey(ref Message msg, Keys keyData) - { - try - { - switch (keyData) - { - case Keys.Escape: - DialogResult = DialogResult.Cancel; - break; - case Keys.E: - MessageBox.Show(EnvironmentInfo.EnvironmentToString(true)); - break; - case Keys.L: + /// + /// CmdKey handler + /// + /// + /// + /// + [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] + protected override bool ProcessCmdKey(ref Message msg, Keys keyData) + { + try + { + switch (keyData) + { + case Keys.Escape: + DialogResult = DialogResult.Cancel; + break; + case Keys.E: + MessageBox.Show(EnvironmentInfo.EnvironmentToString(true)); + break; + case Keys.L: // TODO: Open the log file /* - try - { - if (File.Exists(MainForm.LogFileLocation)) - { - using (Process.Start("\"" + MainForm.LogFileLocation + "\"")) - { - // nothing to do, just using dispose to cleanup - } - } - else - { - MessageBox.Show("Greenshot can't find the logfile, it should have been here: " + MainForm.LogFileLocation); - } - } + try + { + if (File.Exists(MainForm.LogFileLocation)) + { + using (Process.Start("\"" + MainForm.LogFileLocation + "\"")) + { + // nothing to do, just using dispose to cleanup + } + } + else + { + MessageBox.Show("Greenshot can't find the logfile, it should have been here: " + MainForm.LogFileLocation); + } + } - catch (Exception) - { - MessageBox.Show("Couldn't open the greenshot.log, it's located here: " + MainForm.LogFileLocation, "Error opening greeenshot.log", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); - } + catch (Exception) + { + MessageBox.Show("Couldn't open the greenshot.log, it's located here: " + MainForm.LogFileLocation, "Error opening greeenshot.log", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); + } */ break; // TODO: Open configuration location // case Keys.I: - //try - //{ - // using (Process.Start("\"" + IniConfig.Current.IniLocation + "\"")) - // { + //try + //{ + // using (Process.Start("\"" + IniConfig.Current.IniLocation + "\"")) + // { // // Ignore - // } - //} - //catch (Exception) - //{ - // MessageBox.Show("Couldn't open the greenshot.ini, it's located here: " + IniConfig.Current.IniLocation, "Error opening greeenshot.ini", MessageBoxButtons.OK, - // MessageBoxIcon.Asterisk); - //} - //break; - default: - return base.ProcessCmdKey(ref msg, keyData); - } - } - catch (Exception ex) - { - Log.Error().WriteLine(ex, $"Error handling key '{keyData}'"); - } - return true; - } - } + // } + //} + //catch (Exception) + //{ + // MessageBox.Show("Couldn't open the greenshot.ini, it's located here: " + IniConfig.Current.IniLocation, "Error opening greeenshot.ini", MessageBoxButtons.OK, + // MessageBoxIcon.Asterisk); + //} + //break; + default: + return base.ProcessCmdKey(ref msg, keyData); + } + } + catch (Exception ex) + { + Log.Error().WriteLine(ex, $"Error handling key '{keyData}'"); + } + return true; + } + } } \ No newline at end of file