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; }