PageRenderTime 35ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/Main/src/DynamicDataDisplay/Charts/LiveTooltips/LiveTooltipService.cs

#
C# | 221 lines | 180 code | 41 blank | 0 comment | 31 complexity | b42fba95a6e56b44015485ac3f4d20a5 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows;
  6. using System.Windows.Input;
  7. using System.Windows.Documents;
  8. using System.Windows.Controls;
  9. using System.Windows.Media;
  10. using System.Windows.Data;
  11. using System.ComponentModel;
  12. namespace Microsoft.Research.DynamicDataDisplay.Charts
  13. {
  14. public static class LiveToolTipService
  15. {
  16. # region Properties
  17. public static object GetToolTip(DependencyObject obj)
  18. {
  19. return (object)obj.GetValue(ToolTipProperty);
  20. }
  21. public static void SetToolTip(DependencyObject obj, object value)
  22. {
  23. obj.SetValue(ToolTipProperty, value);
  24. }
  25. public static readonly DependencyProperty ToolTipProperty = DependencyProperty.RegisterAttached(
  26. "ToolTip",
  27. typeof(object),
  28. typeof(LiveToolTipService),
  29. new FrameworkPropertyMetadata(null, OnToolTipChanged));
  30. private static LiveToolTip GetLiveToolTip(DependencyObject obj)
  31. {
  32. return (LiveToolTip)obj.GetValue(LiveToolTipProperty);
  33. }
  34. private static void SetLiveToolTip(DependencyObject obj, LiveToolTip value)
  35. {
  36. obj.SetValue(LiveToolTipProperty, value);
  37. }
  38. private static readonly DependencyProperty LiveToolTipProperty = DependencyProperty.RegisterAttached(
  39. "LiveToolTip",
  40. typeof(LiveToolTip),
  41. typeof(LiveToolTipService),
  42. new FrameworkPropertyMetadata(null));
  43. #region Opacity
  44. public static double GetTooltipOpacity(DependencyObject obj)
  45. {
  46. return (double)obj.GetValue(TooltipOpacityProperty);
  47. }
  48. public static void SetTooltipOpacity(DependencyObject obj, double value)
  49. {
  50. obj.SetValue(TooltipOpacityProperty, value);
  51. }
  52. public static readonly DependencyProperty TooltipOpacityProperty = DependencyProperty.RegisterAttached(
  53. "TooltipOpacity",
  54. typeof(double),
  55. typeof(LiveToolTipService),
  56. new FrameworkPropertyMetadata(1.0, OnTooltipOpacityChanged));
  57. private static void OnTooltipOpacityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  58. {
  59. LiveToolTip liveTooltip = GetLiveToolTip(d);
  60. if (liveTooltip != null)
  61. {
  62. liveTooltip.Opacity = (double)e.NewValue;
  63. }
  64. }
  65. #endregion // end of Opacity
  66. #region IsPropertyProxy property
  67. public static bool GetIsPropertyProxy(DependencyObject obj)
  68. {
  69. return (bool)obj.GetValue(IsPropertyProxyProperty);
  70. }
  71. public static void SetIsPropertyProxy(DependencyObject obj, bool value)
  72. {
  73. obj.SetValue(IsPropertyProxyProperty, value);
  74. }
  75. public static readonly DependencyProperty IsPropertyProxyProperty = DependencyProperty.RegisterAttached(
  76. "IsPropertyProxy",
  77. typeof(bool),
  78. typeof(LiveToolTipService),
  79. new FrameworkPropertyMetadata(false));
  80. #endregion // end of IsPropertyProxy property
  81. #endregion
  82. private static void OnToolTipChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  83. {
  84. FrameworkElement source = (FrameworkElement)d;
  85. if (e.NewValue == null)
  86. {
  87. source.Loaded -= source_Loaded;
  88. source.ClearValue(LiveToolTipProperty);
  89. }
  90. if (GetIsPropertyProxy(source)) return;
  91. var content = e.NewValue;
  92. DataTemplate template = content as DataTemplate;
  93. if (template != null)
  94. {
  95. content = template.LoadContent();
  96. }
  97. LiveToolTip tooltip = null;
  98. if (e.NewValue is LiveToolTip)
  99. {
  100. tooltip = e.NewValue as LiveToolTip;
  101. }
  102. else
  103. {
  104. tooltip = new LiveToolTip { Content = content };
  105. }
  106. if (tooltip == null && e.OldValue == null)
  107. {
  108. tooltip = new LiveToolTip { Content = content };
  109. }
  110. if (tooltip != null)
  111. {
  112. SetLiveToolTip(source, tooltip);
  113. if (!source.IsLoaded)
  114. {
  115. source.Loaded += source_Loaded;
  116. }
  117. else
  118. {
  119. AddTooltip(source);
  120. }
  121. }
  122. }
  123. private static void AddTooltipForElement(FrameworkElement source, LiveToolTip tooltip)
  124. {
  125. AdornerLayer layer = AdornerLayer.GetAdornerLayer(source);
  126. LiveToolTipAdorner adorner = new LiveToolTipAdorner(source, tooltip);
  127. layer.Add(adorner);
  128. }
  129. private static void source_Loaded(object sender, RoutedEventArgs e)
  130. {
  131. FrameworkElement source = (FrameworkElement)sender;
  132. if (source.IsLoaded)
  133. {
  134. AddTooltip(source);
  135. }
  136. }
  137. private static void AddTooltip(FrameworkElement source)
  138. {
  139. if (DesignerProperties.GetIsInDesignMode(source)) return;
  140. LiveToolTip tooltip = GetLiveToolTip(source);
  141. Window window = Window.GetWindow(source);
  142. FrameworkElement child = source;
  143. FrameworkElement parent = null;
  144. if (window != null)
  145. {
  146. while (parent != window)
  147. {
  148. parent = (FrameworkElement)VisualTreeHelper.GetParent(child);
  149. child = parent;
  150. if (parent == null)
  151. return;
  152. var nameScope = NameScope.GetNameScope(parent);
  153. if (nameScope != null)
  154. {
  155. string nameScopeName = nameScope.ToString();
  156. if (nameScopeName != "System.Windows.TemplateNameScope")
  157. {
  158. NameScope.SetNameScope(tooltip, nameScope);
  159. break;
  160. }
  161. }
  162. }
  163. }
  164. var binding = BindingOperations.GetBinding(tooltip, LiveToolTip.ContentProperty);
  165. if (binding != null)
  166. {
  167. BindingOperations.ClearBinding(tooltip, LiveToolTip.ContentProperty);
  168. BindingOperations.SetBinding(tooltip, LiveToolTip.ContentProperty, binding);
  169. }
  170. Binding dataContextBinding = new Binding { Path = new PropertyPath("DataContext"), Source = source };
  171. tooltip.SetBinding(LiveToolTip.DataContextProperty, dataContextBinding);
  172. tooltip.Owner = source;
  173. if (GetTooltipOpacity(source) != (double)LiveToolTipService.TooltipOpacityProperty.DefaultMetadata.DefaultValue)
  174. {
  175. tooltip.Opacity = LiveToolTipService.GetTooltipOpacity(source);
  176. }
  177. AddTooltipForElement(source, tooltip);
  178. }
  179. }
  180. }