diff Chronosv2/source/Presentation/Windows/DesktopSerializer.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 09d18d6e5f40
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Chronosv2/source/Presentation/Windows/DesktopSerializer.cs	Tue Feb 21 17:25:44 2012 +0700
@@ -0,0 +1,240 @@
+/*
+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.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Markup;
+using System.Xml;
+using System.Xml.Linq;
+using Chronos.Extensions.Windows;
+using Chronos.Presentation.Core.Services;
+using Chronos.Presentation.Core.Windows;
+using Chronos.Presentation.Windows.Controls;
+using nRoute.ViewServices;
+
+namespace Chronos.Presentation.Windows
+{
+    /// <summary>
+    /// Desktop serializer for <see cref="E:Chronos.Presentation.Windows.Elements.WidgetElement"/> and 
+    /// <see cref="E:Chronos.Presentation.Windows.Elements.ShortcutElement"/> contents.
+    /// </summary>
+    internal static class DesktopSerializer
+    {
+        #region · Save/Load Methods ·
+
+        /// <summary>
+        /// Loads the contents of the specified filename in the given <see cref="Desktop"/> instance.
+        /// </summary>
+        /// <param name="desktop">The desktop.</param>
+        /// <param name="filename">The filename.</param>
+        public static void Load(Desktop desktop, string filename)
+        {
+            XElement root = LoadFromFile(filename);
+
+            if (root == null)
+            {
+                return;
+            }
+
+            // Widget Deserialization
+            IEnumerable<XElement> widgetsXML = root.Elements("WidgetElements").Elements("WidgetElement");
+
+            foreach (XElement widgetXML in widgetsXML)
+            {
+                Guid id = new Guid(widgetXML.Element("Id").Value);
+                WidgetElement item = DeserializeWidget(widgetXML, id, 0, 0);
+
+                desktop.AddElement(item, item.GetPosition());
+            }
+
+            // Shortcut Deserialization
+            IEnumerable<XElement> shortcutsXML = root.Elements("ShortcutElements").Elements("ShortcutElement");
+            int ti = 0;
+
+            foreach (XElement shortcutXML in shortcutsXML)
+            {
+                Guid id = new Guid(shortcutXML.Element("Id").Value);
+                ShortcutElement item = DeserializeShortcut(shortcutXML, id, 0, 0);
+
+                item.TabIndex = ++ti;
+
+                desktop.AddElement(item, item.GetPosition());
+            }
+        }
+
+        /// <summary>
+        /// Saves the contents of the specified <see cref="Desktop"/> instance in the given file.
+        /// </summary>
+        /// <param name="desktop">The desktop.</param>
+        /// <param name="filename">The filename.</param>
+        public static void Save(Desktop desktop, string filename)
+        {
+            IEnumerable<WidgetElement> widgets = desktop.Children.OfType<WidgetElement>();
+            IEnumerable<ShortcutElement> shortcuts = desktop.Children.OfType<ShortcutElement>();
+
+            XElement widgetsItemsXML = SerializeWidgets(widgets);
+            XElement shortcutsItemsXML = SerializeShortcuts(shortcuts);
+
+            XElement root = new XElement("Root");
+
+            root.Add(widgetsItemsXML);
+            root.Add(shortcutsItemsXML);
+
+            SaveFile(filename, root);
+        }
+
+        #endregion
+
+        #region · Serialization Methods ·
+
+        private static XElement LoadFromFile(string filename)
+        {
+            try
+            {
+                if (File.Exists(filename))
+                {
+                    return XElement.Load(filename);
+                }
+            }
+            catch (Exception)
+            {
+                IShowMessageViewService showMessageService = ViewServiceLocator.GetViewService<IShowMessageViewService>();
+
+                showMessageService.ButtonSetup = DialogButton.Ok;
+                showMessageService.Caption = "Chronos - Error en la carga del escritorio";
+                showMessageService.Text = "No ha sido posible realizar la carga del escritorio.";
+
+                showMessageService.ShowMessage();
+            }
+
+            return null;
+        }
+
+        private static void SaveFile(string filename, XElement xElement)
+        {
+            try
+            {
+                xElement.Save(filename);
+            }
+            catch (Exception)
+            {
+                IShowMessageViewService showMessageService = ViewServiceLocator.GetViewService<IShowMessageViewService>();
+
+                showMessageService.ButtonSetup = DialogButton.Ok;
+                showMessageService.Caption = "Chronos - Error al guardar el estado del escritorio";
+                showMessageService.Text = "No ha sido posible al guardar el estado del escritorio.";
+
+                showMessageService.ShowMessage();
+            }
+        }
+
+        private static XElement SerializeWidgets(IEnumerable<WidgetElement> widgets)
+        {
+            XElement serializedItems = new XElement
+                ("WidgetElements",
+                    from item in widgets
+                    select new XElement
+                    ("WidgetElement",
+                                new XElement("Type", item.GetType().AssemblyQualifiedName),
+                                new XElement("Left", Canvas.GetLeft(item)),
+                                new XElement("Top", Canvas.GetTop(item)),
+                                new XElement("Width", item.Width),
+                                new XElement("Height", item.RealHeight),
+                                new XElement("Id", item.Id),
+                                new XElement("zIndex", Canvas.GetZIndex(item)),
+                                new XElement("WidgetState", item.WidgetState),
+                                new XElement("ShowMinimizeButton", item.ShowMinimizeButton)
+                    )
+                );
+
+            return serializedItems;
+        }
+
+        private static WidgetElement DeserializeWidget(XElement itemXML, Guid id, double offsetX, double offsetY)
+        {
+            WidgetElement item = (WidgetElement)Activator.CreateInstance(Type.GetType(itemXML.Element("Type").Value));
+
+            item.ShowMinimizeButton = Boolean.Parse(itemXML.Element("ShowMinimizeButton").Value);
+            item.StartupLocation    = StartupPosition.Manual;
+            
+            item.Move(Double.Parse(itemXML.Element("Left").Value, CultureInfo.InvariantCulture) + offsetX,
+                      Double.Parse(itemXML.Element("Top").Value, CultureInfo.InvariantCulture) + offsetY);
+            item.SetZIndex(Int32.Parse(itemXML.Element("zIndex").Value));
+
+            WindowState widgetState = (WindowState)Enum.Parse(typeof(WindowState), itemXML.Element("WidgetState").Value as String);
+
+            item.Width      = Double.Parse(itemXML.Element("Width").Value, CultureInfo.InvariantCulture);
+            item.Height     = Double.Parse(itemXML.Element("Height").Value, CultureInfo.InvariantCulture);
+
+            if (widgetState == WindowState.Minimized)
+            {
+                item.WidgetState = widgetState;
+            }
+
+            return item;
+        }
+
+        private static XElement SerializeShortcuts(IEnumerable<ShortcutElement> shortcuts)
+        {
+            XElement serializedItems = new XElement("ShortcutElements",
+                                       from item in shortcuts
+                                       let contentXaml = XamlWriter.Save(((ShortcutElement)item).DataContext)
+                                       select new XElement("ShortcutElement",
+                                                  new XElement("Left", Canvas.GetLeft(item)),
+                                                  new XElement("Top", Canvas.GetTop(item)),
+                                                  new XElement("Width", item.Width),
+                                                  new XElement("Height", item.Height),
+                                                  new XElement("Id", item.Id),
+                                                  new XElement("zIndex", Canvas.GetZIndex(item)),
+                                                  new XElement("DataContext", contentXaml)
+                                              ));
+
+            return serializedItems;
+        }
+
+        private static ShortcutElement DeserializeShortcut(XElement itemXML, Guid id, double offsetX, double offsetY)
+        {
+            ShortcutElement item = new ShortcutElement
+            {
+                DataContext = XamlReader.Load(XmlReader.Create(new StringReader(itemXML.Element("DataContext").Value))),
+                Width       = Double.Parse(itemXML.Element("Width").Value, CultureInfo.InvariantCulture),
+                Height      = Double.Parse(itemXML.Element("Height").Value, CultureInfo.InvariantCulture)
+            };
+
+            item.StartupLocation = StartupPosition.Manual;
+            item.Move(Double.Parse(itemXML.Element("Left").Value, CultureInfo.InvariantCulture) + offsetX,
+                      Double.Parse(itemXML.Element("Top").Value, CultureInfo.InvariantCulture) + offsetY);
+            item.SetZIndex(Int32.Parse(itemXML.Element("zIndex").Value));
+
+            return item;
+        }
+
+        #endregion
+    }
+}
\ No newline at end of file