using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Drawing.Design; using System.Drawing.Drawing2D; using System.Windows.Forms; using System.Windows.Forms.Design; using System.Windows.Forms.Design.Behavior; using DevComponents.DotNetBar; using DevComponents.DotNetBar.Charts; using DevComponents.DotNetBar.Charts.Style; using Microsoft.Win32; namespace DevComponents.Charts.Design { /// /// ChartControlDesigner /// public class ChartControlDesigner : ControlDesigner { static Random _Rand = new Random(); #region Private variables private ChartControl _ChartControl; private IDesignerHost _DesignerHost; private DesignerActionListCollection _ActionLists; private DesignerActionUIService _ActionUIService; private IComponentChangeService _ChangeService; private ISelectionService _SelectionService; private IMenuCommandService _MenuCommandService; private IMenuEditorService _MenuEditorService; private IToolboxService _ToolboxService; private bool _InCopyItem; private bool _DragMoving; private bool _UseGlyphs; #endregion #region Public properties #region ChangeService public IComponentChangeService ChangeService { get { return (_ChangeService); } } #endregion #region ControlDesigner public ControlDesigner ControlDesigner { get { return (this); } } #endregion #region DesignerHost public IDesignerHost DesignerHost { get { return (_DesignerHost); } } #endregion #region InCopyItem public bool InCopyItem { get { return (_InCopyItem); } set { _InCopyItem = value; } } #endregion #region InCopyItem public bool DragMoving { get { return (_DragMoving); } set { _DragMoving = value; } } #endregion #region SelectionService public ISelectionService SelectionService { get { return (_SelectionService); } } #endregion #region MenuEditorService public IMenuEditorService MenuEditorService { get { return (_MenuEditorService); } } #endregion #region MenuCommandService public IMenuCommandService MenuCommandService { get { return (_MenuCommandService); } } #endregion #region ToolboxService public IToolboxService ToolboxService { get { return (_ToolboxService); } } #endregion #endregion #region Initialize /// /// Initializes our designer /// /// public override void Initialize(IComponent component) { base.Initialize(component); if (component.Site.DesignMode == true) _ChartControl = component as ChartControl; _DesignerHost = GetService(typeof(IDesignerHost)) as IDesignerHost; if (_DesignerHost != null) _DesignerHost.LoadComplete += DhLoadComplete; InitializeServices(); } #region InitializeServices private void InitializeServices() { _ChangeService = GetService(typeof(IComponentChangeService)) as IComponentChangeService; _SelectionService = GetService(typeof(ISelectionService)) as ISelectionService; _ActionUIService = GetService(typeof(DesignerActionUIService)) as DesignerActionUIService; _MenuCommandService = GetService(typeof(IMenuCommandService)) as IMenuCommandService; _MenuEditorService = GetService(typeof(IMenuEditorService)) as IMenuEditorService; _ToolboxService = GetService(typeof(IToolboxService)) as IToolboxService; _ChangeService.ComponentChanged += ChangeService_ComponentChanged; _ChangeService.ComponentAdded += ChangeService_ComponentAdded; _ChangeService.ComponentRemoved += ChangeService_ComponentRemoved; } #endregion #endregion #region InitializeNewComponent public override void InitializeNewComponent(IDictionary defaultValues) { base.InitializeNewComponent(defaultValues); ChartStyleDialog csd = new ChartStyleDialog(); csd.ShowDialog(); if (Component != null && Component.Site != null && Component.Site.DesignMode == true) { if (_ChartControl != null) { IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost)); if (dh == null) return; DesignerTransaction dt = dh.CreateTransaction(); try { IComponentChangeService change = GetService(typeof(IComponentChangeService)) as IComponentChangeService; if (change != null) change.OnComponentChanging(this.Component, null); CreateNewChart(csd); if (change != null) change.OnComponentChanged(_ChartControl, null, null, null); } finally { dt.Commit(); } } } #if !TRIAL ChartControl chartControl = Control as ChartControl; if (chartControl != null) chartControl.LicenseKey = GetLicenseKey(); #endif } #region CreateNewChart private void CreateNewChart(ChartStyleDialog csd) { SetupScrollBarStyles(); switch (csd.CbSelected) { case "cbPointPlot": InitDefaultPlot(SeriesType.Point); break; case "cbLinePlot": InitDefaultPlot(SeriesType.Line); break; case "cbMultiAxis": InitMultiAxis(); break; case "cbVDotPlot": InitDotPlot(SeriesType.HorizontalDot); break; case "cbHDotPlot": InitDotPlot(SeriesType.VerticalDot); break; case "cbMultiChart": InitMultiChart(); break; case "cbBubblePlot": InitBubblePlot(); break; case "cbStepLine": ChartSeries series1 = InitDefaultPlot(SeriesType.Line); if (series1 != null) series1.ChartLineDisplayMode = ChartLineDisplayMode.DisplayStepLine; break; case "cbLineArea": ChartSeries series2 = InitDefaultPlot(SeriesType.Line); if (series2 != null) series2.ChartLineAreaDisplayMode = ChartLineAreaDisplayMode.DisplayLine; break; case "cbBarV": InitBar(SeriesType.VerticalBar, false); break; case "cbBarH": InitBar(SeriesType.HorizontalBar, false); break; case "cbRangeBarV": InitBar(SeriesType.VerticalBar, true); break; case "cbRangeBarH": InitBar(SeriesType.HorizontalBar, true); break; case "cbHiLoVBox": InitHiLoBar(SeriesType.VerticalHiLoBar, HiLoBarType.Box); break; case "cbHiLoHBox": InitHiLoBar(SeriesType.HorizontalHiLoBar, HiLoBarType.Box); break; case "cbHiLoVLine": InitHiLoBar(SeriesType.VerticalHiLoBar, HiLoBarType.Line); break; case "cbHiLoHLine": InitHiLoBar(SeriesType.HorizontalHiLoBar, HiLoBarType.Line); break; case "cbPieSimple": InitPieSimple(); break; case "cbPieDonut": InitPieDonut(); break; case "cbPieExtent": InitPieExtent(); break; case "cbPieExtentFill": InitPieExtentFill(); break; case "cbPieMultiRing": InitPieMultiRing(); break; case "cbPieMultiRingRev": InitPieMultiRingRev(); break; case "cbPieMultiSeries": InitPieMultiSeries(); break; case "cbPieShowSingleRing": InitPieShowSingleRing(); break; case "cbPieGridAngle": InitPieGridAngle(); break; case "cbPieOverlay": InitPieOverlay(); break; default: InitBlankChart(); break; } } #region InitDefaultPie private PieChart InitDefaultPie(int seriesCount, int ringCount, bool extent) { PieChart pieChart = AddPieChart(); if (pieChart != null) { for (int i = 0; i < seriesCount; i++) { PieSeries series = GetNewPieSeries(pieChart); if (series != null) AddSimulatedPieData(series, ringCount, extent); pieChart.ChartSeries.Add(series); } _ChartControl.ChartPanel.ChartContainers.Add(pieChart); } return (pieChart); } #endregion #region InitPieSimple private void InitPieSimple() { InitDefaultPie(1, 1, false); } #endregion #region InitPieDonut private void InitPieDonut() { PieChart pieChart = InitDefaultPie(1, 1, false); pieChart.InnerRadius = .2; } #endregion #region InitPieExtent private void InitPieExtent() { InitDefaultPie(1, 1, true); } #endregion #region InitPieExtentFill private void InitPieExtentFill() { PieChart pieChart = InitDefaultPie(1, 1, true); pieChart.SubSliceVisualLayout.ShowSliceWhiteSpace = Tbool.True; } #endregion #region InitPieMultiRing private void InitPieMultiRing() { InitDefaultPie(1, 2, false); } #endregion #region InitPieMultiRingRev private void InitPieMultiRingRev() { PieChart pieChart = InitDefaultPie(1, 2, false); pieChart.ReverseRingOrder = true; } #endregion #region InitPieMultiSeries private void InitPieMultiSeries() { InitDefaultPie(2, 1, false); } #endregion #region InitPieShowSingleRing private void InitPieShowSingleRing() { PieChart pieChart = InitDefaultPie(1, 2, false); pieChart.InnerRadius = .3; pieChart.ShowAllRings = Tbool.False; pieChart.MouseDoubleClickSliceAction = MouseDoubleClickSliceAction.ChangeActiveRing; } #endregion #region InitPieGridAngle private void InitPieGridAngle() { PieChart pieChart = InitDefaultPie(1, 1, true); pieChart.ShowPieGrid = true; pieChart.SubSliceVisualLayout.AngleMargin = 2; } #endregion #region InitPieOverlay private void InitPieOverlay() { PieChart pieChart = InitDefaultPie(2, 1, true); pieChart.ShowPieGrid = true; pieChart.SeriesOverlayEnabled = true; pieChart.ChartControl.UpdateLayout(); pieChart.SubSliceVisualLayout.AngleMargin = 2; for (int i = 0; i < pieChart.ChartSeries.Count; i++) { PieSeries series = pieChart.ChartSeries[i]; UpdateOverlayBackground(series.SeriesPoints); } } #region UpdateOverlayBackground private void UpdateOverlayBackground(PieSeriesPointCollection spc) { if (spc.Count > 0) { foreach (PieSeriesPoint psp in spc) { psp.SliceVisualStyles.Default.Background = new Background(Color.FromArgb(110, psp.DefaultPaletteColor)); UpdateOverlayBackground(psp.SeriesPoints); } } } #endregion #endregion #region AddPieChart private PieChart AddPieChart() { PieChart pieChart = new PieChart(); if (pieChart != null) { pieChart.Name = _ChartControl.ChartPanel.ChartContainers.GetUniqueName("PieChart"); pieChart.IsExploded = true; SetupPieChartStyle(pieChart); SetupContainerStyle(pieChart); SetupPieLegend(pieChart); AddChartTitle(pieChart); } return (pieChart); } #region SetupPieChartStyle private void SetupPieChartStyle(PieChart pieChart) { PieChartVisualStyle pstyle = pieChart.ChartVisualStyle; pstyle.Background = new Background(Color.White); pstyle.BorderThickness = new Thickness(1); pstyle.BorderColor = new BorderColor(Color.Black); pstyle.Padding = new DevComponents.DotNetBar.Charts.Style.Padding(6); } #endregion #region SetupPieLegend private void SetupPieLegend(BaseChart baseChart) { ChartLegend legend = baseChart.Legend; legend.ShowCheckBoxes = false; legend.Placement = Placement.Outside; legend.Alignment = Alignment.BottomCenter; legend.Direction = Direction.LeftToRight; legend.AlignVerticalItems = true; legend.MaxVerticalPct = 90; ChartLegendVisualStyle lstyle = legend.ChartLegendVisualStyles.Default; lstyle.BorderThickness = new Thickness(1); lstyle.BorderColor = new BorderColor(Color.Black); lstyle.Margin = new DevComponents.DotNetBar.Charts.Style.Padding(4); lstyle.Padding = new DevComponents.DotNetBar.Charts.Style.Padding(4); lstyle.Background = new Background(Color.FromArgb(200, Color.White)); } #endregion #region AddPieTitle private void AddPieTitle(ChartXy chartXy) { ChartTitle title = new ChartTitle(); title.Name = chartXy.Titles.GetUniqueName(); title.Text = "PieChart Title"; title.XyAlignment = XyAlignment.Top; ChartTitleVisualStyle tstyle = title.ChartTitleVisualStyle; tstyle.Padding = new DevComponents.DotNetBar.Charts.Style.Padding(8); tstyle.Font = new Font("Georgia", 16); tstyle.TextColor = Color.Navy; tstyle.Alignment = Alignment.MiddleCenter; chartXy.Titles.Add(title); } #endregion #endregion #region InitBlankChart private void InitBlankChart() { ChartPanel chartPanel = _ChartControl.ChartPanel; chartPanel.EmptyText = "No Charts Defined."; chartPanel.ContainerVisualStyles.Default.BorderColor = new BorderColor(Color.Black); chartPanel.ContainerVisualStyles.Default.BorderThickness = new Thickness(1); } #endregion #region InitDefaultPlot private ChartSeries InitDefaultPlot(SeriesType seriesType) { ChartXy chartXy = AddChartXy(); if (chartXy != null) { ChartSeries series = GetNewChartSeries(chartXy, seriesType); if (series != null) AddSimulatedData(series); _ChartControl.ChartPanel.ChartContainers.Add(chartXy); chartXy.ChartSeries.Add(series); return (series); } return (null); } #endregion #region InitMultiAxis private void InitMultiAxis() { ChartXy chartXy = AddChartXy(); if (chartXy != null) { ChartAxisX axisX = new ChartAxisX(); axisX.Name = chartXy.AncillaryAxesX.GetUniqueName(); chartXy.AncillaryAxesX.Add(axisX); ChartAxisY axisY = new ChartAxisY(); axisY.Name = chartXy.AncillaryAxesY.GetUniqueName(); axisY.AxisAlignment = AxisAlignment.Near; chartXy.AncillaryAxesY.Add(axisY); ChartSeries series = GetNewChartSeries(chartXy, SeriesType.Line); if (series != null) { series.ChartLineDisplayMode = ChartLineDisplayMode.DisplayPoints; AddSimulatedData(series); series.SeriesPoints.Add(new SeriesPoint(0d, 50d)); series.SeriesPoints.Add(new SeriesPoint(12d, 0d)); chartXy.ChartSeries.Add(series); } series = GetNewChartSeries(chartXy, SeriesType.Line); if (series != null) { series.ChartLineDisplayMode = ChartLineDisplayMode.DisplaySpline; AddSimulatedData(series); series.SeriesPoints.Add(new SeriesPoint(0d, 0d)); series.SeriesPoints.Add(new SeriesPoint(12d, 50d)); series.AxisX = axisX; series.AxisY = axisY; chartXy.ChartSeries.Add(series); } _ChartControl.ChartPanel.ChartContainers.Add(chartXy); } } #endregion #region InitDotPlot private void InitDotPlot(SeriesType chartType) { ChartXy chartXy = AddChartXy(); if (chartXy != null) { chartXy.Legend.Alignment = Alignment.TopRight; chartXy.AxisX.MinGridInterval = 20; chartXy.AxisY.MinGridInterval = 20; chartXy.AxisX.MinorTickmarks.TickmarkCount = 0; chartXy.AxisY.MinorTickmarks.TickmarkCount = 0; chartXy.MinContentSize = new Size(100, 100); ChartSeries series = GetNewChartSeries(chartXy, chartType); if (series != null) { PointMarkerVisualStyle mstyle = series.ChartSeriesVisualStyle.MarkerVisualStyle; mstyle.Size = new Size(10, 10); mstyle.Background = new Background(Color.CornflowerBlue); mstyle.BorderColor = Color.Black; mstyle.BorderWidth = 1; AddSimulatedDotPlotData(series); } _ChartControl.ChartPanel.ChartContainers.Add(chartXy); chartXy.ChartSeries.Add(series); } } #endregion #region InitMultiChart private void InitMultiChart() { for (int i = 0; i < 4; i++) InitDefaultPlot(SeriesType.Line); } #endregion #region InitBubblePlot private void InitBubblePlot() { ChartXy chartXy = AddChartXy(); if (chartXy != null) { ChartSeries series = GetNewChartSeries(chartXy, SeriesType.Bubble); if (series != null) { PointMarkerVisualStyle mstyle = series.ChartSeriesVisualStyle.MarkerVisualStyle; mstyle.Background = new Background(Color.FromArgb(150, Color.DarkGreen)); mstyle.BorderWidth = 1; mstyle.BorderColor = Color.DarkGreen; AddSimulatedBubbleData(series); chartXy.ChartSeries.Add(series); } series = GetNewChartSeries(chartXy, SeriesType.Bubble); if (series != null) { PointMarkerVisualStyle mstyle = series.ChartSeriesVisualStyle.MarkerVisualStyle; mstyle.Background = new Background(Color.FromArgb(150, Color.DarkBlue)); mstyle.BorderWidth = 1; mstyle.BorderColor = Color.DarkBlue; AddSimulatedBubbleData(series); chartXy.ChartSeries.Add(series); } _ChartControl.ChartPanel.ChartContainers.Add(chartXy); } } #endregion #region InitBar private void InitBar(SeriesType seriesType, bool rangeBar) { ChartXy chartXy = AddChartXy(); if (chartXy != null) { chartXy.BarShadingEnabled = Tbool.True; ChartSeries series = GetNewChartSeries(chartXy, seriesType); if (series != null) { if (rangeBar == true) AddSimulatedRangeData(series); else AddSimulatedData(series); _ChartControl.ChartPanel.ChartContainers.Add(chartXy); chartXy.ChartSeries.Add(series); } } } #endregion #region InitHiLoBar private void InitHiLoBar(SeriesType seriesType, HiLoBarType hiloType) { ChartXy chartXy = AddChartXy(); if (chartXy != null) { chartXy.BarShadingEnabled = Tbool.True; chartXy.AxisX.GridSpacing = 1; chartXy.AxisY.GridSpacing = 1; if (seriesType == SeriesType.VerticalHiLoBar) { chartXy.AxisX.AxisMargins = 0; chartXy.AxisX.MinorTickmarks.TickmarkCount = 0; chartXy.AxisY.MinorTickmarks.TickmarkCount = 1; } else { chartXy.AxisY.AxisMargins = 0; chartXy.AxisX.MinorTickmarks.TickmarkCount = 1; chartXy.AxisY.MinorTickmarks.TickmarkCount = 0; } ChartSeries series = GetNewChartSeries(chartXy, seriesType); if (series != null) { series.HiLoBarType = hiloType; ChartHiLoBarVisualStyle style = series.ChartSeriesVisualStyle.HiLoBarVisualStyle; style.ShowWhiskerCaps = Tbool.True; style.UseAlternateSegmentStyle = Tbool.True; style.DefaultSegmentStyle.BoxBackground = new Background(Color.Green); style.DefaultSegmentStyle.Default.LineColor = Color.Green; style.DefaultSegmentStyle.Default.LineWidth = 2; style.AlternateSegmentStyle.BoxBackground = new Background(Color.Red); style.AlternateSegmentStyle.Default.LineColor = Color.Crimson; style.AlternateSegmentStyle.Default.LineWidth = 2; AddSimulatedHiLoData(series); _ChartControl.ChartPanel.ChartContainers.Add(chartXy); chartXy.ChartSeries.Add(series); } } } #endregion #region SetupScrollBarStyles private void SetupScrollBarStyles() { ScrollBarVisualStyle moStyle = _ChartControl.DefaultVisualStyles.HScrollBarVisualStyles.MouseOver; moStyle.ArrowBackground = new Background(Color.AliceBlue); moStyle.ThumbBackground = new Background(Color.AliceBlue); ScrollBarVisualStyle smoStyle = _ChartControl.DefaultVisualStyles.HScrollBarVisualStyles.SelectedMouseOver; smoStyle.ArrowBackground = new Background(Color.White); smoStyle.ThumbBackground = new Background(Color.White); moStyle = _ChartControl.DefaultVisualStyles.VScrollBarVisualStyles.MouseOver; moStyle.ArrowBackground = new Background(Color.AliceBlue); moStyle.ThumbBackground = new Background(Color.AliceBlue); smoStyle = _ChartControl.DefaultVisualStyles.VScrollBarVisualStyles.SelectedMouseOver; smoStyle.ArrowBackground = new Background(Color.White); smoStyle.ThumbBackground = new Background(Color.White); } #endregion #region AddChartXy private ChartXy AddChartXy() { ChartXy chartXy = new ChartXy(); if (chartXy != null) { chartXy.Name = _ChartControl.ChartPanel.ChartContainers.GetUniqueName("ChartXy"); chartXy.ChartCrosshair.AxisOrientation = AxisOrientation.X; chartXy.ChartCrosshair.ShowValueXLine = true; chartXy.ChartCrosshair.ShowValueYLine = true; chartXy.ChartCrosshair.ShowValueXLabels = true; chartXy.ChartCrosshair.ShowValueYLabels = true; chartXy.ChartCrosshair.HighlightPoints = true; chartXy.ChartCrosshair.ShowCrosshairLabels = true; chartXy.ChartCrosshair.CrosshairLabelMode = CrosshairLabelMode.NearestSeries; chartXy.ChartCrosshair.CrosshairVisualStyle.Background = new Background(Color.White); SetupChartStyle(chartXy); SetupContainerStyle(chartXy); SetupChartAxes(chartXy); SetupChartLegend(chartXy); AddChartTitle(chartXy); } return (chartXy); } #region SetupChartAxes private void SetupChartAxes(ChartXy chartXy) { // X Axis ChartAxis axis = chartXy.AxisX; axis.MajorGridLines.GridLinesVisualStyle.LineColor = Color.Gainsboro; axis.MinorGridLines.GridLinesVisualStyle.LineColor = Color.WhiteSmoke; // Y Axis axis = chartXy.AxisY; axis.AxisAlignment = AxisAlignment.Far; axis.MajorGridLines.GridLinesVisualStyle.LineColor = Color.Gainsboro; axis.MinorGridLines.GridLinesVisualStyle.LineColor = Color.WhiteSmoke; } #endregion #region SetupChartStyle private void SetupChartStyle(ChartXy chartXy) { ChartXyVisualStyle xystyle = chartXy.ChartVisualStyle; xystyle.Background = new Background(Color.White); xystyle.BorderThickness = new Thickness(1); xystyle.BorderColor = new BorderColor(Color.Black); xystyle.Padding = new DevComponents.DotNetBar.Charts.Style.Padding(6); ChartSeriesVisualStyle cstyle = chartXy.ChartSeriesVisualStyle; PointMarkerVisualStyle pstyle = cstyle.MarkerHighlightVisualStyle; pstyle.Background = new Background(Color.Yellow); pstyle.Type = PointMarkerType.Ellipse; pstyle.Size = new Size(15, 15); } #endregion #endregion #region SetupContainerStyle private void SetupContainerStyle(BaseChart baseChart) { ContainerVisualStyle dstyle = baseChart.ContainerVisualStyles.Default; dstyle.Background = new Background(Color.White); dstyle.BorderColor = new BorderColor(Color.DimGray); dstyle.BorderThickness = new Thickness(1); dstyle.DropShadow.Enabled = Tbool.True; dstyle.Padding = new DevComponents.DotNetBar.Charts.Style.Padding(6); } #endregion #region SetupChartLegend private void SetupChartLegend(BaseChart baseChart) { ChartLegend legend = baseChart.Legend; legend.ShowCheckBoxes = false; legend.Placement = Placement.Inside; legend.Alignment = Alignment.TopLeft; legend.AlignVerticalItems = true; legend.Direction = Direction.LeftToRight; legend.MaxHorizontalPct = 75; ChartLegendVisualStyle lstyle = legend.ChartLegendVisualStyles.Default; lstyle.BorderThickness = new Thickness(1); lstyle.BorderColor = new BorderColor(Color.Black); lstyle.Margin = new DevComponents.DotNetBar.Charts.Style.Padding(8); lstyle.Padding = new DevComponents.DotNetBar.Charts.Style.Padding(4); lstyle.Background = new Background(Color.FromArgb(200, Color.White)); } #endregion #region AddChartTitle private void AddChartTitle(BaseChart baseChart) { ChartTitle title = new ChartTitle(); title.Name = baseChart.Titles.GetUniqueName(); title.Text = "Chart Title"; title.XyAlignment = XyAlignment.Top; ChartTitleVisualStyle tstyle = title.ChartTitleVisualStyle; tstyle.Padding = new DevComponents.DotNetBar.Charts.Style.Padding(8); tstyle.Font = new Font("Georgia", 16); tstyle.TextColor = Color.Navy; tstyle.Alignment = Alignment.MiddleCenter; baseChart.Titles.Add(title); } #endregion #region GetNewChartSeries private ChartSeries GetNewChartSeries(ChartXy chartXy, SeriesType chartType) { ChartSeries series = new ChartSeries(chartType); if (series != null) { series.Name = chartXy.ChartSeries.GetUniqueName(); series.CrosshairHighlightPoints = Tbool.True; } return (series); } #endregion #region GetNewPieSeries private PieSeries GetNewPieSeries(PieChart pieChart) { PieSeries series = new PieSeries(); if (series != null) series.Name = pieChart.ChartSeries.GetUniqueName(); return (series); } #endregion #region AddSimulatedData private void AddSimulatedData(ChartSeries series) { for (int i = 0; i < 10; i++) { double d = Convert.ToDouble(i); series.SeriesPoints.Add( new SeriesPoint(d, Convert.ToDouble(_Rand.Next(2, 50)))); } } #endregion #region AddSimulatedDotPlotData private void AddSimulatedDotPlotData(ChartSeries series) { for (int i = 0; i < 10; i++) { series.SeriesPoints.Add( new SeriesPoint(i, _Rand.Next(0, 10))); } } #endregion #region AddSimulatedBubbleData private void AddSimulatedBubbleData(ChartSeries series) { for (int i = 0; i < 5; i++) { double d = Convert.ToDouble(i); series.SeriesPoints.Add( new SeriesPoint(d, Convert.ToDouble(_Rand.Next(0, 10)), Convert.ToDouble(_Rand.Next(10, 1000)))); } } #endregion #region AddSimulatedRangeData private void AddSimulatedRangeData(ChartSeries series) { for (int i = 0; i < 10; i++) { double d = Convert.ToDouble(i); double v1 = Convert.ToDouble(_Rand.Next(2, 50)); double v2 = v1 + Convert.ToDouble(_Rand.Next(10, 20)); series.SeriesPoints.Add(new SeriesPoint(d, v1, v2)); } } #endregion #region AddSimulatedHiLoData private void AddSimulatedHiLoData(ChartSeries series) { for (int i = 0; i < 5; i++) { double d = Convert.ToDouble(i); double lo = _Rand.NextDouble() * 5; double hi = lo + _Rand.NextDouble() * 5 + 10; double mid = Math.Floor((hi + lo) / 2); double open = mid - _Rand.NextDouble() * 5; double close = mid + _Rand.NextDouble() * 5; if (i % 2 == 1) { double swap = open; open = close; close = swap; } series.SeriesPoints.Add(new SeriesPoint(d, new object[] { hi, lo, close, open })); } } #endregion #region AddSimulatedPieData private void AddSimulatedPieData(PieSeries series, int ringCount, bool extent) { for (int i = 0; i < 5; i++) { PieSeriesPoint psp = (extent == true) ? new PieSeriesPoint("PX" + i, _Rand.Next(30, 100), _Rand.Next(30, 100)) : new PieSeriesPoint("P" + i, _Rand.Next(30, 100)); series.SeriesPoints.Add(psp); AddPieRing(psp, ringCount - 1); } } #region AddPieRing private void AddPieRing(PieSeriesPoint psp, int ringCount) { if (ringCount > 0) { for (int i = 0; i < 2; i++) { PieSeriesPoint psp2 = new PieSeriesPoint("P" + i, 50); psp.SeriesPoints.Add(psp2); AddPieRing(psp, ringCount - 1); } } } #endregion #endregion #endregion #endregion #region ChangeService #region ChangeService_ComponentChanged void ChangeService_ComponentChanged(object sender, ComponentChangedEventArgs e) { if (InCopyItem == false) { _ChartControl.UpdateLayout(); if (e.Member != null) { switch (e.Member.Name) { case "AncillaryAxesX": case "AncillaryAxesY": case "ChartContainers": case "Location": case "Titles": case "Visible": UpdateGlyphs(); break; } } else { UpdateGlyphs(); } } } #endregion #region ChangeService_ComponentAdded void ChangeService_ComponentAdded(object sender, ComponentEventArgs e) { CheckGlyphUse(); UpdateGlyphs(); } #endregion #region ChangeService_ComponentRemoved void ChangeService_ComponentRemoved(object sender, ComponentEventArgs e) { CheckGlyphUse(); UpdateGlyphs(); } #endregion #region CheckGlyphUse private void CheckGlyphUse() { _UseGlyphs = true; if (_DesignerHost is IContainer) { foreach (IComponent comp in ((IContainer)_DesignerHost).Components) { if (comp is ContextMenuStrip) { _UseGlyphs = false; break; } } } } #endregion #endregion #region UpdateGlyphs private void UpdateGlyphs() { RemoveAdorners(); AddContainerGlyphs(_ChartControl.ChartPanel); ICollection ic = _SelectionService.GetSelectedComponents(); if (ic != null) { _SelectionService.SetSelectedComponents(null); _SelectionService.SetSelectedComponents(ic); } } #endregion #region RemoveAdorners private void RemoveAdorners() { List adornerList = new List(); for (int i = 0; i < BehaviorService.Adorners.Count; i++) { Adorner adorner = BehaviorService.Adorners[i]; if (adorner.Glyphs != null && adorner.Glyphs.Count > 0) { SelectionGlyph sg = adorner.Glyphs[0] as SelectionGlyph; if (sg != null && sg.ControlDesigner == this) adornerList.Add(adorner); } } foreach (Adorner ad in adornerList) { for (int i = ad.Glyphs.Count - 1; i >= 0; i--) { SelectionGlyph sg = (SelectionGlyph)ad.Glyphs[i]; ad.Glyphs.RemoveAt(i); sg.Dispose(); } BehaviorService.Adorners.Remove(ad); } } #endregion #region ActionLists /// /// Gets our DesignerActionListCollection list /// public override DesignerActionListCollection ActionLists { get { if (_ActionLists == null) { _ActionLists = new DesignerActionListCollection(); _ActionLists.Add(new ChartControlActionList(_ChartControl)); } return (_ActionLists); } } #endregion #region Load complete private void DhLoadComplete(object sender, EventArgs e) { IDesignerHost dh = GetService(typeof(IDesignerHost)) as IDesignerHost; if (dh != null) dh.LoadComplete -= DhLoadComplete; ChartControl chartControl = Control as ChartControl; if (chartControl != null) { CheckGlyphUse(); ValidateLicenseKey(chartControl); AddContainerGlyphs(chartControl.ChartPanel); } } #endregion #region AddContainerGlyphs private void AddContainerGlyphs(ChartContainer cc) { if (_UseGlyphs == true) { if (cc.Visible == true) { AddSelectionAdorner(cc); if (cc.Legend.Visible == true) AddSelectionAdorner(cc.Legend); if (cc.Titles != null) { foreach (ChartTitle title in cc.Titles) { if (title.Visible == true) AddSelectionAdorner(title); } } if (cc is ChartPanel) { ChartPanel cp = (ChartPanel)cc; foreach (ChartContainer cont in cp.ChartContainers) { if (cont.Visible == true) AddContainerGlyphs(cont); } } else if (cc is ChartXy) { ChartXy chartXy = (ChartXy)cc; if (chartXy.AxisX.Visible == true) AddSelectionAdorner(chartXy.AxisX); if (chartXy.AxisY.Visible == true) AddSelectionAdorner(chartXy.AxisY); foreach (ChartAxis axis in chartXy.AncillaryAxesX) { if (axis.Visible == true) AddSelectionAdorner(axis); } foreach (ChartAxis axis in chartXy.AncillaryAxesY) { if (axis.Visible == true) AddSelectionAdorner(axis); } } } } } #region AddSelectionAdorner private void AddSelectionAdorner(ChartVisualElement visualItem) { if (visualItem.Visible == true) { Adorner adorner = new Adorner(); adorner.Glyphs.Add(new SelectionGlyph(this, visualItem, adorner)); BehaviorService.Adorners.Add(adorner); } } #endregion #endregion #region OnSetCursor protected override void OnSetCursor() { if (ToolboxService == null || ToolboxService.GetSelectedToolboxItem() == null) { if (DragMoving == true) { Cursor.Current = Cursors.SizeAll; } else { if (SelectionBehavior.ContextMenuActive == true) Cursor.Current = Cursors.Arrow; else base.OnSetCursor(); } } else { Control ctl1 = (Control)Component; Form form = ctl1.FindForm(); if (form != null) base.OnSetCursor(); } } #endregion #region OnMouseDragBegin protected override void OnMouseDragBegin(int x, int y) { DragMoving = true; base.OnMouseDragBegin(x, y); } #endregion #region OnMouseDragEnd protected override void OnMouseDragEnd(bool cancel) { DragMoving = false; base.OnMouseDragEnd(cancel); } #endregion #region GetLicenseKey #if !TRIAL private string GetLicenseKey() { string key = ""; RegistryKey regkey = Registry.LocalMachine.OpenSubKey("Software\\DevComponents\\Licenses", false); if (regkey != null) { object keyValue = regkey.GetValue("DevComponents.DotNetBar.DotNetBarManager2"); if (keyValue != null) key = keyValue.ToString(); } return (key); } #endif #endregion #region ValidateLicenseKey private void ValidateLicenseKey(ChartControl chartControl) { #if !TRIAL string key = GetLicenseKey(); if (key != "" && chartControl != null && chartControl.LicenseKey == "" && chartControl.LicenseKey != key) TypeDescriptor.GetProperties(chartControl)["LicenseKey"].SetValue(chartControl, key); #endif } #endregion #region SelectionGlyph public class SelectionGlyph : Glyph, IDisposable { #region Private variables private ChartControlDesigner _ControlDesigner; private Adorner _SelectionAdorner; private Control _RelatedControl; private Rectangle _Bounds; private ChartVisualElement _VisualItem; private bool _IsSelected; private Brush _SelBrush; private Brush _SelBrush2; #endregion public SelectionGlyph(ChartControlDesigner controlDesigner, ChartVisualElement visualItem, Adorner selectionAdorner) : base(new SelectionBehavior(controlDesigner)) { _VisualItem = visualItem; _ControlDesigner = controlDesigner; _SelectionAdorner = selectionAdorner; _RelatedControl = _ControlDesigner.Component as Control; _ControlDesigner.SelectionService.SelectionChanged += SelectionService_SelectionChanged; _ControlDesigner.ChangeService.ComponentChanged += ChangeService_ComponentChanged; _VisualItem.ChartControl.UpdateLayout(); CalcGlyphBounds(); } #region Public properties #region Bounds public override Rectangle Bounds { get { return (_Bounds); } } #endregion #region ControlDesigner public ChartControlDesigner ControlDesigner { get { return (_ControlDesigner); } } #endregion #region SelectionAdorner public Adorner SelectionAdorner { get { return (_SelectionAdorner); } } #endregion #region VisualItem public ChartVisualElement VisualItem { get { return (_VisualItem); } } #endregion #endregion #region Private properties #region SelBrush private Brush SelBrush { get { if (_SelBrush == null) { _SelBrush = new HatchBrush(HatchStyle.BackwardDiagonal, Color.FromArgb(20, Color.Purple), Color.Transparent); } return (_SelBrush); } set { if (_SelBrush != null) _SelBrush.Dispose(); _SelBrush = null; } } #endregion #region SelBrush2 private Brush SelBrush2 { get { if (_SelBrush2 == null) { _SelBrush2 = new HatchBrush(HatchStyle.BackwardDiagonal, Color.FromArgb(60, Color.White), Color.Transparent); } return (_SelBrush2); } set { if (_SelBrush2 != null) _SelBrush2.Dispose(); _SelBrush2 = value; } } #endregion #endregion #region Paint public override void Paint(PaintEventArgs e) { if (_ControlDesigner.SelectionService.GetComponentSelected(_VisualItem) == true) { Graphics g = e.Graphics; int n = (_VisualItem is ChartPanel || _VisualItem is ChartXy) ? -2 : 2; Rectangle r = Bounds; r.Inflate(n, n); g.RenderingOrigin = new Point(1, 0); g.FillRectangle(SelBrush, r); g.RenderingOrigin = new Point(0, 0); g.FillRectangle(SelBrush2, r); ControlPaint.DrawFocusRectangle(g, r); r.Inflate(1, 1); using (Pen pen = new Pen(Color.FromArgb(170, Color.White))) { pen.DashStyle = DashStyle.Dot; r.Height--; r.Width--; g.DrawRectangle(pen, r); } } } #endregion #region GetHitTest public override Cursor GetHitTest(Point p) { Control control = GetIt(p); if (control == _RelatedControl) { if (control.Parent != null && control.Parent.Visible == true) { ChartControlDesigner ccd = _ControlDesigner; if (ccd.ToolboxService == null || ccd.ToolboxService.GetSelectedToolboxItem() == null) { if (ccd.DragMoving == false) { if (Bounds.Contains(p)) return (Cursors.Hand); } } } } return (null); } #region GetIt private Control GetIt(Point pt) { if (_RelatedControl != null) { Control ctl = _RelatedControl.Parent; Control ctl2 = _ControlDesigner.DesignerHost.RootComponent as Control; if (ctl != null && ctl2 != null && ctl2.Parent != null) { Point pt1 = ctl.PointToScreen(Point.Empty); Point pt2 = ctl2.Parent.PointToScreen(ctl2.Parent.Location); pt.X -= (pt1.X - pt2.X); pt.Y -= (pt1.Y - pt2.Y); return (ctl.GetChildAtPoint(pt)); } } return (null); } #endregion #endregion #region SelectionService_SelectionChanged void SelectionService_SelectionChanged(object sender, EventArgs e) { bool selected = _ControlDesigner.SelectionService.GetComponentSelected(_VisualItem); if (selected == true) CalcGlyphBounds(); if (_IsSelected != selected) { _IsSelected = selected; Control ctl = _ControlDesigner.DesignerHost.RootComponent as Control; if (ctl != null) ctl.Invalidate(true); } } #endregion #region ChangeService_ComponentChanged void ChangeService_ComponentChanged(object sender, ComponentChangedEventArgs e) { if (_ControlDesigner.InCopyItem == false) { if (_IsSelected == true) { if (_VisualItem != null && _VisualItem.ChartControl != null) { _VisualItem.ChartControl.UpdateLayout(); CalcGlyphBounds(); _RelatedControl.Invalidate(); } } } } #endregion #region CalcGlyphBounds private void CalcGlyphBounds() { Rectangle bounds = _VisualItem.Bounds; if (_RelatedControl != null) { if (_VisualItem is ChartContainer) { ChartContainer cc = (ChartContainer)_VisualItem; bounds = GetAdjustedBounds(bounds, cc.EffectiveContainerStyles[StyleType.Default].Margin); } else if (_VisualItem is ChartXy) { ChartXy bc = (ChartXy)_VisualItem; bounds = GetAdjustedBounds(bounds, bc.EffectiveChartStyle.Margin); } else if (_VisualItem is ChartTitle) { ChartTitle ct = (ChartTitle)_VisualItem; bounds = GetAdjustedBounds(bounds, ct.EffectiveTitleStyle.Margin); } Point pt = _ControlDesigner.BehaviorService.ControlToAdornerWindow(_RelatedControl); bounds.Offset(pt); } _Bounds = bounds; } #region GetAdjustedBounds internal Rectangle GetAdjustedBounds(Rectangle bounds, Thickness padding) { if (padding.IsEmpty == false) { if (bounds.Height > padding.Vertical) { bounds.Y += padding.Top; bounds.Height -= padding.Vertical; } if (bounds.Width > padding.Horizontal) { bounds.X += padding.Left; bounds.Width -= padding.Horizontal; } } return (bounds); } #endregion #endregion #region Dispose public void Dispose() { SelBrush = null; SelBrush2 = null; if (_ControlDesigner != null) { _ControlDesigner.SelectionService.SelectionChanged -= SelectionService_SelectionChanged; _ControlDesigner.ChangeService.ComponentChanged -= ChangeService_ComponentChanged; } } #endregion } #endregion #region SelectionBehavior internal class SelectionBehavior : Behavior { #region Static variables static public bool ContextMenuActive; #endregion #region Private variables private IDesigner _ControlDesigner; private Control _RelatedControl; private Point _DragPoint; private bool _MouseDown; #endregion internal SelectionBehavior(IDesigner controlDesigner) { _ControlDesigner = controlDesigner; _RelatedControl = controlDesigner.Component as Control; } #region OnMouseDown public override bool OnMouseDown(Glyph g, MouseButtons button, Point mouseLoc) { SelectionGlyph sg = g as SelectionGlyph; if (button == MouseButtons.Left) { if (sg.ControlDesigner.SelectionService.GetComponentSelected(sg.VisualItem) == false) { if (ContextMenuActive == false) SelectVisualElement(sg, sg.VisualItem); } } else if (button == MouseButtons.Right) { object primarySelection = sg.ControlDesigner.SelectionService.PrimarySelection; if (CanSelectVisualItem(primarySelection, sg.VisualItem) == true) SelectVisualElement(sg, sg.VisualItem); } ContextMenuActive = false; _DragPoint = Control.MousePosition; _MouseDown = true; return (true); } #region CanSelectVisualItem private bool CanSelectVisualItem( object primarySelection, ChartVisualElement cve) { if (cve is ChartLegend || cve is ChartTitle || cve is ChartAxis) return (true); if (primarySelection == null) return (true); if (primarySelection is ChartControl) return (false); ChartVisualElement pcve = primarySelection as ChartVisualElement; if (pcve == null) return (true); return (IsChildItem(cve, pcve) == false); } #region IsChildItem private bool IsChildItem(ChartVisualElement cve, ChartVisualElement pcve) { ChartVisualElement parent = cve.Parent as ChartVisualElement; while (parent != null) { if (parent == pcve) return (true); parent = parent.Parent as ChartVisualElement; } return (false); } #endregion #endregion #region SelectVisualElement private void SelectVisualElement(SelectionGlyph sg, ChartVisualElement cve) { if (cve != null) sg.ControlDesigner.SelectionService.SetSelectedComponents(new object[] { cve }); else sg.ControlDesigner.SelectionService.SetSelectedComponents(new object[] { _RelatedControl }); _RelatedControl.Invalidate(); } #endregion #endregion #region OnMouseUp public override bool OnMouseUp(Glyph g, MouseButtons button) { ChartControlDesigner ccd = (ChartControlDesigner)_ControlDesigner; _MouseDown = false; bool value = base.OnMouseUp(g, button); if (button == MouseButtons.Right) { SelectionGlyph sg = g as SelectionGlyph; if (sg != null) { if (ShowGlyphContextMenu(g as SelectionGlyph) == true) return (true); return (true); } } return (value); } #region ShowGlyphContextMenu private bool ShowGlyphContextMenu(SelectionGlyph sg) { if (sg != null) { ChartControlDesigner ccd = (ChartControlDesigner)_ControlDesigner; Point pt = _RelatedControl.PointToClient(Control.MousePosition); ContextMenu cm = GetContextMenu(sg, ccd); if (cm != null) { ContextMenuActive = true; cm.Show(_RelatedControl, pt); return (true); } } return (false); } #region GetContextMenu private ContextMenu GetContextMenu(SelectionGlyph sg, ChartControlDesigner ccd) { ContextMenu cm = new ContextMenu(); MenuItem mi = AddMenuItem(cm, null, "View Code", new EventHandler(MenuViewCode)); ChartVisualElement cve = ccd.SelectionService.PrimarySelection as ChartVisualElement; if (cve != null) { AddMenuItem(cm, cve, "-", null); if (cve is ChartPanel) { AddMenuItem(cm, cve, "Hide Panel", new EventHandler(HideVisualItem)); if (cve.Parent != null) AddMenuItem(cm, cve, "Delete Panel", new EventHandler(DeleteChartPanel)); } else if (cve is BaseChart) { AddMenuItem(cm, cve, "Hide Chart", new EventHandler(HideVisualItem)); AddMenuItem(cm, cve, "Delete Chart", new EventHandler(DeleteChartPanel)); } else if (cve is ChartTitle) { AddMenuItem(cm, cve, "Hide Title", new EventHandler(HideVisualItem)); AddMenuItem(cm, cve, "Delete Title", new EventHandler(DeleteTitle)); AddMenuItem(cm, cve, "-", null); mi = AddMenuItem(cm, cve, "XyAlignment", null); AddSubMenuItem(mi, cve, "Top", new EventHandler(AlignTitleTop)); AddSubMenuItem(mi, cve, "Left", new EventHandler(AlignTitleLeft)); AddSubMenuItem(mi, cve, "Bottom", new EventHandler(AlignTitleBottom)); AddSubMenuItem(mi, cve, "Right", new EventHandler(AlignTitleRight)); } else if (cve is ChartAxis) { ChartAxis axis = (ChartAxis)cve; AddMenuItem(cm, cve, "Hide Axis", new EventHandler(HideVisualItem)); if (axis.IsPrimaryAxis == false) AddMenuItem(cm, cve, "Delete Axis", new EventHandler(DeleteAxis)); AddMenuItem(cm, cve, "-", null); mi = AddMenuItem(cm, cve, "Alignment", null); AddSubMenuItem(mi, cve, "Near", new EventHandler(AlignAxisNear)); AddSubMenuItem(mi, cve, "Far", new EventHandler(AlignAxisFar)); } else if (cve is ChartLegend) { ChartLegend legend = (ChartLegend)cve; AddMenuItem(cm, cve, "Hide Legend", new EventHandler(HideVisualItem)); } } AddMenuItem(cm, null, "-", null); int n = cm.MenuItems.Count; AddParentSelect(cm, ccd.SelectionService.PrimarySelection); if (cm.MenuItems.Count == n) cm.MenuItems.RemoveAt(cm.MenuItems.Count - 1); return (cm); } #region AddMenuItem private MenuItem AddMenuItem(ContextMenu cm, ChartVisualElement cve, string text, EventHandler e) { MenuItem mi = new MenuItem(text, e); mi.Tag = cve; cm.MenuItems.Add(mi); return (mi); } #endregion #region AddSubMenuItem private MenuItem AddSubMenuItem(MenuItem mi, ChartVisualElement cve, string text, EventHandler e) { MenuItem submi = new MenuItem(text, e); submi.Tag = cve; mi.MenuItems.Add(submi); return (submi); } #endregion #region AddParentSelect private void AddParentSelect(ContextMenu cm, object psel) { ChartVisualElement cve = psel as ChartVisualElement; if (cve != null) { ChartVisualElement parent = cve.Parent as ChartVisualElement; while (parent != null) { if (string.IsNullOrEmpty(parent.Name) == false) { AddMenuItem(cm, parent, "Select '" + parent.Name + "'", new EventHandler(SelectVisualItem)); } parent = parent.Parent as ChartVisualElement; } string s = string.IsNullOrEmpty(_RelatedControl.Name) ? "ChartControl" : _RelatedControl.Name; AddMenuItem(cm, null, "Select '" + s + "'", new EventHandler(SelectVisualItem)); } Control ctl = _RelatedControl.Parent; while (ctl != null) { if (string.IsNullOrEmpty(ctl.Name) == false) { MenuItem mi = AddMenuItem(cm, null, "Select '" + ctl.Name + "'", new EventHandler(SelectControl)); mi.Tag = ctl; } ctl = ctl.Parent; } } #endregion #region Item click support #region SelectVisualItem private void SelectVisualItem(object sender, EventArgs e) { MenuItem mi = sender as MenuItem; if (mi != null) { ChartControlDesigner ccd = (ChartControlDesigner)_ControlDesigner; ChartVisualElement cve = mi.Tag as ChartVisualElement; if (cve != null) ccd.SelectionService.SetSelectedComponents(new object[] { cve }); else ccd.SelectionService.SetSelectedComponents(new object[] { _RelatedControl }); } SelectionBehavior.ContextMenuActive = false; } #endregion #region SelectControl private void SelectControl(object sender, EventArgs e) { MenuItem mi = sender as MenuItem; if (mi != null) { ChartControlDesigner ccd = (ChartControlDesigner)_ControlDesigner; ccd.SelectionService.SetSelectedComponents(new object[] { mi.Tag }); } SelectionBehavior.ContextMenuActive = false; } #endregion #region AlignAxis #region AlignAxisNear private void AlignAxisNear(object sender, EventArgs e) { MenuItem mi = sender as MenuItem; if (mi != null) { ChartAxis axis = mi.Tag as ChartAxis; if (axis != null) SetValue(axis, "AxisAlignment", AxisAlignment.Near); } SelectionBehavior.ContextMenuActive = false; } #endregion #region AlignAxisFar private void AlignAxisFar(object sender, EventArgs e) { MenuItem mi = sender as MenuItem; if (mi != null) { ChartAxis axis = mi.Tag as ChartAxis; if (axis != null) SetValue(axis, "AxisAlignment", AxisAlignment.Far); } SelectionBehavior.ContextMenuActive = false; } #endregion #endregion #region AlignTitle private void AlignTitleTop(object sender, EventArgs e) { MenuItem mi = sender as MenuItem; if (mi != null) AlignTitle(mi.Tag as ChartTitle, XyAlignment.Top); } private void AlignTitleLeft(object sender, EventArgs e) { MenuItem mi = sender as MenuItem; if (mi != null) AlignTitle(mi.Tag as ChartTitle, XyAlignment.Left); } private void AlignTitleBottom(object sender, EventArgs e) { MenuItem mi = sender as MenuItem; if (mi != null) AlignTitle(mi.Tag as ChartTitle, XyAlignment.Bottom); } private void AlignTitleRight(object sender, EventArgs e) { MenuItem mi = sender as MenuItem; if (mi != null) AlignTitle(mi.Tag as ChartTitle, XyAlignment.Right); } private void AlignTitle(ChartTitle title, XyAlignment xyAlignment) { if (title != null) SetValue(title, "XyAlignment", xyAlignment); SelectionBehavior.ContextMenuActive = false; } #endregion #region DeleteAxis private void DeleteAxis(object sender, EventArgs e) { MenuItem mi = sender as MenuItem; if (mi != null) { ChartAxis axis = mi.Tag as ChartAxis; if (axis != null) { ChartXy chartXy = axis.Parent as ChartXy; if (chartXy != null) { DialogResult result = MessageBoxEx.Show( "Are you sure you want to delete the selected Axis?", "Confirm Delete", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { ChartControlDesigner ccd = (ChartControlDesigner)_ControlDesigner; ccd.ChangeService.OnComponentChanging(chartXy, null); if (axis.AxisOrientation == AxisOrientation.X) chartXy.AncillaryAxesX.Remove(axis); else chartXy.AncillaryAxesY.Remove(axis); //axis.Dispose(); ccd.ChangeService.OnComponentChanged(chartXy, null, null, null); } } } } SelectionBehavior.ContextMenuActive = false; } #endregion #region DeleteTitle private void DeleteTitle(object sender, EventArgs e) { MenuItem mi = sender as MenuItem; if (mi != null) { ChartTitle title = mi.Tag as ChartTitle; if (title != null) { ChartContainer parent = title.Parent as ChartContainer; if (parent != null) { DialogResult result = MessageBoxEx.Show( "Are you sure you want to delete the selected Title?", "Confirm Delete", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { ChartControlDesigner ccd = (ChartControlDesigner)_ControlDesigner; ccd.ChangeService.OnComponentChanging(parent.Titles, null); parent.Titles.Remove(title); //title.Dispose(); ccd.ChangeService.OnComponentChanged(parent.Titles, null, null, null); } } } } SelectionBehavior.ContextMenuActive = false; } #endregion #region DeleteChartPanel private void DeleteChartPanel(object sender, EventArgs e) { MenuItem mi = sender as MenuItem; if (mi != null) { ChartContainer cc = mi.Tag as ChartContainer; if (cc != null) { ChartPanel parent = cc.Parent as ChartPanel; if (parent != null) { DialogResult result = MessageBoxEx.Show( "Are you sure you want to delete the selected " + (cc is ChartPanel ? "ChartPanel?" : "Chart?"), "Confirm Delete", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { ChartControlDesigner ccd = (ChartControlDesigner)_ControlDesigner; ccd.ChangeService.OnComponentChanging(parent.ChartContainers, null); parent.ChartContainers.Remove(cc); //cc.Dispose(); ccd.ChangeService.OnComponentChanged(parent.ChartContainers, null, null, null); } } } } SelectionBehavior.ContextMenuActive = false; } #endregion #region HideVisualItem private void HideVisualItem(object sender, EventArgs e) { MenuItem mi = sender as MenuItem; if (mi != null) { ChartVisualElement cve = mi.Tag as ChartVisualElement; if (cve != null) SetValue(cve, "Visible", false); } SelectionBehavior.ContextMenuActive = false; } #endregion #region MenuViewCode private void MenuViewCode(object sender, EventArgs e) { ChartControlDesigner ccd = (ChartControlDesigner)_ControlDesigner; IMenuCommandService mcs = ccd.MenuCommandService; mcs.GlobalInvoke(StandardCommands.ViewCode); SelectionBehavior.ContextMenuActive = false; } #endregion #endregion #endregion #endregion #endregion #region OnMouseMove public override bool OnMouseMove(Glyph g, MouseButtons button, Point mouseLoc) { if (Control.MouseButtons == 0) _MouseDown = false; if (_MouseDown == true && Control.MouseButtons != 0) { Point pt = Control.MousePosition; if (Math.Abs(_DragPoint.X - pt.X) > 4 || Math.Abs(_DragPoint.Y - pt.Y) > 4) { ChartControlDesigner ccd = (ChartControlDesigner)_ControlDesigner; ccd.OnMouseDragBegin(pt.X, pt.Y); return (true); } } return base.OnMouseMove(g, button, mouseLoc); } #endregion #region SetValue private void SetValue(object item, string property, object value) { ChartControlDesigner ccd = (ChartControlDesigner)_ControlDesigner; ccd.ChangeService.OnComponentChanging(item, null); GetPropertyByName(item, property).SetValue(item, value); ccd.ChangeService.OnComponentChanged(item, null, null, null); } #endregion #region GetPropertyByName private PropertyDescriptor GetPropertyByName(object item, string propName) { PropertyDescriptor prop = TypeDescriptor.GetProperties(item)[propName]; if (prop == null) throw new ArgumentException("Matching property not found.", propName); return (prop); } #endregion } #endregion #region Dispose protected override void Dispose(bool disposing) { if (disposing) { if (ChangeService != null) { ChangeService.ComponentChanged -= ChangeService_ComponentChanged; ChangeService.ComponentAdded -= ChangeService_ComponentAdded; ChangeService.ComponentRemoved -= ChangeService_ComponentRemoved; } if (BehaviorService != null) RemoveAdorners(); } base.Dispose(disposing); } #endregion } }