2023-08-04 12:24:49 -04:00
using System.Collections.ObjectModel ;
2020-02-26 17:20:47 -05:00
using System.Collections.Specialized ;
using System.ComponentModel ;
using System.Linq ;
using System.Windows.Forms ;
2023-03-31 11:47:53 -04:00
namespace Vanara.Windows.Shell ;
/// <summary>The list of thumbnails to be displayed on the taskbar button.</summary>
2023-08-04 12:24:49 -04:00
/// <seealso cref="ObservableCollection{T}"/>
2023-03-31 11:47:53 -04:00
[Serializable]
[TypeConverter(typeof(ExpandableObjectConverter))]
public class TaskbarButtonThumbnails : ObservableCollection < TaskbarButtonThumbnail >
2020-02-26 17:20:47 -05:00
{
2023-03-31 11:47:53 -04:00
internal IWin32Window parent ;
private bool hasAddedButtons = false ;
2020-02-26 17:20:47 -05:00
2023-03-31 11:47:53 -04:00
internal TaskbarButtonThumbnails ( IWin32Window parent )
{
this . parent = parent ;
Toolbar = new ThumbnailToolbar ( ) ;
Toolbar . PropertyChanged + = ( s , e ) = > ResetToolbar ( ) ;
base . CollectionChanged + = LocalCollectionChanged ;
}
2020-02-26 17:20:47 -05:00
2023-03-31 11:47:53 -04:00
/// <summary>Gets or sets the toolbar associated with the taskbar button.</summary>
/// <value>The toolbar.</value>
[Category("Appearance"), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ThumbnailToolbar Toolbar { get ; }
2020-02-26 17:20:47 -05:00
2023-03-31 11:47:53 -04:00
/// <summary>Gets the count.</summary>
/// <value>The count.</value>
[Browsable(false)]
public new int Count = > base . Count ;
2020-02-26 17:20:47 -05:00
2023-03-31 11:47:53 -04:00
internal void ResetToolbar ( )
{
if ( Toolbar ? . ImageList ! = null )
TaskbarList . ThumbBarSetImageList ( parent . Handle , Toolbar . ImageList . Handle ) ;
if ( Toolbar ? . Buttons ? . Count > 0 )
2020-02-26 17:20:47 -05:00
{
2023-03-31 11:47:53 -04:00
if ( ! hasAddedButtons )
2020-02-26 17:20:47 -05:00
{
2023-03-31 11:47:53 -04:00
TaskbarList . ThumbBarAddButtons ( parent . Handle , Toolbar . Buttons . ToArray ( ) ) ;
hasAddedButtons = true ;
2020-02-26 17:20:47 -05:00
}
2023-03-31 11:47:53 -04:00
else
TaskbarList . ThumbBarUpdateButtons ( parent . Handle , Toolbar . Buttons . ToArray ( ) ) ;
2020-02-26 17:20:47 -05:00
}
2023-03-31 11:47:53 -04:00
}
2020-02-26 17:20:47 -05:00
2023-03-31 11:47:53 -04:00
private void ActivateThumbnail ( TaskbarButtonThumbnail thumbnail )
{
if ( parent ! = null )
TaskbarList . SetTabActive ( parent . Handle , thumbnail ? . ChildWindow . Handle ? ? throw new ArgumentNullException ( nameof ( thumbnail ) , "The TaskbarItemTab.ChildWindow property must be set in order to be activated." ) ) ;
}
2020-02-26 17:20:47 -05:00
2023-08-21 13:11:05 -04:00
private void LocalCollectionChanged ( object? _ , NotifyCollectionChangedEventArgs e )
2023-03-31 11:47:53 -04:00
{
// If new thumbnails are added, they have to be registered
if ( e . NewItems ! = null )
2020-02-26 17:20:47 -05:00
{
2023-03-31 11:47:53 -04:00
foreach ( var item in e . NewItems . Cast < TaskbarButtonThumbnail > ( ) )
2020-02-26 17:20:47 -05:00
{
2023-03-31 11:47:53 -04:00
item . PropertyChanged + = ThmbChanged ;
RegisterThumbnail ( item ) ;
2020-02-26 17:20:47 -05:00
}
2023-03-31 11:47:53 -04:00
}
2020-02-26 17:20:47 -05:00
2023-03-31 11:47:53 -04:00
// If new thumbnails are removed, they have to be unregistered
if ( e . OldItems ! = null )
{
foreach ( var item in e . OldItems . Cast < TaskbarButtonThumbnail > ( ) )
2020-02-26 17:20:47 -05:00
{
2023-03-31 11:47:53 -04:00
item . PropertyChanged - = ThmbChanged ;
UnregisterThumbnail ( item ) ;
2020-02-26 17:20:47 -05:00
}
}
2023-08-21 13:11:05 -04:00
void ThmbChanged ( object? s , PropertyChangedEventArgs e ) = > RefreshThumbnail ( ( TaskbarButtonThumbnail ) ( s ? ? throw new InvalidCastException ( "Invalid object type sent to thumbnail event handler." ) ) ) ;
2023-03-31 11:47:53 -04:00
}
2020-02-26 17:20:47 -05:00
2023-03-31 11:47:53 -04:00
private void RefreshThumbnail ( TaskbarButtonThumbnail thumbnail )
{
if ( parent ! = null & & thumbnail . ChildWindow ! = null )
TaskbarList . SetTabProperties ( thumbnail . ChildWindow . Handle , thumbnail . flag ) ;
}
2020-02-26 17:20:47 -05:00
2023-03-31 11:47:53 -04:00
private void RegisterThumbnail ( TaskbarButtonThumbnail thumbnail )
{
var idx = IndexOf ( thumbnail ) ;
var nxt = idx < Count - 1 ? this [ idx + 1 ] : null ;
2020-02-26 17:20:47 -05:00
2023-03-31 11:47:53 -04:00
if ( parent ! = null & & thumbnail . ChildWindow ! = null )
2020-02-26 17:20:47 -05:00
{
2023-03-31 11:47:53 -04:00
TaskbarList . RegisterTab ( parent . Handle , thumbnail . ChildWindow . Handle ) ;
TaskbarList . SetTabOrder ( thumbnail . ChildWindow . Handle , nxt ? . ChildWindow . Handle ? ? default ) ;
TaskbarList . SetTabProperties ( thumbnail . ChildWindow . Handle , thumbnail . flag ) ;
2020-02-26 17:20:47 -05:00
}
}
2023-03-31 11:47:53 -04:00
private void UnregisterThumbnail ( TaskbarButtonThumbnail thumbnail )
{
if ( thumbnail . ChildWindow ! = null )
TaskbarList . UnregisterTab ( thumbnail . ChildWindow . Handle ) ;
}
2020-02-26 17:20:47 -05:00
}