#if WPF
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Markup;
using System.IO;
using System.Xml;
using System.Threading;
using System.Windows.Automation.Peers;
using System.Windows.Automation;
using System.Globalization;
using System.Diagnostics;
using System.Collections.ObjectModel;
using System.Collections;
#else
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.Generic;
using System.Windows.Markup;
using System.Collections.ObjectModel;
using System.Collections;
using System.IO;
#endif
namespace Visifire.Charts
{
public partial class Chart : Control
{
internal void Init()
{
SetValue(TitlesProperty, new ObservableCollection
());
Titles.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Titles_CollectionChanged);
}
#if WPF
protected override void OnTemplateChanged(ControlTemplate oldTemplate, ControlTemplate newTemplate)
{
base.OnTemplateChanged(oldTemplate, newTemplate);
}
#endif
private void Title_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (IsTemplateApplied)
{
#if WPF
Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.SystemIdle, new RenderDelegate(Render));
#else
Render();
#endif
}
}
void Titles_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
//if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
//{
// if (e.NewItems != null)
// foreach (Title title in e.NewItems)
// {
// title.PropertyChanged -= Title_PropertyChanged;
// title.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(Title_PropertyChanged);
// }
//}
if (IsTemplateApplied)
{
#if WPF
Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.SystemIdle, new RenderDelegate(Render));
#else
Render();
#endif
}
}
public ObservableCollection Titles
{
get
{
return (ObservableCollection)GetValue(TitlesProperty);
}
set
{
SetValue(TitlesProperty, value);
}
}
public static readonly DependencyProperty TitlesProperty = DependencyProperty.Register("Titles", typeof(ObservableCollection), typeof(Chart), null);
///
/// Enable auto refresh while designing in Blend.
///
public bool RefreshEnabled
{
set
{
SetValue(RefreshEnabledProperty, value);
}
get
{
return (bool)GetValue(RefreshEnabledProperty);
}
}
public static readonly DependencyProperty RefreshEnabledProperty = DependencyProperty.Register("RefreshEnabled", typeof(bool), typeof(Chart), new PropertyMetadata(OnRefreshEnabledPropertyChanged));
private static void OnRefreshEnabledPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Chart c = d as Chart;
if (c.IsTemplateApplied)
{
#if WPF
c.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.SystemIdle, new RenderDelegate(c.Render));
#else
c.Render();
#endif
}
}
///
/// Currently visible ChartArea
///
internal ChartArea ChartArea
{
get;
set;
}
///
/// Center visual panel of the chart control
///
internal StackPanel CenterPanel
{
get;
set;
}
///
/// Root visual element of the chart control
///
internal Grid RootElement
{
get;
set;
}
///
/// Flag if template is already applied
///
internal Boolean IsTemplateApplied
{
get;
set;
}
///
/// On Template applied
///
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
RootElement = GetTemplateChild("RootElement") as Grid;
CenterPanel = GetTemplateChild("CenterPanel") as StackPanel;
IsTemplateApplied = true;
if (RootElement == null)
{
ApplyDefaultTemplate();
}
}
public List GetTitlesDockedInsidePlotArea()
{
if (Titles != null)
{
var titlesDockedInsidePlotArea =
from title in Titles
where (title.DockInsidePlotArea == true)
select title;
return titlesDockedInsidePlotArea.ToList();
}
return null;
}
public List GetTitlesDockedOutSidePlotArea()
{
if (Titles != null)
{
var titlesDockedOutSidePlotArea =
from title in Titles
where (title.DockInsidePlotArea == false)
select title;
return titlesDockedOutSidePlotArea.ToList();
}
else
return null;
}
///
/// Apply style on a existing Chart without rerender the chart
///
public void ApplyStyleProperties()
{
}
///
/// Create visual tree before rendering
///
///
private ChartArea CreateVisualTree()
{
ChartArea chatArea = new ChartArea(this as Chart);
chatArea.PropertyChanged += delegate(Object sender, EventArgs e)
{
if (IsTemplateApplied)
{
#if WPF
Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.SystemIdle, new RenderDelegate(Render));
#else
Render();
#endif
}
};
return chatArea;
}
///
/// Render replace the existing chart with a chart
///
internal void Render()
{
//if (!IsTemplateApplied)
// ApplyDefaultTemplate();
if (!RENDER_LOCK || RefreshEnabled)
{
RENDER_LOCK = true;
ChartArea chartArea = CreateVisualTree();
if (chartArea != null)
{
chartArea.Loaded += delegate(object sender, RoutedEventArgs e)
{
if (ChartArea != null)
RootElement.Children.Remove(ChartArea);
ChartArea = sender as ChartArea;
(sender as ChartArea).Visibility = Visibility.Visible;
RENDER_LOCK = false;
RootElement.UpdateLayout();
};
RootElement.Children.Add(chartArea);
}
}
}
///
/// Apply default template if required
///
internal void ApplyDefaultTemplate()
{
String defaultTemplateString = ""
+ " "
+ ""
+ " "
+ "";
#if WPF
Template = (ControlTemplate)XamlReader.Load(new XmlTextReader(new StringReader(defaultTemplateString)));
#else
Template = System.Windows.Markup.XamlReader.Load(defaultTemplateString) as ControlTemplate;
#endif
ApplyTemplate();
IsTemplateApplied = true;
}
#if WPF
internal delegate void RenderDelegate();
#endif
protected bool RENDER_LOCK = false;
}
}