view Chronosv2/source/Presentation/Windows/VirtualDesktop.cs @ 10:443821e55f06

Initial cleaned up add from Codeplex files
author stevenh7776 stevenhollidge@hotmail.com
date Tue, 21 Feb 2012 17:25:44 +0700
parents
children
line wrap: on
line source

/*
The MIT License

Copyright (c) 2009-2010. Carlos Guzmán Álvarez. http://chronoswpf.codeplex.com/

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/

using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Threading;
using Chronos.Extensions.Windows;
using Chronos.Presentation.Core.ViewModel;
using Chronos.Presentation.Core.VirtualDesktops;
using Chronos.Presentation.Core.Windows;
using Chronos.Presentation.Windows.Controls;
using NLog;
using nRoute.Components.Messaging;

namespace Chronos.Presentation.Windows
{
    /// <summary>
    /// Virtual desktop class
    /// </summary>
    public sealed class VirtualDesktop 
        : DispatcherObject, IVirtualDesktop
    {
        #region · Logger ·

        private static Logger Logger = LogManager.GetCurrentClassLogger();

        #endregion

        #region · Fields ·

        private Desktop                                             desktop;
        private ObservableCollection<INavigationViewModel>          activeWindows;
        private ReadOnlyObservableCollection<INavigationViewModel>  activeWindowsWrapper;
        private bool                                                hasBeenActivated;

        #endregion

        #region · Properties ·

        public Guid Id
        {
            get
            {
                if (this.desktop != null)
                {
                    return this.desktop.Id;
                }

                return Guid.Empty;
            }
        }

        /// <summary>
        /// Gets the list of active Windows
        /// </summary>
        public ReadOnlyObservableCollection<INavigationViewModel> ActiveWindows
        {
            get
            {
                if (this.activeWindowsWrapper == null)
                {
                    this.activeWindowsWrapper = new ReadOnlyObservableCollection<INavigationViewModel>(this.Windows);
                }

                return this.activeWindowsWrapper;
            }
        }

        #endregion

        #region · Private Properties ·

        private ObservableCollection<INavigationViewModel> Windows
        {
            get
            {
                if (this.activeWindows == null)
                {
                    this.activeWindows = new ObservableCollection<INavigationViewModel>();
                }

                return this.activeWindows;
            }
        }

        #endregion

        #region · Constructors ·

        /// <summary>
        /// Initializes a new instance of <see cref="VirtualDesktop"/> class
        /// </summary>
        internal VirtualDesktop(Desktop desktop)
        {
            this.desktop = desktop;
        }

        #endregion

        #region · Desktop Actions ·

        /// <summary>
        /// Activates the desktop instance
        /// </summary>
        public void Activate()
        {
            this.InvokeAsynchronouslyInBackground(
                () =>
                {
                    if (!this.hasBeenActivated)
                    {
                        this.Load();
                        this.hasBeenActivated = true;

                        this.desktop.Activate();
                    }

                    this.desktop.Visibility = Visibility.Visible;

                    Channel<ActiveDesktopChangedInfo>.Public.OnNext(new ActiveDesktopChangedInfo(this), true);
                });
        }

        /// <summary>
        /// Deactivates the desktop instance
        /// </summary>
        public void Deactivate()
        {
            this.Invoke(
                () =>
                {
                    this.desktop.Visibility = Visibility.Hidden;
                });
        }

        /// <summary>
        /// Shows the desktop
        /// </summary>
        public void ShowDesktop()
        {
            this.InvokeAsynchronouslyInBackground
            (
                () =>
                {
                    this.desktop.Children
                        .OfType<WindowElement>()
                        .ToList()
                        .ForEach(window => window.WindowState = WindowState.Minimized);
                }
            );
        }

        /// <summary>
        /// Saves desktop contents to disk
        /// </summary>
        public void Save()
        {
            this.Invoke(
                () =>
                {
                    DesktopSerializer.Save(this.desktop, this.GetXamlFilename());
                });
        }

        #endregion

        #region · Window Methods ·

        /// <summary>
        /// Shows the given window instance
        /// </summary>
        public void Show(IWindow window)
        {
            this.InvokeAsynchronouslyInBackground
            (
                () =>
                {
                    WindowElement element = window as WindowElement;
                    
                    this.desktop.AddElement(element);

                    element.Show();

                    this.InvokeAsynchronouslyInBackground
                    (
                        () =>
                        {
                            if (element.DataContext is INavigationViewModel)
                            {
                                INavigationViewModel windowViewModel = element.DataContext as INavigationViewModel;

                                ((IClosableViewModel)windowViewModel).Title = element.Title;

                                this.Windows.Add(windowViewModel);
                            }
                        }
                    );
                }
            );
        }

        /// <summary>
        /// Restores the window with the given Id
        /// </summary>
        /// <param name="id"></param>
        public void Restore(Guid id)
        {
            this.InvokeAsynchronouslyInBackground
            (
                () =>
                {
                    IWindow window = this.desktop.Children.OfType<IWindow>().Where(wc => wc.Id == id).SingleOrDefault();

                    if (window != null)
                    {
                        window.WindowState = WindowState.Normal;
                        window.Activate();
                    }
                }
            );
        }

        #endregion

        #region · Shortcut Methods ·

        /// <summary>
        /// Creates a new shortcut with the given title and target
        /// </summary>
        /// <param name="title"></param>
        /// <param name="target"></param>
        public void CreateShortcut<T>(string title, string target) where T : IShortcutViewModel, new()
        {
            this.CreateShortcut<T>(title, target, new Point(0, 0));
        }

        /// <summary>
        /// Creates a new shortcut with the given title and target
        /// </summary>
        /// <param name="title"></param>
        /// <param name="target"></param>
        public void CreateShortcut<T>(string title, string target, Point point) where T : IShortcutViewModel, new()
        {
            T shortcut = new T
            {
                Title   = title,
                Target  = target
            };

            ShortcutElement element = new ShortcutElement
            {
                DataContext = shortcut
            };

            this.Show(element, point);
        }

        #endregion

        #region · IDesktopElement Methods ·

        public void Show<T>() where T : IDesktopElement, new()
        {
            this.Show(new T());
        }

        public void Show<T>(Point position) where T : IDesktopElement, new()
        {
            this.Show(new T(), position);
        }

        public void Show(IDesktopElement element)
        {
            this.InvokeAsynchronously(
                () =>
                {
                    DesktopElement desktopElement = element as DesktopElement;

                    this.desktop.AddElement(desktopElement);
                });
        }

        public void Show(IDesktopElement element, Point position)
        {
            this.InvokeAsynchronously(
                () =>
                {
                    DesktopElement desktopElement = element as DesktopElement;

                    desktopElement.StartupLocation = StartupPosition.Manual;

                    this.desktop.AddElement(desktopElement, position);
                });
        }

        #endregion

        #region · Common Methods ·

        /// <summary>
        /// Closes all
        /// </summary>
        public void CloseAll()
        {
            this.Invoke(
                () =>
                {
                    this.desktop.Children
                        .OfType<DesktopElement>()
                        .ToList()
                        .ForEach(e => this.Close(e.Id));

                    this.hasBeenActivated = false;
                });
        }

        /// <summary>
        /// Closes the element with the given Id
        /// </summary>
        /// <param name="id">The id.</param>
        public void Close(Guid id)
        {
            DesktopElement instance = this.desktop.Children.OfType<DesktopElement>().Where(x => x.Id == id).FirstOrDefault();

            if (instance != null)
            {
                if (instance is WindowElement)
                {
                    this.Windows.Remove((instance as WindowElement).DataContext as INavigationViewModel);
                }
                
                instance.Close();
            }
        }

        #endregion

        #region · Private Methods ·

        /// <summary>
        /// Loads desktop contents from disk
        /// </summary>
        private void Load()
        {
            this.Invoke(
                () =>
                {
                    DesktopSerializer.Load(this.desktop, this.GetXamlFilename());
                });
        }

        private string GetXamlFilename()
        {
            return String.Format("{0}.xaml", this.desktop.Name);
        }

        private void RemoveElement(DesktopElement element)
        {
            this.InvokeAsynchronouslyInBackground(
                () =>
                {
                    this.desktop.RemoveElement(element);
                });
        }

        #endregion
    }
}