/* Copyright (C) 2008 Webyog Softworks Private Limited This file is a part of Visifire Charts. Visifire is a free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with Visifire Charts. If not, see . If GPL is not suitable for your products or company, Webyog provides Visifire under a flexible commercial license designed to meet your specific usage and distribution requirements. If you have already obtained a commercial license from Webyog, you can use this file under those license terms. */ using System; using System.Windows.Input; using System.Windows; using System.ComponentModel; using Visifire.Charts; #if SL using System.Windows.Browser; #endif namespace Visifire.Commons { /// /// Base class for all Visifire elements including chart /// public abstract class VisifireElement: System.Windows.Controls.Control { #region Public Methods /// /// Initializes a new instance of the Visifire.Commons.VisifireElement class /// public VisifireElement() { } #if SL /// /// Sets value for specific property of chart. /// This function is used for setting property from JavaScript only /// /// Name of the property as String /// Property Value as String [System.Windows.Browser.ScriptableMember()] public void SetPropertyFromJs(String propertyName, String value) { JsHelper.SetProperty(this, propertyName, value); } #endif #endregion #region Public Properties /// /// Name of the object /// #if SL [ScriptableMember] #endif public new String Name { get { return (String)GetValue(NameProperty); } set { SetValue(NameProperty, value); } } /// /// ToolTipText Property /// public virtual String ToolTipText { get { return (String)GetValue(ToolTipTextProperty); } set { SetValue(ToolTipTextProperty, value); } } /// /// Identifies the Visifire.Charts.VisifireElement.ToolTipText dependency property. /// /// /// The identifier for the Visifire.Charts.VisifireElement.ToolTipText dependency property. /// public static readonly DependencyProperty ToolTipTextProperty = DependencyProperty.Register ("ToolTipText", typeof(String), typeof(VisifireElement), new PropertyMetadata(String.Empty, ToolTipTextPropertyChanged)); /// /// ToolTipText property changed Event handler /// /// DependencyObject /// DependencyPropertyChangedEventArgs internal static void ToolTipTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { (d as VisifireElement).OnToolTipTextPropertyChanged((String)e.NewValue); } /// /// OnToolTipTextPropertyChanged call back virtual function /// /// internal virtual void OnToolTipTextPropertyChanged(String newValue) { } /// /// TextParser is used to parse text /// /// String unParsed /// parsed as string public virtual string TextParser(String unParsed) { return unParsed; } /// /// TextParser is used to parse ToolTipText /// /// String unParsed /// parsed as string public virtual string ParseToolTipText(String unParsed) { return TextParser(unParsed); } #endregion #region Public Events /// /// Event handler for the MouseLeftButtonDown event /// #if SL [ScriptableMember] #endif public new event MouseButtonEventHandler MouseLeftButtonDown { remove { _onMouseLeftButtonDown -= value; if (EventChanged != null) EventChanged(this, null); } add { _onMouseLeftButtonDown += value; if (EventChanged != null) EventChanged(this, null); } } /// /// Event handler for the MouseLeftButtonUp event /// #if SL [ScriptableMember] #endif public new event MouseButtonEventHandler MouseLeftButtonUp { remove { _onMouseLeftButtonUp -= value; if (EventChanged != null) EventChanged(this, null); } add { _onMouseLeftButtonUp += value; if (EventChanged != null) EventChanged(this, null); } } #if WPF /// /// Event handler for the MouseRightButtonDown event /// public new event MouseButtonEventHandler MouseRightButtonDown { remove { _onMouseRightButtonDown -= value; if (EventChanged != null) EventChanged(this, null); } add { _onMouseRightButtonDown += value; if (EventChanged != null) EventChanged(this, null); } } /// /// Event handler for the MouseRightButtonUp event /// public new event MouseButtonEventHandler MouseRightButtonUp { remove { _onMouseRightButtonUp -= value; if (EventChanged != null) EventChanged(this, null); } add { _onMouseRightButtonUp += value; if (EventChanged != null) EventChanged(this, null); } } #endif /// /// Event handler for the MouseEnter event /// #if SL [ScriptableMember] #endif public new event EventHandler MouseEnter { remove { _onMouseEnter -= value; if (EventChanged != null) EventChanged(this, null); } add { _onMouseEnter += value; if (EventChanged != null) EventChanged(this, null); } } /// /// Event handler for the MouseLeave event /// #if SL [ScriptableMember] #endif public new event EventHandler MouseLeave { remove { _onMouseLeave -= value; if (EventChanged != null) EventChanged(this, null); } add { _onMouseLeave += value; if (EventChanged != null) EventChanged(this, null); } } /// /// Event handler for the MouseMove event /// #if SL [ScriptableMember] #endif public new event EventHandler MouseMove { remove { _onMouseMove -= value; if (EventChanged != null) EventChanged(this, null); } add { _onMouseMove += value; if (EventChanged != null) EventChanged(this, null); } } #endregion #region Protected Methods #endregion #region Internal Properties #endregion #region Private Delegates #endregion #region Private Methods /// /// MouseEnter event handler for href /// /// FrameworkElement /// MouseEventArgs private void Element_MouseEnter(object sender, MouseEventArgs e) { (sender as FrameworkElement).Cursor = Cursors.Hand; } /// /// MouseLeftButtonUp event handler for href /// /// FrameworkElement /// MouseButtonEventArgs private void Element_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { #if WPF System.Diagnostics.Process.Start("explorer.exe", _tempHref); #else System.Windows.Browser.HtmlPage.Window.Navigate(new Uri(VisifireControl.GetAbsolutePath(_tempHref)), _tempHrefTarget.ToString()); #endif } /// /// MouseMove event handler for displaying tooltip /// /// FrameworkElement /// MouseEventArgs private void VisualObject_MouseLeave(object sender, MouseEventArgs e) { String text = _element.ParseToolTipText(_element.ToolTipText); if (_control._toolTip.Text == text) _control._toolTip.Hide(); } /// /// MouseEnter event handler for displaying tooltip /// /// FrameworkElement /// MouseEventArgs private void VisualObject_MouseEnter(object sender, MouseEventArgs e) { if (!String.IsNullOrEmpty(_control.ToolTipText) && _control != _element) return; UpdateToolTip(sender, e); } /// /// MouseMove event handler for displaying tooltip /// /// FrameworkElement /// MouseEventArgs private void VisualObject_MouseMove(object sender, MouseEventArgs e) { if (!String.IsNullOrEmpty(_control.ToolTipText) && _control != _element) return; UpdateToolTip(sender, e); } /// /// Update TextProperty of the tooltip element from ToolTipTextProperty of VisifireElement /// /// FrameworkElement /// MouseEventArgs private void UpdateToolTip(object sender, MouseEventArgs e) { if (!String.IsNullOrEmpty(_control.ToolTipText) && _control != _element) return; if (_element.ToolTipText == null) { return; } else { String text = _element.ParseToolTipText(_element.ToolTipText); if (!String.IsNullOrEmpty(text)) { _control._toolTip.Text = text; if (_control.ToolTipEnabled) _control._toolTip.Show(); (_control as Chart).UpdateToolTipPosition(sender, e); } } } #endregion #region Private Events /// /// Handler for MouseLeftButtonDown event /// private event MouseButtonEventHandler _onMouseLeftButtonDown; /// /// Handler for MouseLeftButtonUp event /// private event MouseButtonEventHandler _onMouseLeftButtonUp; #if WPF /// /// Handler for MouseRightButtonDown event /// private event MouseButtonEventHandler _onMouseRightButtonDown; /// /// Handler for MouseRightButtonUp event /// private event MouseButtonEventHandler _onMouseRightButtonUp; #endif /// /// Handler for MouseEnter event /// private event EventHandler _onMouseEnter; /// /// Handler for MouseLeave event /// private event EventHandler _onMouseLeave; /// /// Handler for MouseMove event /// private event EventHandler _onMouseMove; #endregion #region Internal Methods /// /// Attach events to a visual /// /// Object with which event is attached /// FrameworkElement internal static void AttachEvents2Visual(VisifireElement obj, FrameworkElement visual) { if (visual != null) AttachEvents2Visual(obj, obj, visual); } internal MouseButtonEventHandler GetMouseLeftButtonDownEventHandler() { return _onMouseLeftButtonDown; } internal MouseButtonEventHandler GetMouseLeftButtonUpEventHandler() { return _onMouseLeftButtonUp; } /// /// Attach events to a visual /// /// Object with which event is attached /// sender will be passed to the event-handler /// visual object with which event will be attached internal static void AttachEvents2Visual(VisifireElement obj, VisifireElement senderElement, FrameworkElement visual) { if (visual == null) return; //if (senderElement != null) // visual.Tag = senderElement; if (obj._onMouseEnter != null) visual.MouseEnter += delegate(object sender, MouseEventArgs e) { if (obj._onMouseEnter != null) obj._onMouseEnter(senderElement, e); }; if (obj._onMouseLeave != null) visual.MouseLeave += delegate(object sender, MouseEventArgs e) { if (obj._onMouseLeave != null) obj._onMouseLeave(senderElement, e); }; PlotArea plotArea = obj as PlotArea; object eventHandler; if (plotArea != null) { eventHandler = plotArea.GetMouseLeftButtonDownEventHandler(); } else { eventHandler = obj._onMouseLeftButtonDown; } if (eventHandler != null) visual.MouseLeftButtonDown += delegate(object sender, MouseButtonEventArgs e) { if (plotArea != null) { plotArea.FireMouseLeftButtonDownEvent(e); } else { if (obj._onMouseLeftButtonDown != null) { obj._onMouseLeftButtonDown(senderElement, e); } } }; if (plotArea != null) { eventHandler = plotArea.GetMouseLeftButtonUpEventHandler(); } else { eventHandler = obj._onMouseLeftButtonUp; } if (eventHandler != null) visual.MouseLeftButtonUp += delegate(object sender, MouseButtonEventArgs e) { if (obj.GetType().Equals(typeof(PlotArea))) { (obj as PlotArea).FireMouseLeftButtonUpEvent(e); } else { if (obj._onMouseLeftButtonUp != null) obj._onMouseLeftButtonUp(senderElement, e); } }; if (plotArea != null) eventHandler = plotArea.GetMouseMoveEventHandler(); else eventHandler = obj._onMouseMove; if (eventHandler != null) visual.MouseMove += delegate(object sender, MouseEventArgs e) { if (obj.GetType().Equals(typeof(PlotArea))) { (obj as PlotArea).FireMouseMoveEvent(e); } else { if (obj._onMouseMove != null) obj._onMouseMove(senderElement, e); } }; #region RightMouseButtonEvents4WPF #if WPF object eventHandler4RightMouseButton; if (plotArea != null) { eventHandler4RightMouseButton = plotArea.GetMouseRightButtonDownEventHandler(); } else { eventHandler4RightMouseButton = obj._onMouseRightButtonDown; } if (eventHandler4RightMouseButton != null) visual.MouseRightButtonDown += delegate(object sender, MouseButtonEventArgs e) { if (plotArea != null) { plotArea.FireMouseRightButtonDownEvent(e); } else { if (obj._onMouseRightButtonDown != null) { obj._onMouseRightButtonDown(senderElement, e); } } }; if (plotArea != null) { eventHandler4RightMouseButton = plotArea.GetMouseRightButtonUpEventHandler(); } else { eventHandler4RightMouseButton = obj._onMouseRightButtonUp; } if (eventHandler4RightMouseButton != null) visual.MouseRightButtonUp += delegate(object sender, MouseButtonEventArgs e) { if (plotArea != null) { plotArea.FireMouseRightButtonUpEvent(e); } else { if (obj._onMouseRightButtonUp != null) { obj._onMouseRightButtonUp(senderElement, e); } } }; #endif #endregion } /// /// Attach events to a Area visual /// /// Object with which event is attached /// sender will be passed to the event-handler /// visual object with which event will be attached internal static void AttachEvents2AreaVisual(VisifireElement obj, VisifireElement senderElement, FrameworkElement visual) { if (visual == null) return; if (obj._onMouseEnter != null) visual.MouseEnter += delegate(object sender, MouseEventArgs e) { if (obj._onMouseEnter != null) { DataPoint dp = null; if (obj.GetType().Equals(typeof(DataSeries))) dp = (obj as DataSeries).GetNearestDataPointOnMouseEvent(e); else dp = (obj as DataPoint).Parent.GetNearestDataPointOnMouseEvent(e); if (obj.GetType().Equals(typeof(DataPoint))) { if ((dp as VisifireElement)._onMouseEnter != null) dp._onMouseEnter(dp, e); } else obj._onMouseEnter(dp, e); } }; if (obj._onMouseLeave != null) visual.MouseLeave += delegate(object sender, MouseEventArgs e) { if (obj._onMouseLeave != null) { DataPoint dp = null; if (obj.GetType().Equals(typeof(DataSeries))) dp = (obj as DataSeries).GetNearestDataPointOnMouseEvent(e); else dp = (obj as DataPoint).Parent.GetNearestDataPointOnMouseEvent(e); if (obj.GetType().Equals(typeof(DataPoint))) { if ((dp as VisifireElement)._onMouseLeave != null) dp._onMouseLeave(dp, e); } else obj._onMouseLeave(dp, e); } }; object eventHandler; eventHandler = obj._onMouseLeftButtonDown; if (eventHandler != null) visual.MouseLeftButtonDown += delegate(object sender, MouseButtonEventArgs e) { if (obj._onMouseLeftButtonDown != null) { DataPoint dp = null; if (obj.GetType().Equals(typeof(DataSeries))) dp = (obj as DataSeries).GetNearestDataPointOnMouseButtonEvent(e); else dp = (obj as DataPoint).Parent.GetNearestDataPointOnMouseButtonEvent(e); if (obj.GetType().Equals(typeof(DataPoint))) { if((dp as VisifireElement)._onMouseLeftButtonDown != null) dp._onMouseLeftButtonDown(dp, e); } else obj._onMouseLeftButtonDown(dp, e); } }; eventHandler = obj._onMouseLeftButtonUp; if (eventHandler != null) visual.MouseLeftButtonUp += delegate(object sender, MouseButtonEventArgs e) { if (obj._onMouseLeftButtonUp != null) { DataPoint dp = null; if(obj.GetType().Equals(typeof(DataSeries))) dp = (obj as DataSeries).GetNearestDataPointOnMouseButtonEvent(e); else dp = (obj as DataPoint).Parent.GetNearestDataPointOnMouseButtonEvent(e); if (obj.GetType().Equals(typeof(DataPoint))) { if ((dp as VisifireElement)._onMouseLeftButtonUp != null) dp._onMouseLeftButtonUp(dp, e); } else obj._onMouseLeftButtonUp(dp, e); } }; eventHandler = obj._onMouseMove; if (eventHandler != null) visual.MouseMove += delegate(object sender, MouseEventArgs e) { if (obj._onMouseMove != null) { DataPoint dp = null; if (obj.GetType().Equals(typeof(DataSeries))) dp = (obj as DataSeries).GetNearestDataPointOnMouseEvent(e); else dp = (obj as DataPoint).Parent.GetNearestDataPointOnMouseEvent(e); if (obj.GetType().Equals(typeof(DataPoint))) { if ((dp as VisifireElement)._onMouseMove != null) dp._onMouseMove(dp, e); } else obj._onMouseMove(dp, e); } }; #region RightMouseButtonEvents4WPF #if WPF object eventHandler4RightMouseButton; eventHandler4RightMouseButton = obj._onMouseRightButtonDown; if (eventHandler4RightMouseButton != null) visual.MouseRightButtonDown += delegate(object sender, MouseButtonEventArgs e) { if (obj._onMouseRightButtonDown != null) { DataPoint dp = null; if (obj.GetType().Equals(typeof(DataSeries))) dp = (obj as DataSeries).GetNearestDataPointOnMouseButtonEvent(e); else dp = (obj as DataPoint).Parent.GetNearestDataPointOnMouseButtonEvent(e); if (obj.GetType().Equals(typeof(DataPoint))) { if ((dp as VisifireElement)._onMouseRightButtonDown != null) dp._onMouseRightButtonDown(dp, e); } else obj._onMouseRightButtonDown(dp, e); } }; eventHandler4RightMouseButton = obj._onMouseRightButtonUp; if (eventHandler4RightMouseButton != null) visual.MouseRightButtonUp += delegate(object sender, MouseButtonEventArgs e) { if (obj._onMouseRightButtonUp != null) { DataPoint dp = null; if (obj.GetType().Equals(typeof(DataSeries))) dp = (obj as DataSeries).GetNearestDataPointOnMouseButtonEvent(e); else dp = (obj as DataPoint).Parent.GetNearestDataPointOnMouseButtonEvent(e); if (obj.GetType().Equals(typeof(DataPoint))) { if ((dp as VisifireElement)._onMouseRightButtonUp != null) dp._onMouseRightButtonUp(dp, e); } else obj._onMouseRightButtonUp(dp, e); } }; #endif #endregion } /// /// Attach MouseDownEvent event to a visual /// /// obj with which event is attached /// sender will be passed as sender while firing event /// visual object with which event will be attached internal static void AttachEvents2Visual4MouseDownEvent(VisifireElement obj, VisifireElement senderElement, FrameworkElement visual) { if (visual == null) return; #if WPF visual.MouseLeftButtonDown += delegate(object sender, MouseButtonEventArgs e) { if (obj._onMouseLeftButtonDown != null) obj._onMouseLeftButtonDown(senderElement, e); }; #endif } /// /// Attach tooltip with a framework element /// /// Control reference /// Object reference /// FrameworkElements list public void AttachToolTip(VisifireControl control, ObservableObject element, System.Collections.Generic.List visualElements) { // Show ToolTip on mouse move over the chart element foreach (FrameworkElement visualElement in visualElements) AttachToolTip(control, element, visualElement); } /// /// Attach Href with a framework element /// /// Chart Control /// FrameworkElement /// Href /// HrefTarget internal void AttachHref(VisifireControl control, FrameworkElement element, String href, HrefTargets hrefTarget) { if (element == null) return; if (!String.IsNullOrEmpty(href)) { _tempHref = href; _tempHrefTarget = hrefTarget; element.MouseEnter -= Element_MouseEnter; element.MouseEnter += Element_MouseEnter; element.MouseLeftButtonUp -= Element_MouseLeftButtonUp; element.MouseLeftButtonUp += new MouseButtonEventHandler(Element_MouseLeftButtonUp); } } /// /// Attach tooltip with a framework element /// /// Control reference /// FrameworkElement /// FrameworlElement internal void AttachToolTip(VisifireControl control, VisifireElement element, FrameworkElement visualObject) { if (visualObject == null || control == null || element == null) return; _control = control; _element = element; _visualObject = visualObject; visualObject.MouseMove += new MouseEventHandler(VisualObject_MouseMove); visualObject.MouseEnter += new MouseEventHandler(VisualObject_MouseEnter); // Hide ToolTip on mouse leave from the chart element visualObject.MouseLeave += new MouseEventHandler(VisualObject_MouseLeave); } /// /// Detach ToolTip from a visual element /// /// FrameworkElement internal void DetachToolTip(FrameworkElement visualObject) { if (visualObject != null) { visualObject.MouseMove -= new MouseEventHandler(VisualObject_MouseMove); visualObject.MouseEnter -= new MouseEventHandler(VisualObject_MouseEnter); // Hide ToolTip on mouse leave from the chart element visualObject.MouseLeave -= new MouseEventHandler(VisualObject_MouseLeave); } } #endregion #region Internal Events /// /// EventChanged event is fired if any event is attached /// internal event EventHandler EventChanged; #endregion #region Data /// /// Visifire Control reference /// private VisifireControl _control; /// /// Visifire element reference /// private VisifireElement _element; /// /// Visual object reference /// private FrameworkElement _visualObject; /// /// Temp Href /// internal String _tempHref; /// /// Temp HrefTarget /// internal HrefTargets _tempHrefTarget; #endregion } }