2021-03-31 16:42:58 -05:00
// Decompiled with JetBrains decompiler
// Type: Microsoft.Iris.ModelItem
// Assembly: UIX, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
// MVID: A56C6C9D-B7F6-46A9-8BDE-B3D9B8D60B11
// Assembly location: C:\Program Files\Zune\UIX.dll
using Microsoft.Iris.Library ;
using System ;
using System.Collections ;
using System.Collections.Specialized ;
using System.ComponentModel ;
using System.Threading ;
namespace Microsoft.Iris
{
public class ModelItem :
IModelItem ,
INotifyPropertyChanged ,
IModelItemOwner ,
IDisposable ,
IThreadSafeObject
{
private static readonly EventCookie s_propertyChangedEvent = EventCookie . ReserveSlot ();
private static readonly EventCookie s_focusRequestedEvent = EventCookie . ReserveSlot ();
private static readonly DataCookie s_descriptionProperty = DataCookie . ReserveSlot ();
private static readonly DataCookie s_uniqueIdProperty = DataCookie . ReserveSlot ();
private static readonly DataCookie s_selectedProperty = DataCookie . ReserveSlot ();
private static readonly DataCookie s_selectionPolicyProperty = DataCookie . ReserveSlot ();
private static readonly DataCookie s_ownedObjectsProperty = DataCookie . ReserveSlot ();
private static readonly DataCookie s_extraDataProperty = DataCookie . ReserveSlot ();
private IModelItemOwner _owner ;
private DynamicData _dataMap ;
private bool _isDisposed ;
private Thread _affinity ;
public ModelItem ( IModelItemOwner owner , string description )
{
2021-03-31 17:15:06 -05:00
ThreadSafety . InitializeObject ( this );
2021-04-02 19:10:51 -05:00
_dataMap = new DynamicData ();
_dataMap . Create ();
SetData ( s_descriptionProperty , description );
Owner = owner ;
2021-03-31 16:42:58 -05:00
}
public ModelItem ( IModelItemOwner owner )
2021-03-31 17:15:06 -05:00
: this ( owner , null )
2021-03-31 16:42:58 -05:00
{
}
public ModelItem ()
2021-03-31 17:15:06 -05:00
: this ( null )
2021-03-31 16:42:58 -05:00
{
}
~ ModelItem ()
{
2021-04-02 19:10:51 -05:00
string name = GetType (). Name ;
string data = ( string ) GetData ( s_descriptionProperty );
OnDispose ( false );
2021-03-31 16:42:58 -05:00
}
2021-04-02 19:10:51 -05:00
public void Dispose () => Dispose ( ModelItemDisposeMode . RemoveOwnerReference );
2021-03-31 16:42:58 -05:00
public void Dispose ( ModelItemDisposeMode disposeMode )
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
2021-03-31 16:42:58 -05:00
{
2021-04-02 19:10:51 -05:00
if ( _isDisposed )
2021-03-31 16:42:58 -05:00
return ;
2021-04-02 19:10:51 -05:00
if ( _owner != null )
2021-03-31 16:42:58 -05:00
{
if ( disposeMode == ModelItemDisposeMode . RemoveOwnerReference )
2021-04-02 19:10:51 -05:00
_owner . UnregisterObject ( this );
_owner = null ;
2021-03-31 16:42:58 -05:00
}
try
{
2021-03-31 17:15:06 -05:00
GC . SuppressFinalize ( this );
2021-04-02 19:10:51 -05:00
OnDispose ( true );
2021-03-31 16:42:58 -05:00
}
finally
{
try
{
2021-04-02 19:10:51 -05:00
DisposeOwnedObjects ();
2021-03-31 16:42:58 -05:00
}
finally
{
2021-04-02 19:10:51 -05:00
_isDisposed = true ;
2021-03-31 16:42:58 -05:00
}
}
}
}
protected virtual void OnDispose ( bool disposing )
{
}
2021-03-31 17:15:06 -05:00
protected ThreadSafetyBlock ThreadValidator => new ThreadSafetyBlock ( this );
2021-03-31 16:42:58 -05:00
Thread IThreadSafeObject . Affinity
{
2021-04-02 19:10:51 -05:00
get => _affinity ;
set => _affinity = value ;
2021-03-31 16:42:58 -05:00
}
public IModelItemOwner Owner
{
get
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
return _owner ;
2021-03-31 16:42:58 -05:00
}
set
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
2021-03-31 16:42:58 -05:00
{
2021-04-02 19:10:51 -05:00
if ( _owner == value )
2021-03-31 16:42:58 -05:00
return ;
2021-04-02 19:10:51 -05:00
IModelItemOwner owner = _owner ;
2021-03-31 16:42:58 -05:00
owner ?. UnregisterObject ( this );
2021-04-02 19:10:51 -05:00
_owner = value ;
if ( _owner != null )
_owner . RegisterObject ( this );
OnOwnerChanged ( _owner , owner );
2021-03-31 16:42:58 -05:00
}
}
}
public bool IsDisposed
{
get
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
return _isDisposed ;
2021-03-31 16:42:58 -05:00
}
}
public string Description
{
get
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
return ( string ) GetData ( s_descriptionProperty );
2021-03-31 16:42:58 -05:00
}
set
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
2021-03-31 16:42:58 -05:00
{
2021-04-02 19:10:51 -05:00
if (!( Description != value ))
2021-03-31 16:42:58 -05:00
return ;
2021-04-02 19:10:51 -05:00
SetData ( s_descriptionProperty , value );
FirePropertyChanged ( nameof ( Description ));
2021-03-31 16:42:58 -05:00
}
}
}
public Guid UniqueId
{
get
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
2021-03-31 16:42:58 -05:00
{
2021-04-02 19:10:51 -05:00
object data = GetData ( s_uniqueIdProperty );
2021-03-31 16:42:58 -05:00
return data == null ? Guid . Empty : ( Guid ) data ;
}
}
set
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
2021-03-31 16:42:58 -05:00
{
2021-04-02 19:10:51 -05:00
if (!( UniqueId != value ))
2021-03-31 16:42:58 -05:00
return ;
2021-04-02 19:10:51 -05:00
SetData ( s_uniqueIdProperty , value );
FirePropertyChanged ( nameof ( UniqueId ));
2021-03-31 16:42:58 -05:00
}
}
}
public IDictionary Data
{
get
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
2021-03-31 16:42:58 -05:00
{
2021-04-02 19:10:51 -05:00
IDictionary dictionary = ( IDictionary ) GetData ( s_extraDataProperty );
2021-03-31 16:42:58 -05:00
if ( dictionary == null )
{
2021-03-31 17:15:06 -05:00
dictionary = new HybridDictionary ();
2021-04-02 19:10:51 -05:00
SetData ( s_extraDataProperty , dictionary );
2021-03-31 16:42:58 -05:00
}
return dictionary ;
}
}
}
public event PropertyChangedEventHandler PropertyChanged
{
add
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
AddEventHandler ( s_propertyChangedEvent , value );
2021-03-31 16:42:58 -05:00
}
remove
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
RemoveEventHandler ( s_propertyChangedEvent , value );
2021-03-31 16:42:58 -05:00
}
}
protected void FirePropertyChanged ( string property )
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
2021-03-31 16:42:58 -05:00
{
if ( property == null )
throw new ArgumentNullException ( nameof ( property ));
2021-04-02 19:10:51 -05:00
OnPropertyChanged ( property );
if (!( GetEventHandler ( s_propertyChangedEvent ) is PropertyChangedEventHandler eventHandler ))
2021-03-31 16:42:58 -05:00
return ;
2021-03-31 17:15:06 -05:00
eventHandler ( this , new PropertyChangedEventArgs ( property ));
2021-03-31 16:42:58 -05:00
}
}
protected virtual void OnPropertyChanged ( string property )
{
}
protected virtual void OnOwnerChanged ( IModelItemOwner newOwner , IModelItemOwner oldOwner )
{
}
void IModelItemOwner . RegisterObject ( ModelItem item )
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
2021-03-31 16:42:58 -05:00
{
if ( item == null )
throw new ArgumentNullException ( nameof ( item ));
if ( item == this )
throw new ArgumentException ( "Cannot make a ModelItem the owner of itself" );
2021-04-02 19:10:51 -05:00
GetOwnedObjects ( true ). Add ( item );
2021-03-31 16:42:58 -05:00
}
}
void IModelItemOwner . UnregisterObject ( ModelItem item )
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
2021-03-31 16:42:58 -05:00
{
if ( item == null )
throw new ArgumentNullException ( nameof ( item ));
2021-04-02 19:10:51 -05:00
Vector < ModelItem > ownedObjects = GetOwnedObjects ( false );
2021-03-31 16:42:58 -05:00
if ( ownedObjects == null || ! ownedObjects . Contains ( item ))
2021-03-31 17:15:06 -05:00
throw new ArgumentException ( InvariantString . Format ( "Cannot unregister an object that was never registered. Owner \"{0}\" was unable to identify \"{1}\"." , this , item ));
2021-03-31 16:42:58 -05:00
ownedObjects . Remove ( item );
}
}
private void DisposeOwnedObjects ()
{
2021-04-02 19:10:51 -05:00
Vector < ModelItem > ownedObjects = GetOwnedObjects ( false );
2021-03-31 16:42:58 -05:00
if ( ownedObjects == null )
return ;
foreach ( ModelItem modelItem in ownedObjects )
modelItem . Dispose ( ModelItemDisposeMode . KeepOwnerReference );
2021-04-02 19:10:51 -05:00
SetData ( s_ownedObjectsProperty , null );
2021-03-31 16:42:58 -05:00
}
private Vector < ModelItem > GetOwnedObjects ( bool createIfNoneFlag )
{
2021-04-02 19:10:51 -05:00
Vector < ModelItem > vector = ( Vector < ModelItem >) GetData ( s_ownedObjectsProperty );
2021-03-31 16:42:58 -05:00
if ( vector == null && createIfNoneFlag )
{
vector = new Vector < ModelItem >();
2021-04-02 19:10:51 -05:00
SetData ( s_ownedObjectsProperty , vector );
2021-03-31 16:42:58 -05:00
}
return vector ;
}
public bool Selected
{
get
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
2021-03-31 16:42:58 -05:00
{
2021-04-02 19:10:51 -05:00
object data = GetData ( s_selectedProperty );
2021-03-31 16:42:58 -05:00
return data != null && ( bool ) data ;
}
}
set
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
2021-03-31 16:42:58 -05:00
{
2021-04-02 19:10:51 -05:00
if ( Selected == value )
2021-03-31 16:42:58 -05:00
return ;
2021-04-02 19:10:51 -05:00
SetData ( s_selectedProperty , value );
FirePropertyChanged ( nameof ( Selected ));
2021-03-31 16:42:58 -05:00
}
}
}
public override string ToString ()
{
2021-04-02 19:10:51 -05:00
using ( ThreadValidator )
2021-03-31 16:42:58 -05:00
{
2021-04-02 19:10:51 -05:00
string name = GetType (). Name ;
string description = Description ;
2021-03-31 17:15:06 -05:00
return description != null ? InvariantString . Format ( "{0}:\"{1}\"" , name , description ) : name ;
2021-03-31 16:42:58 -05:00
}
}
2021-04-02 19:10:51 -05:00
internal object GetData ( DataCookie cookie ) => _dataMap . GetData ( cookie );
2021-03-31 16:42:58 -05:00
2021-04-02 19:10:51 -05:00
internal void SetData ( DataCookie cookie , object value ) => _dataMap . SetData ( cookie , value );
2021-03-31 16:42:58 -05:00
2021-04-02 19:10:51 -05:00
internal Delegate GetEventHandler ( EventCookie cookie ) => _dataMap . GetEventHandler ( cookie );
2021-03-31 16:42:58 -05:00
2021-04-02 19:10:51 -05:00
internal void AddEventHandler ( EventCookie cookie , Delegate handlerToAdd ) => _dataMap . AddEventHandler ( cookie , handlerToAdd );
2021-03-31 16:42:58 -05:00
2021-04-02 19:10:51 -05:00
internal void RemoveEventHandler ( EventCookie cookie , Delegate handlerToRemove ) => _dataMap . RemoveEventHandler ( cookie , handlerToRemove );
2021-03-31 16:42:58 -05:00
2021-04-02 19:10:51 -05:00
internal void RemoveEventHandlers ( EventCookie cookie ) => _dataMap . RemoveEventHandlers ( cookie );
2021-03-31 16:42:58 -05:00
private static uint GetKey ( EventCookie cookie )
{
uint uint32 = EventCookie . ToUInt32 ( cookie );
return uint32 != 0 U ? uint32 : throw new ArgumentException ( "invalid event key" );
}
}
}