Mercurial > silverbladetech
diff Chronosv2/source/Presentation/Windows/Controls/WidgetElement.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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Chronosv2/source/Presentation/Windows/Controls/WidgetElement.cs Tue Feb 21 17:25:44 2012 +0700 @@ -0,0 +1,270 @@ +/* +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.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Input; +using System.Windows.Media; +using Chronos.Extensions.Windows; + +namespace Chronos.Presentation.Windows.Controls +{ + /// <summary> + /// Provides the ability to create, configure, show, and manage the lifetime of widgets + /// </summary> + [TemplatePart(Name = WidgetElement.PART_MinimizeButton, Type = typeof(ButtonBase))] + [TemplatePart(Name = WidgetElement.PART_CloseButton, Type = typeof(ButtonBase))] + [TemplatePart(Name = WidgetElement.PART_ContentPresenter, Type = typeof(ContentPresenter))] + public class WidgetElement + : DesktopElement + { + #region · Constants · + + private const string PART_ContentPresenter = "PART_ContentPresenter"; + private const string PART_MinimizeButton = "PART_MinimizeButton"; + private const string PART_CloseButton = "PART_CloseButton"; + + #endregion + + #region · Dependency Properties · + + /// <summary> + /// Identifies the Title dependency property. + /// </summary> + public static readonly DependencyProperty TitleProperty = + DependencyProperty.Register("Title", typeof(String), typeof(WidgetElement), + new FrameworkPropertyMetadata(String.Empty)); + + /// <summary> + /// Identifies the WindowState dependency property. + /// </summary> + public static readonly DependencyProperty WidgetStateProperty = + DependencyProperty.Register("WidgetState", typeof(WindowState), typeof(WidgetElement), + new FrameworkPropertyMetadata(WindowState.Normal)); + + /// <summary> + /// Identifies the ShowMinimizeButton dependency property. + /// </summary> + public static readonly DependencyProperty ShowMinimizeButtonProperty = + DependencyProperty.Register("ShowMinimizeButton", typeof(bool), typeof(WidgetElement), + new FrameworkPropertyMetadata(true)); + + #endregion + + #region · Routed Commands · + + /// <summary> + /// Minimize window command + /// </summary> + public static RoutedCommand MinimizeCommand; + + #endregion + + #region · Static Constructor · + + /// <summary> + /// Initializes the <see cref="WidgetElement"/> class. + /// </summary> + static WidgetElement() + { + WidgetElement.DefaultStyleKeyProperty.OverrideMetadata(typeof(WidgetElement), + new FrameworkPropertyMetadata(typeof(WidgetElement))); + + WidgetElement.MinimizeCommand = new RoutedCommand("Minimize", typeof(WidgetElement)); + + Control.IsTabStopProperty.OverrideMetadata(typeof(WidgetElement), + new FrameworkPropertyMetadata(false)); + + KeyboardNavigation.DirectionalNavigationProperty.OverrideMetadata( + typeof(WidgetElement), new FrameworkPropertyMetadata(KeyboardNavigationMode.Cycle)); + + KeyboardNavigation.TabNavigationProperty.OverrideMetadata( + typeof(WidgetElement), new FrameworkPropertyMetadata(KeyboardNavigationMode.Cycle)); + + KeyboardNavigation.ControlTabNavigationProperty.OverrideMetadata( + typeof(WidgetElement), new FrameworkPropertyMetadata(KeyboardNavigationMode.Once)); + + if (!DesignMode.IsInDesignMode + && Application.Current.GetRenderTier() != RenderTier.Tier2) + { + WidgetElement.CacheModeProperty.OverrideMetadata(typeof(WidgetElement), + new FrameworkPropertyMetadata(new BitmapCache { EnableClearType = true, RenderAtScale = 1, SnapsToDevicePixels = true })); + } + } + + #endregion + + #region · Fields · + + private Size previousSize; + + #endregion + + #region · Properties · + + /// <summary> + /// Gets or sets a value that indicates whether a window is restored or minimized. + /// This is a dependency property. + /// </summary> + /// <value>A <see cref="WindowState"/> that determines whether a window is restored, minimized, or maximized. The default is Normal (restored).</value> + public WindowState WidgetState + { + get { return (WindowState)base.GetValue(WidgetStateProperty); } + set + { + if ((WindowState)this.GetValue(WidgetStateProperty) != value) + { + base.SetValue(WidgetStateProperty, value); + } + + this.AdjustLayout(); + } + } + + /// <summary> + /// Gets a value that indicates whether the minimize button is visible. + /// This is a dependency property. + /// </summary> + public bool ShowMinimizeButton + { + get { return (bool)base.GetValue(ShowMinimizeButtonProperty); } + set { base.SetValue(ShowMinimizeButtonProperty, value); } + } + + /// <summary> + /// Gets or sets the Widget title + /// </summary> + public string Title + { + get { return (string)base.GetValue(TitleProperty); } + set { base.SetValue(TitleProperty, value); } + } + + #endregion + + #region · Internal Properties · + + /// <summary> + /// Gets the Widget real Height based on the <see cref="WidgetState"/>. + /// </summary> + /// <remarks>Used for Widget serialization on <see cref="DesktopSerializer"/> class</remarks> + internal double RealHeight + { + get + { + if (this.WidgetState == WindowState.Minimized) + { + return this.previousSize.Height; + } + + return this.Height; + } + } + + #endregion + + #region · Constructors · + + /// <summary> + /// Initializes a new instance of the <see cref="WidgetElement"/> class. + /// </summary> + public WidgetElement() + : base() + { + CommandBinding bindingMinimize = new CommandBinding(WidgetElement.MinimizeCommand, new ExecutedRoutedEventHandler(this.OnMinimizeWindow)); + this.CommandBindings.Add(bindingMinimize); + } + + #endregion + + #region · Methods · + + /// <summary> + /// Closes the desktop element + /// </summary> + public override void Close() + { + this.CommandBindings.Clear(); + + base.Close(); + } + + #endregion + + #region · Protected Methods + + /// <summary> + /// Focuses the window + /// </summary> + protected override void GiveFocus() + { + this.MoveFocus(FocusNavigationDirection.Next); + } + + #endregion + + #region · Command Actions · + + /// <summary> + /// Occurs when the widget is going to be minimized + /// </summary> + /// <param name="sender"></param> + /// <param name="e"></param> + private void OnMinimizeWindow(object sender, ExecutedRoutedEventArgs e) + { + if (this.WidgetState != WindowState.Minimized) + { + this.WidgetState = WindowState.Minimized; + } + else + { + this.WidgetState = WindowState.Normal; + } + } + + #endregion + + #region · Private Methods · + + private void AdjustLayout() + { + if (this.WidgetState == WindowState.Minimized) + { + this.previousSize = new Size(this.Width, this.Height); + this.Height = 35; + this.CanResize = false; + } + else + { + this.Height = this.previousSize.Height; + this.previousSize = new Size(this.Width, this.Height); + this.CanResize = true; + } + } + + #endregion + } +}