| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 | namespace Caliburn.Micro.Core {    using System;    /// <summary>    /// A base implementation of <see cref = "IScreen" />.    /// </summary>    public class Screen : ViewAware, IScreen, IChild {        static readonly ILog Log = LogManager.GetLog(typeof (Screen));        bool isActive;        bool isInitialized;        object parent;        string displayName;        /// <summary>        /// Creates an instance of the screen.        /// </summary>        public Screen() {            displayName = GetType().FullName;        }        /// <summary>        /// Gets or Sets the Parent <see cref = "IConductor" />        /// </summary>        public virtual object Parent {            get { return parent; }            set {                parent = value;                NotifyOfPropertyChange("Parent");            }        }        /// <summary>        /// Gets or Sets the Display Name        /// </summary>        public virtual string DisplayName {            get { return displayName; }            set {                displayName = value;                NotifyOfPropertyChange("DisplayName");            }        }        /// <summary>        /// Indicates whether or not this instance is currently active.        /// Virtualized in order to help with document oriented view models.        /// </summary>        public virtual bool IsActive {            get { return isActive; }            private set {                isActive = value;                NotifyOfPropertyChange("IsActive");            }        }        /// <summary>        /// Indicates whether or not this instance is currently initialized.        /// Virtualized in order to help with document oriented view models.        /// </summary>        public virtual bool IsInitialized {            get { return isInitialized; }            private set {                isInitialized = value;                NotifyOfPropertyChange("IsInitialized");            }        }        /// <summary>        /// Raised after activation occurs.        /// </summary>        public virtual event EventHandler<ActivationEventArgs> Activated = delegate { };        /// <summary>        /// Raised before deactivation.        /// </summary>        public virtual event EventHandler<DeactivationEventArgs> AttemptingDeactivation = delegate { };        /// <summary>        /// Raised after deactivation.        /// </summary>        public virtual event EventHandler<DeactivationEventArgs> Deactivated = delegate { };        void IActivate.Activate() {            if (IsActive) {                return;            }            var initialized = false;            if (!IsInitialized) {                IsInitialized = initialized = true;                OnInitialize();            }            IsActive = true;            Log.Info("Activating {0}.", this);            OnActivate();            var handler = Activated;            if (handler != null) {                handler(this, new ActivationEventArgs                {                    WasInitialized = initialized                });            }        }        /// <summary>        /// Called when initializing.        /// </summary>        protected virtual void OnInitialize() {}        /// <summary>        /// Called when activating.        /// </summary>        protected virtual void OnActivate() {}        void IDeactivate.Deactivate(bool close) {            if (IsActive || (IsInitialized && close)) {                var attemptingDeactivationHandler = AttemptingDeactivation;                if (attemptingDeactivationHandler != null) {                    attemptingDeactivationHandler(this, new DeactivationEventArgs                    {                        WasClosed = close                    });                }                IsActive = false;                Log.Info("Deactivating {0}.", this);                OnDeactivate(close);                var deactivatedHandler = Deactivated;                if (deactivatedHandler != null) {                    deactivatedHandler(this, new DeactivationEventArgs                    {                        WasClosed = close                    });                }                if (close) {                    Views.Clear();                    Log.Info("Closed {0}.", this);                }            }        }        /// <summary>        /// Called when deactivating.        /// </summary>        /// <param name = "close">Inidicates whether this instance will be closed.</param>        protected virtual void OnDeactivate(bool close) {}        /// <summary>        /// Called to check whether or not this instance can close.        /// </summary>        /// <param name = "callback">The implementor calls this action with the result of the close check.</param>        public virtual void CanClose(Action<bool> callback) {            callback(true);        }        /// <summary>        /// Tries to close this instance by asking its Parent to initiate shutdown or by asking its corresponding view to close.        /// Also provides an opportunity to pass a dialog result to it's corresponding view.        /// </summary>        /// <param name="dialogResult">The dialog result.</param>        public virtual void TryClose(bool? dialogResult = null) {            PlatformProvider.Current.GetViewCloseAction(this, Views.Values, dialogResult).OnUIThread();        }    }}
 |