diff Chronosv2/source/WidgetLibrary/WidgetLibraryViewModel.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 741981715d94
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Chronosv2/source/WidgetLibrary/WidgetLibraryViewModel.cs	Tue Feb 21 17:25:44 2012 +0700
@@ -0,0 +1,232 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Windows.Input;
+using Chronos.Presentation.Core.Configuration;
+using Chronos.Presentation.Core.VirtualDesktops;
+using Chronos.Presentation.Core.Widgets;
+using Chronos.Presentation.Core.Windows;
+using Chronos.Presentation.ViewModel;
+using NLog;
+using nRoute.Components;
+
+namespace Chronos.WidgetLibrary
+{
+  /// <summary>
+  /// Widget library ViewModel
+  /// </summary>
+  public sealed class WidgetLibraryViewModel
+      : WidgetViewModel
+  {
+    #region · Constants ·
+
+    private static readonly string AllWidgetsKey = "All";
+
+    #endregion
+
+    #region · PropertyChangedEventArgs Cached Instances ·
+
+    private static readonly PropertyChangedEventArgs FilterChangedArgs = CreateArgs<WidgetLibraryViewModel>(x => x.Filter);
+    private static readonly PropertyChangedEventArgs WidgetsChangedArgs = CreateArgs<WidgetLibraryViewModel>(x => x.Widgets);
+    private static readonly PropertyChangedEventArgs SelectedWidgetChangedArgs = CreateArgs<WidgetLibraryViewModel>(x => x.SelectedWidget);
+
+    #endregion
+
+    #region · Fields ·
+
+    private string filter;
+    private List<string> groups;
+    private List<WidgetItemViewModel> widgets;
+    private IWidget selectedWidget;
+    private ActionCommand createWidgetCommand;
+
+    #endregion
+
+    #region · Commands ·
+
+    /// <summary>
+    /// Gets the create widget command.
+    /// </summary>
+    /// <value>The create widget command.</value>
+    public ActionCommand CreateWidgetCommand
+    {
+      get
+      {
+        if (this.createWidgetCommand == null)
+        {
+          this.createWidgetCommand = new ActionCommand
+          (
+              () => OnCreateWidget(),
+              () => CanCreateWidget()
+          );
+        }
+
+        return this.createWidgetCommand;
+      }
+    }
+
+    #endregion
+
+    #region · Properties ·
+
+    /// <summary>
+    /// Gets/sets a fragment of the name to filter for.
+    /// </summary>
+    public string Filter
+    {
+      get { return this.filter; }
+      set
+      {
+        if (value != filter)
+        {
+          this.filter = value;
+          this.NotifyPropertyChanged(FilterChangedArgs);
+          this.NotifyPropertyChanged(WidgetsChangedArgs);
+
+          this.SelectedWidget = null;
+        }
+      }
+    }
+
+    /// <summary>
+    /// Gets the list of widget groups.
+    /// </summary>
+    /// <value>The groups.</value>
+    public IEnumerable<string> Groups
+    {
+      get { return this.groups; }
+    }
+
+    /// <summary>
+    /// Gets the list of widgets
+    /// </summary>
+    public IList<WidgetItemViewModel> Widgets
+    {
+      get
+      {
+        if (String.IsNullOrEmpty(this.filter)
+            || this.filter == AllWidgetsKey)
+        {
+          return this.widgets;
+        }
+        else
+        {
+          return new ReadOnlyCollection<WidgetItemViewModel>(this.widgets.Where(x => x.Group == this.filter).ToList());
+        }
+      }
+    }
+
+    /// <summary>
+    /// Gets or sets the selected widget.
+    /// </summary>
+    /// <value>The selected widget.</value>
+    public IWidget SelectedWidget
+    {
+      get { return this.selectedWidget; }
+      set
+      {
+        if (this.selectedWidget != value)
+        {
+          this.selectedWidget = value;
+          this.NotifyPropertyChanged(SelectedWidgetChangedArgs);
+          this.CreateWidgetCommand.RequeryCanExecute();
+        }
+      }
+    }
+
+    #endregion
+
+    #region · Constructors ·
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="WidgetLibrary"/> class.
+    /// </summary>
+    public WidgetLibraryViewModel()
+      : base()
+    {
+      this.widgets = this.DiscoverWidgets();
+      this.groups = this.DiscoverWidgetGroups();
+    }
+
+    #endregion
+
+    #region · Overriden Methods ·
+
+    /// <summary>
+    /// Called when the related view is being closed.
+    /// </summary>
+    public override void Close()
+    {
+      base.Close();
+
+      this.selectedWidget = null;
+      this.createWidgetCommand = null;
+
+      if (this.groups != null)
+      {
+        this.groups.Clear();
+        this.groups = null;
+      }
+
+      if (this.widgets != null)
+      {
+        this.widgets.Clear();
+        this.widgets = null;
+      }
+    }
+
+    #endregion
+
+    #region · Command Actions ·
+
+    private bool CanCreateWidget()
+    {
+      return (this.selectedWidget != null);
+    }
+
+    /// <summary>
+    /// Handles the create widget command.
+    /// </summary>
+    private void OnCreateWidget()
+    {
+      this.GetService<IVirtualDesktopManager>()
+          .Show(this.selectedWidget.CreateView() as IDesktopElement);
+    }
+
+    #endregion
+
+    #region · Private Methods ·
+
+    private List<string> DiscoverWidgetGroups()
+    {
+      List<string> groups = new List<string>();
+      var q = from widgetdef in this.widgets
+              select widgetdef.Group;
+
+      groups.Add(AllWidgetsKey);
+      groups.AddRange(q.Distinct().ToList());
+
+      return groups;
+    }
+
+    private List<WidgetItemViewModel> DiscoverWidgets()
+    {
+      IEnumerable<IWidget> widgetDefs = this.GetService<IWidgetConfigurationService>()
+                                            .GetWidgets();
+
+      if (widgetDefs != null)
+      {
+        var query = from widgetdef in widgetDefs
+                    select new WidgetItemViewModel(widgetdef);
+
+        return query.ToList();
+      }
+
+      return null;
+    }
+
+    #endregion
+  }
+}
\ No newline at end of file