using System;
using System.Windows;
using System.Linq;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Visifire.Commons;
using Visifire.Charts;
internal class InteractivityHelper
{
public InteractivityHelper()
{
}
public static Brush SELECTED_MARKER_BORDER_COLOR;
public static Brush SELECTED_MARKER_FILL_COLOR;
///
/// Apply border effect
///
/// Shape
/// BorderStyles
/// Double
/// Brush
public static void ApplyBorderEffect(Shape shape, BorderStyles borderStyles, Double borderThickness, Brush borderColor)
{
shape.Stroke = borderColor;
shape.StrokeThickness = borderThickness;
shape.StrokeStartLineCap = PenLineCap.Round;
shape.StrokeEndLineCap = PenLineCap.Round;
shape.StrokeDashOffset = 0.4;
shape.StrokeLineJoin = PenLineJoin.Bevel;
shape.StrokeDashArray = Graphics.LineStyleToStrokeDashArray(borderStyles.ToString());
}
///
/// Apply border effect
///
public static void ApplyBorderEffect(Shape shape, BorderStyles borderStyles, Brush fillColor, Double scaleFactor, Double borderThickness, Brush borderColor)
{
ApplyBorderEffect(shape, borderStyles, borderThickness, borderColor);
shape.Fill = fillColor;
shape.Height *= scaleFactor;
shape.Width *= scaleFactor;
shape.SetValue(Canvas.TopProperty, -shape.Height / 2);
shape.SetValue(Canvas.LeftProperty, -shape.Width / 2);
}
///
/// Remove border effect
///
public static void RemoveBorderEffect(Shape shape, BorderStyles borderStyle, Double borderThickness, Brush lineColor)
{
shape.Stroke = lineColor;
shape.StrokeThickness = borderThickness;
shape.StrokeStartLineCap = PenLineCap.Flat;
shape.StrokeEndLineCap = PenLineCap.Flat;
shape.StrokeDashOffset = 0;
shape.StrokeLineJoin = PenLineJoin.Bevel;
shape.StrokeDashArray = Graphics.LineStyleToStrokeDashArray(borderStyle.ToString());
}
///
/// Remove border effect
///
public static void RemoveBorderEffect(Shape shape, BorderStyles borderStyle, Double borderThickness, Brush lineColor, Brush fillColor, Double width, Double height)
{
RemoveBorderEffect(shape, borderStyle, borderThickness, lineColor);
shape.Fill = fillColor;
shape.Height = height;
shape.Width = width;
shape.SetValue(Canvas.TopProperty, -shape.Height / 2);
shape.SetValue(Canvas.LeftProperty, -shape.Width / 2);
}
///
/// Apply on mouse over opacity interactivity to a framework element
///
///
public static void ApplyOnMouseOverOpacityInteractivity(FrameworkElement element)
{
if (element == null)
return;
RemoveOnMouseOverOpacityInteractivity(element, Double.NaN);
element.MouseEnter += new MouseEventHandler(element_MouseEnter);
element.MouseLeave += new MouseEventHandler(element_MouseLeave);
}
///
/// Apply on mouse over opacity interactivity to all associated visual elements
///
///
public static void ApplyOnMouseOverOpacityInteractivity2Visuals(FrameworkElement element)
{
if (element == null)
return;
element.MouseEnter += new MouseEventHandler(MultipleElements_MouseEnter);
element.MouseLeave += new MouseEventHandler(MultipleElements_MouseLeave);
}
///
/// MouseMove event handler for removing opacity effect on multiple segments
///
/// FrameworkElement
/// MouseEventArgs
private static void MultipleElements_MouseLeave(object sender, MouseEventArgs e)
{
FrameworkElement fe = sender as FrameworkElement;
RemoveOpacity(sender as FrameworkElement);
if (fe.Tag == null) return;
DataPoint dp = (fe.Tag as ElementData).Element as DataPoint;
foreach (FrameworkElement fe1 in dp.Faces.VisualComponents)
{
if (fe1 != sender)
RemoveOpacity(fe1 as FrameworkElement);
}
}
///
/// MouseEnter event handler for applying opacity effect on multiple segments
///
/// FrameworkElement
/// MouseEventArgs
private static void MultipleElements_MouseEnter(object sender, MouseEventArgs e)
{
FrameworkElement fe = sender as FrameworkElement;
ApplyOpacity(sender as FrameworkElement);
if (fe.Tag == null) return;
DataPoint dp = (fe.Tag as ElementData).Element as DataPoint;
foreach (FrameworkElement fe1 in dp.Faces.VisualComponents)
{
if (fe1 != sender)
ApplyOpacity(fe1 as FrameworkElement);
}
}
#if WPF
///
/// Detach OpacityProperty of a Frameworkelement from a Storyboard
///
/// FrameworkElement
/// Double
public static void DetachOpacityPropertyFromAnimation(FrameworkElement fe, Double resetTo)
{
fe.BeginAnimation(FrameworkElement.OpacityProperty, null);
fe.Opacity = resetTo;
}
#endif
///
/// Remove OnMouseOver opacity interactivity
///
///
///
public static void RemoveOnMouseOverOpacityInteractivity(FrameworkElement element, Double resetOpacity)
{
if (element == null)
return;
if (!Double.IsNaN(resetOpacity))
element.Opacity = resetOpacity;
element.MouseEnter -= new MouseEventHandler(element_MouseEnter);
element.MouseLeave -= new MouseEventHandler(element_MouseLeave);
element.MouseEnter -= new MouseEventHandler(MultipleElements_MouseEnter);
element.MouseLeave -= new MouseEventHandler(MultipleElements_MouseLeave);
}
///
/// Event handler for MouseLeave event of a FrameworkElement
///
/// object
/// MouseEventArgs
private static void element_MouseLeave(object sender, MouseEventArgs e)
{
RemoveOpacity(sender as FrameworkElement);
}
///
/// Event handler for MouseEnter event of a FrameworkElement
///
/// object
/// MouseEventArgs
private static void element_MouseEnter(object sender, MouseEventArgs e)
{
ApplyOpacity(sender as FrameworkElement);
}
///
/// Apply opacity
///
/// FrameworkElement
private static void ApplyOpacity(FrameworkElement obj)
{
if (obj != null)
{
obj.Opacity *= OPACITY_FACTOR;
}
}
///
/// Remove opacity
///
/// FrameworkElement
private static void RemoveOpacity(FrameworkElement obj)
{
if (obj != null)
{
obj.Opacity /= OPACITY_FACTOR;
}
}
///
/// Opacity effect factor
///
private static Double OPACITY_FACTOR = 0.6;
}