#region CPL License /* Nuclex Framework Copyright (C) 2002-2019 Nuclex Development Labs This library is free software; you can redistribute it and/or modify it under the terms of the IBM Common Public License as published by the IBM Corporation; either version 1.0 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the IBM Common Public License for more details. You should have received a copy of the IBM Common Public License along with this library */ #endregion using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using System.Threading; using Nuclex.Support.Tracking; namespace Nuclex.Windows.Forms { /// Progress bar for tracking the progress of background operations public partial class TrackingBar : AsyncProgressBar { /// Initializes a new tracking bar public TrackingBar() { InitializeComponent(); // We start off being in the idle state (and thus, being invisible) this.isIdle = true; this.Visible = false; // Initialize the delegates we use to update the control's state and those // we use to register ourselfes to the tracker's events this.updateIdleStateDelegate = new MethodInvoker(updateIdleState); this.asyncIdleStateChangedDelegate = new EventHandler( asyncIdleStateChanged ); this.asyncProgressUpdateDelegate = new EventHandler( asyncProgressUpdated ); // Create the tracker and attach ourselfes to its events this.tracker = new ProgressTracker(); this.tracker.AsyncIdleStateChanged += this.asyncIdleStateChangedDelegate; this.tracker.AsyncProgressChanged += this.asyncProgressUpdateDelegate; } /// Tracks the specified transaction in the tracking bar /// Transaction to be tracked public void Track(Transaction transaction) { this.tracker.Track(transaction); } /// Tracks the specified transaction in the tracking bar /// Transaction to be tracked /// Weight of this transaction in the total progress public void Track(Transaction transaction, float weight) { this.tracker.Track(transaction, weight); } /// Stops tracking the specified transaction /// Transaction to stop tracking public void Untrack(Transaction transaction) { this.tracker.Untrack(transaction); } /// /// Called when the summed progressed of the tracked transaction has changed /// /// Transaction whose progress has changed /// Contains the progress achieved by the transaction private void asyncProgressUpdated( object sender, ProgressReportEventArgs arguments ) { AsyncSetValue(arguments.Progress); } /// Called when the tracker becomes enters of leaves the idle state /// Tracker that has entered or left the idle state /// Contains the new idle state private void asyncIdleStateChanged(object sender, IdleStateEventArgs arguments) { // Do a fully synchronous update of the idle state. This update must not be // lost because otherwise, the progress bar might stay on-screen when in fact, // the background operation has already finished and nothing is happening anymore. this.isIdle = arguments.Idle; // Update the bar's idle state if(InvokeRequired) { Invoke(this.updateIdleStateDelegate); } else { updateIdleState(); } } /// /// Updates the idle state of the progress bar /// (controls whether the progress bar is shown or invisible) /// private void updateIdleState() { // Only show the progress bar when something is happening base.Visible = !this.isIdle; } /// Whether the progress bar is in the idle state private volatile bool isIdle; /// Tracker used to sum and update the total progress private ProgressTracker tracker; /// Delegate for the idle state update method private MethodInvoker updateIdleStateDelegate; /// Delegate for the asyncIdleStateChanged() method private EventHandler asyncIdleStateChangedDelegate; /// Delegate for the asyncProgressUpdate() method private EventHandler asyncProgressUpdateDelegate; } } // namespace Nuclex.Windows.Forms