/*
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
}
}