1 //------------------------------------------------------------- 2 // <copyright company=�Microsoft Corporation�> 3 // Copyright � Microsoft Corporation. All Rights Reserved. 4 // </copyright> 5 //------------------------------------------------------------- 6 // @owner=alexgor, deliant 7 //================================================================= 8 // File: CustomProperties.cs 9 // 10 // Namespace: System.Web.UI.WebControls[Windows.Forms].Charting.Utilities 11 // 12 // Classes: CustomPropertyRegistry, CustomPropertyInfo, 13 // CustomPropertyName 14 // 15 // Purpose: CustomPropertyRegistry contains information for all 16 // chart custom properties. This informatin is used at 17 // design-time to provide simple editors for the 18 // CustomProperty property of the Series and DataPoint. 19 // 20 // Custom Properties Overview: 21 // --------------------------- 22 // 23 // Different chart types may have unique settings that only apply to 24 // this chart type. For example, �Exploded� attribute on the data point 25 // only make sense in case of Pie and Doughnut chart types. Instead of 26 // adding properties that only will work with specific chart types 27 // CustomProperties were introduced. 28 // 29 // Custom properties are implemented using the CustomProperties property 30 // of both Series objects and their associated DataPoint objects. Here 31 // is an example of setting data point custom attribute: 32 // 33 // Chart1.Series["Default"].Points[0][CustomPropertyName.Exploded] = "true"; 34 // 35 // Custom attribute names are case-sensitive. You should be mindful of 36 // this fact when formatting custom properties in code-behind. Further, 37 // if the CustomProperty value contains a comma, then each comma must 38 // be preceded by a '\' character to escape the comma. This is useful 39 // when, for example, an RGB color value is set in your application. 40 // In such cases, the setting of custom properties that contain commas 41 // can either be done at runtime, or design-time. 42 // 43 // Reviewed: AG - Microsoft 5, 2007 44 // 45 //=================================================================== 46 47 48 #region Used Namespaces 49 50 using System; 51 using System.Drawing; 52 using System.Collections; 53 using System.ComponentModel; 54 using System.ComponentModel.Design; 55 56 #if Microsoft_CONTROL 57 using System.Windows.Forms.DataVisualization.Charting; 58 using System.Windows.Forms.DataVisualization.Charting.ChartTypes; 59 #else 60 using System.Web.UI.DataVisualization.Charting; 61 using System.Web.UI.DataVisualization.Charting.ChartTypes; 62 #endif 63 64 #endregion 65 66 #if Microsoft_CONTROL 67 namespace System.Windows.Forms.DataVisualization.Charting.Utilities 68 #else // Microsoft_CONTROL 69 namespace System.Web.UI.DataVisualization.Charting.Utilities 70 #endif // Microsoft_CONTROL 71 { 72 #region Enumerations 73 74 75 /// <summary> 76 /// Circular chart drawing style. 77 /// </summary> 78 internal enum PolarDrawingStyles 79 { 80 /// <summary> 81 /// Series are drawn as lines. 82 /// </summary> 83 Line, 84 /// <summary> 85 /// Series are drawn as markers. 86 /// </summary> 87 Marker 88 } 89 90 /// <summary> 91 /// CircularAreaDrawingStyle 92 /// </summary> 93 internal enum CircularAreaDrawingStyles 94 { 95 /// <summary> 96 /// Drawn as polygon 97 /// </summary> 98 Polygon, 99 100 /// <summary> 101 /// Drawn as circle 102 /// </summary> 103 Circle = 1, 104 } 105 106 /// <summary> 107 /// Marker Style 108 /// </summary> 109 internal enum ErrorBarMarkerStyles 110 { 111 /// <summary> 112 /// Marker disabled 113 /// </summary> 114 None = 0, 115 116 /// <summary> 117 /// The marker style is Square 118 /// </summary> 119 Square = 1, 120 121 /// <summary> 122 /// The marker style is Circle 123 /// </summary> 124 Circle = 2, 125 126 /// <summary> 127 /// The marker style is Diamond 128 /// </summary> 129 Diamond = 3, 130 131 /// <summary> 132 /// The marker style is Triangle 133 /// </summary> 134 Triangle = 4, 135 136 /// <summary> 137 /// The marker style is Cross 138 /// </summary> 139 Cross = 5, 140 141 /// <summary> 142 /// The marker style is 4 corner star 143 /// </summary> 144 Star4 = 6, 145 146 /// <summary> 147 /// The marker style is 5 corner star 148 /// </summary> 149 Star5 = 7, 150 151 /// <summary> 152 /// The marker style is 6 corner star 153 /// </summary> 154 Star6 = 8, 155 156 /// <summary> 157 /// The marker style is 10 corner star 158 /// </summary> 159 Star10 = 9, 160 161 /// <summary> 162 /// Line marker 163 /// </summary> 164 Line = 10 165 166 }; 167 168 /// <summary> 169 /// AxisName of stock chart markers 170 /// </summary> 171 internal enum StockShowOpenCloseTypes 172 { 173 /// <summary> 174 /// Open and Close markers are shown. 175 /// </summary> 176 Both, 177 178 /// <summary> 179 /// Only Open markers are shown. 180 /// </summary> 181 Open, 182 183 /// <summary> 184 /// Only Close markers are shown. 185 /// </summary> 186 Close, 187 } 188 189 190 /// <summary> 191 /// IsEmpty point value attribute 192 /// </summary> 193 internal enum EmptyPointTypes 194 { 195 /// <summary> 196 /// Average of two neighbor points is used. 197 /// </summary> 198 Average, 199 200 /// <summary> 201 /// Zero value is used 202 /// </summary> 203 Zero 204 } 205 206 /// <summary> 207 /// Stock chart point labels attribute 208 /// </summary> 209 internal enum StockLabelValueTypes 210 { 211 /// <summary> 212 /// High Y value is used to generate point label. 213 /// </summary> 214 High, 215 216 /// <summary> 217 /// Low Y value is used to generate point label. 218 /// </summary> 219 Low, 220 221 /// <summary> 222 /// Open Y value is used to generate point label. 223 /// </summary> 224 Open, 225 226 /// <summary> 227 /// Close Y value is used to generate point label. 228 /// </summary> 229 Close, 230 } 231 232 /// <summary> 233 /// Data point label alignment. 234 /// </summary> 235 [Flags] 236 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1008:EnumsShouldHaveZeroValue")] 237 internal enum LabelAlignments 238 { 239 /// <summary> 240 /// Automatic position. 241 /// </summary> 242 Auto = 0, 243 /// <summary> 244 /// Label aligned on the top of the marker. 245 /// </summary> 246 Top = 1, 247 /// <summary> 248 /// Label aligned on the bottom of the marker. 249 /// </summary> 250 Bottom = 2, 251 /// <summary> 252 /// Label aligned on the right of the marker. 253 /// </summary> 254 Right = 4, 255 /// <summary> 256 /// Label aligned on the left of the marker. 257 /// </summary> 258 Left = 8, 259 /// <summary> 260 /// Label aligned on the top-left of the marker. 261 /// </summary> 262 TopLeft = 16, 263 /// <summary> 264 /// Label aligned on the top-right of the marker. 265 /// </summary> 266 TopRight = 32, 267 /// <summary> 268 /// Label aligned on the bottom-left of the marker. 269 /// </summary> 270 BottomLeft = 64, 271 /// <summary> 272 /// Label aligned on the bottom-right of the marker. 273 /// </summary> 274 BottomRight = 128, 275 /// <summary> 276 /// Label aligned in the center of the marker. 277 /// </summary> 278 Center = 256, 279 } 280 281 #endregion //Enumerations 282 283 /// <summary> 284 /// CustomPropertyName class contains constant strings defining 285 /// names of all custom properties used in the chart. 286 /// </summary> 287 internal static class CustomPropertyName 288 { 289 #region Common Custom Properties Names 290 291 internal const string DrawSideBySide = "DrawSideBySide"; 292 internal const string EmptyPointValue = "EmptyPointValue"; 293 internal const string IsXAxisQuantitative = "IsXAxisQuantitative"; 294 internal const string BarLabelStyle = "BarLabelStyle"; 295 internal const string StackedGroupName = "StackedGroupName"; 296 internal const string DrawingStyle = "DrawingStyle"; 297 internal const string PointWidth = "PointWidth"; 298 internal const string PixelPointWidth = "PixelPointWidth"; 299 internal const string MinPixelPointWidth = "MinPixelPointWidth"; 300 internal const string MaxPixelPointWidth = "MaxPixelPointWidth"; 301 internal const string PriceUpColor = "PriceUpColor"; 302 internal const string PriceDownColor = "PriceDownColor"; 303 internal const string LabelValueType = "LabelValueType"; 304 internal const string OpenCloseStyle = "OpenCloseStyle"; 305 internal const string ShowOpenClose = "ShowOpenClose"; 306 internal const string BubbleScaleMin = "BubbleScaleMin"; 307 internal const string BubbleScaleMax = "BubbleScaleMax"; 308 internal const string BubbleMaxSize = "BubbleMaxSize"; 309 internal const string BubbleMinSize = "BubbleMinSize"; 310 internal const string BubbleUseSizeForLabel = "BubbleUseSizeForLabel"; 311 internal const string PieDrawingStyle = "PieDrawingStyle"; 312 internal const string CollectedStyle = "CollectedStyle"; 313 internal const string CollectedThreshold = "CollectedThreshold"; 314 internal const string CollectedThresholdUsePercent = "CollectedThresholdUsePercent"; 315 internal const string CollectedSliceExploded = "CollectedSliceExploded"; 316 internal const string CollectedLabel = "CollectedLabel"; 317 internal const string CollectedLegendText = "CollectedLegendText"; 318 internal const string CollectedToolTip = "CollectedToolTip"; 319 internal const string CollectedColor = "CollectedColor"; 320 internal const string CollectedChartShowLegend = "CollectedChartShowLegend"; 321 internal const string CollectedChartShowLabels = "CollectedChartShowLabels"; 322 internal const string PieStartAngle = "PieStartAngle"; 323 internal const string Exploded = "Exploded"; 324 internal const string LabelsRadialLineSize = "LabelsRadialLineSize"; 325 internal const string LabelsHorizontalLineSize = "LabelsHorizontalLineSize"; 326 internal const string PieLabelStyle = "PieLabelStyle"; 327 internal const string MinimumRelativePieSize = "MinimumRelativePieSize"; 328 internal const string _3DLabelLineSize = "3DLabelLineSize"; 329 internal const string PieLineColor = "PieLineColor"; 330 internal const string PieAutoAxisLabels = "AutoAxisLabels"; 331 internal const string DoughnutRadius = "DoughnutRadius"; 332 internal const string LabelStyle = "LabelStyle"; 333 internal const string ShowMarkerLines = "ShowMarkerLines"; 334 internal const string LineTension = "LineTension"; 335 internal const string PixelPointDepth = "PixelPointDepth"; 336 internal const string PixelPointGapDepth = "PixelPointGapDepth"; 337 internal const string PermittedPixelError = "PermittedPixelError"; 338 internal const string CircularLabelsStyle = "CircularLabelsStyle"; 339 internal const string PolarDrawingStyle = "PolarDrawingStyle"; 340 internal const string AreaDrawingStyle = "AreaDrawingStyle"; 341 internal const string RadarDrawingStyle = "RadarDrawingStyle"; 342 internal const string BoxPlotPercentile = "BoxPlotPercentile"; 343 internal const string BoxPlotWhiskerPercentile = "BoxPlotWhiskerPercentile"; 344 internal const string BoxPlotShowAverage = "BoxPlotShowAverage"; 345 internal const string BoxPlotShowMedian = "BoxPlotShowMedian"; 346 internal const string BoxPlotShowUnusualValues = "BoxPlotShowUnusualValues"; 347 internal const string BoxPlotSeries = "BoxPlotSeries"; 348 internal const string ErrorBarStyle = "ErrorBarStyle"; 349 internal const string ErrorBarCenterMarkerStyle = "ErrorBarCenterMarkerStyle"; 350 internal const string ErrorBarSeries = "ErrorBarSeries"; 351 internal const string ErrorBarType = "ErrorBarType"; 352 internal const string UsedYValueHigh = "UsedYValueHigh"; 353 internal const string UsedYValueLow = "UsedYValueLow"; 354 internal const string BoxSize = "BoxSize"; 355 internal const string ProportionalSymbols = "ProportionalSymbols"; 356 internal const string ReversalAmount = "ReversalAmount"; 357 internal const string UsedYValue = "UsedYValue"; 358 internal const string NumberOfLinesInBreak = "NumberOfLinesInBreak"; 359 internal const string FunnelLabelStyle = "FunnelLabelStyle"; 360 internal const string FunnelNeckWidth = "FunnelNeckWidth"; 361 internal const string FunnelNeckHeight = "FunnelNeckHeight"; 362 internal const string FunnelMinPointHeight = "FunnelMinPointHeight"; 363 internal const string Funnel3DRotationAngle = "Funnel3DRotationAngle"; 364 internal const string FunnelPointGap = "FunnelPointGap"; 365 internal const string Funnel3DDrawingStyle = "Funnel3DDrawingStyle"; 366 internal const string FunnelStyle = "FunnelStyle"; 367 internal const string FunnelInsideLabelAlignment = "FunnelInsideLabelAlignment"; 368 internal const string FunnelOutsideLabelPlacement = "FunnelOutsideLabelPlacement"; 369 internal const string CalloutLineColor = "CalloutLineColor"; 370 internal const string PyramidLabelStyle = "PyramidLabelStyle"; 371 internal const string PyramidMinPointHeight = "PyramidMinPointHeight"; 372 internal const string Pyramid3DRotationAngle = "Pyramid3DRotationAngle"; 373 internal const string PyramidPointGap = "PyramidPointGap"; 374 internal const string Pyramid3DDrawingStyle = "Pyramid3DDrawingStyle"; 375 internal const string PyramidInsideLabelAlignment = "PyramidInsideLabelAlignment"; 376 internal const string PyramidOutsideLabelPlacement = "PyramidOutsideLabelPlacement"; 377 internal const string PyramidValueType = "PyramidValueType"; 378 379 #endregion // Common Custom Properties Names 380 } 381 382 /// <summary> 383 /// CustomPropertyRegistry contains information for all chart 384 /// custom properties. This data is exposed through the 385 /// �registeredCustomProperties� field which is an ArrayList 386 /// containing CustomPropertyInfo classes. 387 /// </summary> 388 internal class CustomPropertyRegistry : IServiceProvider 389 { 390 #region Fields 391 392 // List of registered properties 393 internal ArrayList registeredCustomProperties = new ArrayList(); 394 395 // Defines maximum value which can be set to the attribute which uses pixels 396 internal static int MaxValueOfPixelAttribute = 10000; 397 398 internal static System.Collections.Generic.List<SeriesChartType> IsXAxisQuantitativeChartTypes = 399 new System.Collections.Generic.List<SeriesChartType >( 400 new SeriesChartType[] { 401 SeriesChartType.Line, 402 SeriesChartType.FastLine, 403 SeriesChartType.Spline, 404 SeriesChartType.Point, 405 SeriesChartType.FastPoint, 406 SeriesChartType.Bubble, 407 SeriesChartType.RangeColumn, 408 SeriesChartType.RangeBar, 409 }); 410 #endregion 411 412 #region Constructor and Services 413 414 /// <summary> 415 /// Custom properties registry public constructor. 416 /// </summary> CustomPropertyRegistry()417 public CustomPropertyRegistry() 418 { 419 // Register properties used in the chart 420 RegisterProperties(); 421 } 422 423 /// <summary> 424 /// Returns custom properties registry service object. 425 /// </summary> 426 /// <param name="serviceType">Service type to get.</param> 427 /// <returns>Custom properties registry service.</returns> 428 [EditorBrowsableAttribute(EditorBrowsableState.Never)] IServiceProvider.GetService(Type serviceType)429 object IServiceProvider.GetService(Type serviceType) 430 { 431 if(serviceType == typeof(CustomPropertyRegistry)) 432 { 433 return this; 434 } 435 throw (new ArgumentException(SR.ExceptionCustomAttributesRegistryUnsupportedType( serviceType.ToString()) )); 436 } 437 438 #endregion 439 440 #region Properties Regestering methods 441 442 /// <summary> 443 /// This method registers all standard custom properties used in 444 /// the chart and provides all the additional information like 445 /// description, value validation and scenarios where custom 446 /// attribute can be used. 447 /// </summary> RegisterProperties()448 private void RegisterProperties() 449 { 450 SeriesChartType[] chartTypes = null; 451 CustomPropertyInfo attrInfo = null; 452 453 //*********************************************************************** 454 //** DrawSideBySide properties 455 //*********************************************************************** 456 chartTypes = new SeriesChartType[] { 457 SeriesChartType.Bar, 458 SeriesChartType.Column, 459 460 SeriesChartType.RangeColumn, 461 SeriesChartType.BoxPlot, 462 SeriesChartType.RangeBar, 463 SeriesChartType.ErrorBar, 464 465 }; 466 // "DrawSideBySide" attribute 467 attrInfo = new CustomPropertyInfo( 468 CustomPropertyName.DrawSideBySide, 469 typeof(AxisEnabled), 470 "Auto", 471 SR.DescriptionCustomAttributeDrawSideBySide, 472 chartTypes, 473 true, 474 false); 475 registeredCustomProperties.Add( attrInfo ); 476 477 //*********************************************************************** 478 //** IsXAxisQuantitative properties 479 //*********************************************************************** 480 registeredCustomProperties.Add(new CustomPropertyInfo( 481 CustomPropertyName.IsXAxisQuantitative, 482 typeof(bool), 483 "false", 484 SR.DescriptionCustomAttributeIsXAxisQuantitive, 485 IsXAxisQuantitativeChartTypes.ToArray(), 486 true, 487 false)); 488 489 //*********************************************************************** 490 //** EmptyPointValue properties 491 //*********************************************************************** 492 chartTypes = new SeriesChartType[] { 493 SeriesChartType.Point, 494 SeriesChartType.Bubble, 495 SeriesChartType.Line, 496 SeriesChartType.Spline, 497 SeriesChartType.StepLine, 498 SeriesChartType.Column, 499 SeriesChartType.RangeColumn, 500 SeriesChartType.RangeBar, 501 SeriesChartType.Radar, 502 SeriesChartType.Range, 503 SeriesChartType.SplineRange, 504 SeriesChartType.Polar, 505 SeriesChartType.Area, 506 SeriesChartType.SplineArea, 507 SeriesChartType.Bar, 508 }; 509 registeredCustomProperties.Add( new CustomPropertyInfo( 510 CustomPropertyName.EmptyPointValue, 511 typeof(EmptyPointTypes), 512 "Average", 513 SR.DescriptionCustomAttributeEmptyPointValue, 514 chartTypes, 515 true, 516 false) ); 517 518 519 //*********************************************************************** 520 //** Bar label styles properties 521 //*********************************************************************** 522 chartTypes = new SeriesChartType[] { 523 SeriesChartType.StackedBar, 524 SeriesChartType.StackedBar100, 525 SeriesChartType.RangeBar, 526 }; 527 // "BarLabelStyle" attribute 528 attrInfo = new CustomPropertyInfo( 529 CustomPropertyName.BarLabelStyle, 530 typeof(BarValueLabelDrawingStyle), 531 "Center", 532 SR.DescriptionCustomAttributeBarLabelStyle, 533 chartTypes, 534 true, 535 true); 536 registeredCustomProperties.Add( attrInfo ); 537 538 539 540 //*********************************************************************** 541 //** Stacked Column/Bar properties 542 //*********************************************************************** 543 chartTypes = new SeriesChartType[] { 544 SeriesChartType.StackedBar, 545 SeriesChartType.StackedBar100, 546 SeriesChartType.StackedColumn, 547 SeriesChartType.StackedColumn100, 548 549 }; 550 551 // "StackedGroupName" attribute 552 attrInfo = new CustomPropertyInfo( 553 CustomPropertyName.StackedGroupName, 554 typeof(string), 555 string.Empty, 556 SR.DescriptionCustomAttributeStackedGroupName, 557 chartTypes, 558 true, 559 false); 560 registeredCustomProperties.Add(attrInfo); 561 562 563 564 //*********************************************************************** 565 //** Bar label styles properties 566 //*********************************************************************** 567 chartTypes = new SeriesChartType[] { 568 SeriesChartType.Bar, 569 }; 570 // "BarLabelStyle" attribute 571 attrInfo = new CustomPropertyInfo( 572 CustomPropertyName.BarLabelStyle, 573 typeof(BarValueLabelDrawingStyle), 574 "Outside", 575 SR.DescriptionCustomAttributeBarLabelStyle, 576 chartTypes, 577 true, 578 true); 579 registeredCustomProperties.Add( attrInfo ); 580 581 //*********************************************************************** 582 //** Bar and Columnt chart types properties 583 //*********************************************************************** 584 chartTypes = new SeriesChartType[] { 585 SeriesChartType.Bar, 586 SeriesChartType.Column, 587 SeriesChartType.StackedBar, 588 SeriesChartType.StackedBar100, 589 SeriesChartType.StackedColumn, 590 SeriesChartType.StackedColumn100, 591 SeriesChartType.RangeBar, 592 SeriesChartType.RangeColumn, 593 594 }; 595 // "DrawingStyle" attribute 596 attrInfo = new CustomPropertyInfo( 597 CustomPropertyName.DrawingStyle, 598 typeof(BarDrawingStyle), 599 "Default", 600 SR.DescriptionCustomAttributeDrawingStyle, 601 chartTypes, 602 true, 603 true); 604 registeredCustomProperties.Add( attrInfo ); 605 606 //*********************************************************************** 607 //** Chart types point width properties 608 //*********************************************************************** 609 chartTypes = new SeriesChartType[] { 610 SeriesChartType.Bar, 611 SeriesChartType.Candlestick, 612 SeriesChartType.Column, 613 SeriesChartType.StackedBar, 614 SeriesChartType.StackedBar100, 615 SeriesChartType.StackedColumn, 616 SeriesChartType.StackedColumn100, 617 SeriesChartType.Stock, 618 SeriesChartType.BoxPlot, 619 SeriesChartType.ErrorBar, 620 SeriesChartType.RangeBar, 621 SeriesChartType.RangeColumn, 622 }; 623 // "PointWidth" attribute 624 attrInfo = new CustomPropertyInfo( 625 CustomPropertyName.PointWidth, 626 typeof(float), 627 0.8f, 628 SR.DescriptionCustomAttributePointWidth, 629 chartTypes, 630 true, 631 false); 632 attrInfo.MinValue = 0f; 633 attrInfo.MaxValue = 2f; 634 registeredCustomProperties.Add( attrInfo ); 635 636 // "PixelPointWidth" attribute 637 attrInfo = new CustomPropertyInfo( 638 CustomPropertyName.PixelPointWidth, 639 typeof(int), 640 0, 641 SR.DescriptionCustomAttributePixelPointWidth, 642 chartTypes, 643 true, 644 false); 645 attrInfo.MinValue = 0; 646 attrInfo.MaxValue = CustomPropertyRegistry.MaxValueOfPixelAttribute; 647 registeredCustomProperties.Add( attrInfo ); 648 649 // "MinPixelPointWidth" attribute 650 attrInfo = new CustomPropertyInfo( 651 CustomPropertyName.MinPixelPointWidth, 652 typeof(int), 653 0, 654 SR.DescriptionCustomAttributeMinPixelPointWidth, 655 chartTypes, 656 true, 657 false); 658 attrInfo.MinValue = 0; 659 attrInfo.MaxValue = CustomPropertyRegistry.MaxValueOfPixelAttribute; 660 registeredCustomProperties.Add( attrInfo ); 661 662 // "MaxPixelPointWidth" attribute 663 attrInfo = new CustomPropertyInfo( 664 CustomPropertyName.MaxPixelPointWidth, 665 typeof(int), 666 0, 667 SR.DescriptionCustomAttributeMaxPixelPointWidth, 668 chartTypes, 669 true, 670 false); 671 attrInfo.MinValue = 0; 672 attrInfo.MaxValue = CustomPropertyRegistry.MaxValueOfPixelAttribute; 673 registeredCustomProperties.Add( attrInfo ); 674 675 676 677 //*********************************************************************** 678 //** CandleStick chart types properties 679 //*********************************************************************** 680 chartTypes = new SeriesChartType[] { SeriesChartType.Candlestick }; 681 682 // "PriceUpColor" attribute 683 attrInfo = new CustomPropertyInfo( 684 CustomPropertyName.PriceUpColor, 685 typeof(Color), 686 "", 687 SR.DescriptionCustomAttributeCandlePriceUpColor, 688 chartTypes, 689 true, 690 true); 691 registeredCustomProperties.Add( attrInfo ); 692 693 // "PriceDownColor" attribute 694 attrInfo = new CustomPropertyInfo( 695 CustomPropertyName.PriceDownColor, 696 typeof(Color), 697 "", 698 SR.DescriptionCustomAttributePriceDownColor, 699 chartTypes, 700 true, 701 true); 702 registeredCustomProperties.Add( attrInfo ); 703 704 705 //*********************************************************************** 706 //** Stock and CandleStick chart types properties 707 //*********************************************************************** 708 chartTypes = new SeriesChartType[] { SeriesChartType.Stock, SeriesChartType.Candlestick }; 709 710 // "LabelValueType" attribute 711 attrInfo = new CustomPropertyInfo( 712 CustomPropertyName.LabelValueType, 713 typeof(StockLabelValueTypes), 714 "Close", 715 SR.DescriptionCustomAttributeLabelValueType, 716 chartTypes, 717 true, 718 true); 719 registeredCustomProperties.Add( attrInfo ); 720 721 //*********************************************************************** 722 //** Stock chart types properties 723 //*********************************************************************** 724 chartTypes = new SeriesChartType[] { SeriesChartType.Stock }; 725 726 // "OpenCloseStyle" attribute 727 attrInfo = new CustomPropertyInfo( 728 CustomPropertyName.OpenCloseStyle, 729 typeof(StockOpenCloseMarkStyle), 730 "Line", 731 SR.DescriptionCustomAttributeOpenCloseStyle, 732 chartTypes, 733 true, 734 true); 735 registeredCustomProperties.Add( attrInfo ); 736 737 // "ShowOpenClose" attribute 738 attrInfo = new CustomPropertyInfo( 739 CustomPropertyName.ShowOpenClose, 740 typeof(StockShowOpenCloseTypes), 741 "Both", 742 SR.DescriptionCustomAttributeShowOpenClose, 743 chartTypes, 744 true, 745 true); 746 registeredCustomProperties.Add( attrInfo ); 747 748 749 //*********************************************************************** 750 //** Bubble chart types properties 751 //*********************************************************************** 752 chartTypes = new SeriesChartType[] { SeriesChartType.Bubble }; 753 754 // "BubbleScaleMin" attribute 755 attrInfo = new CustomPropertyInfo( 756 CustomPropertyName.BubbleScaleMin, 757 typeof(float), 758 0f, 759 SR.DescriptionCustomAttributeBubbleScaleMin, 760 chartTypes, 761 true, 762 false); 763 registeredCustomProperties.Add( attrInfo ); 764 765 // "BubbleScaleMax" attribute 766 attrInfo = new CustomPropertyInfo( 767 CustomPropertyName.BubbleScaleMax, 768 typeof(float), 769 0f, 770 SR.DescriptionCustomAttributeBubbleScaleMax, 771 chartTypes, 772 true, 773 false); 774 registeredCustomProperties.Add( attrInfo ); 775 776 // "BubbleMaxSize" attribute 777 attrInfo = new CustomPropertyInfo( 778 CustomPropertyName.BubbleMaxSize, 779 typeof(float), 780 15f, 781 SR.DescriptionCustomAttributeBubbleMaxSize, 782 chartTypes, 783 true, 784 false); 785 attrInfo.MinValue = 0f; 786 attrInfo.MaxValue = 100f; 787 registeredCustomProperties.Add( attrInfo ); 788 789 // "BubbleMinSize" attribute of the Bubble chart 790 attrInfo = new CustomPropertyInfo( 791 CustomPropertyName.BubbleMinSize, 792 typeof(float), 793 3f, 794 SR.DescriptionCustomAttributeBubbleMaxSize, 795 chartTypes, 796 true, 797 false); 798 attrInfo.MinValue = 0f; 799 attrInfo.MaxValue = 100f; 800 registeredCustomProperties.Add( attrInfo ); 801 802 // "BubbleUseSizeForLabel" attribute 803 attrInfo = new CustomPropertyInfo( 804 CustomPropertyName.BubbleUseSizeForLabel, 805 typeof(bool), 806 false, 807 SR.DescriptionCustomAttributeBubbleUseSizeForLabel, 808 chartTypes, 809 true, 810 false); 811 registeredCustomProperties.Add( attrInfo ); 812 813 814 815 //*********************************************************************** 816 //** Pie and Doughnut chart types properties 817 //*********************************************************************** 818 chartTypes = new SeriesChartType[] { 819 SeriesChartType.Pie, 820 SeriesChartType.Doughnut 821 }; 822 823 824 // "PieDrawingStyle" attribute 825 attrInfo = new CustomPropertyInfo( 826 CustomPropertyName.PieDrawingStyle, 827 typeof(PieDrawingStyle), 828 "Default", 829 SR.DescriptionCustomAttributePieDrawingStyle, 830 chartTypes, 831 true, 832 false); 833 attrInfo.AppliesTo3D = false; 834 registeredCustomProperties.Add( attrInfo ); 835 836 837 // "CollectedThreshold" attribute of the Pie chart 838 attrInfo = new CustomPropertyInfo( 839 CustomPropertyName.CollectedThreshold, 840 typeof(double), 841 0.0, 842 SR.DescriptionCustomAttributeCollectedThreshold, 843 chartTypes, 844 true, 845 false); 846 attrInfo.MinValue = 0.0; 847 attrInfo.MaxValue = double.MaxValue; 848 registeredCustomProperties.Add( attrInfo ); 849 850 // "CollectedThresholdUsePercent" attribute of the Pie chart 851 attrInfo = new CustomPropertyInfo( 852 CustomPropertyName.CollectedThresholdUsePercent, 853 typeof(bool), 854 true, 855 SR.DescriptionCustomAttributeCollectedThresholdUsePercent, 856 chartTypes, 857 true, 858 false); 859 registeredCustomProperties.Add( attrInfo ); 860 861 // "CollectedSliceExploded" attribute of the Pie chart 862 attrInfo = new CustomPropertyInfo( 863 CustomPropertyName.CollectedSliceExploded, 864 typeof(bool), 865 false, 866 SR.DescriptionCustomAttributeCollectedSliceExploded, 867 chartTypes, 868 true, 869 false); 870 registeredCustomProperties.Add( attrInfo ); 871 872 // "CollectedLabel" attribute of the Pie chart 873 attrInfo = new CustomPropertyInfo( 874 CustomPropertyName.CollectedLabel, 875 typeof(string), 876 string.Empty, 877 SR.DescriptionCustomAttributeCollectedLabel, 878 chartTypes, 879 true, 880 false); 881 registeredCustomProperties.Add( attrInfo ); 882 883 // "CollectedLegendText" attribute of the Pie chart 884 attrInfo = new CustomPropertyInfo( 885 CustomPropertyName.CollectedLegendText, 886 typeof(string), 887 SR.DescriptionCustomAttributeCollectedLegendDefaultText, 888 SR.DescriptionCustomAttributeCollectedLegendText, 889 chartTypes, 890 true, 891 false); 892 registeredCustomProperties.Add( attrInfo ); 893 894 // "CollectedToolTip" attribute of the Pie chart 895 attrInfo = new CustomPropertyInfo( 896 CustomPropertyName.CollectedToolTip, 897 typeof(string), 898 string.Empty, 899 SR.DescriptionCustomAttributeCollectedToolTip, 900 chartTypes, 901 true, 902 false); 903 registeredCustomProperties.Add( attrInfo ); 904 905 // "CollectedColor" attribute of the Pie chart 906 attrInfo = new CustomPropertyInfo( 907 CustomPropertyName.CollectedColor, 908 typeof(Color), 909 "", 910 SR.DescriptionCustomAttributeCollectedColor, 911 chartTypes, 912 true, 913 false); 914 registeredCustomProperties.Add( attrInfo ); 915 916 917 // "PieStartAngle" attribute of the Pie chart 918 attrInfo = new CustomPropertyInfo( 919 CustomPropertyName.PieStartAngle, 920 typeof(int), 921 0, 922 SR.DescriptionCustomAttributePieStartAngle, 923 chartTypes, 924 true, 925 false); 926 attrInfo.MinValue = 0; 927 attrInfo.MaxValue = 360; 928 registeredCustomProperties.Add( attrInfo ); 929 930 931 932 933 // "Exploded" attribute of the Pie chart 934 registeredCustomProperties.Add( new CustomPropertyInfo( 935 CustomPropertyName.Exploded, 936 typeof(bool), 937 false, 938 SR.DescriptionCustomAttributePieDonutExploded, 939 chartTypes, 940 false, 941 true) ); 942 943 // "LabelsRadialLineSize" attribute of the Pie chart 944 attrInfo = new CustomPropertyInfo( 945 CustomPropertyName.LabelsRadialLineSize, 946 typeof(float), 947 1f, 948 SR.DescriptionCustomAttributeLabelsRadialLineSize, 949 chartTypes, 950 true, 951 true); 952 attrInfo.AppliesTo3D = false; 953 attrInfo.MinValue = 0f; 954 attrInfo.MaxValue = 100f; 955 registeredCustomProperties.Add( attrInfo ); 956 957 // "LabelsHorizontalLineSize" attribute of the Pie chart 958 attrInfo = new CustomPropertyInfo( 959 CustomPropertyName.LabelsHorizontalLineSize, 960 typeof(float), 961 1f, 962 SR.DescriptionCustomAttributeLabelsHorizontalLineSize, 963 chartTypes, 964 true, 965 true); 966 attrInfo.AppliesTo3D = false; 967 attrInfo.MinValue = 0f; 968 attrInfo.MaxValue = 100f; 969 registeredCustomProperties.Add( attrInfo ); 970 971 972 // "PieLabelStyle" attribute of the Pie chart 973 registeredCustomProperties.Add( new CustomPropertyInfo( 974 CustomPropertyName.PieLabelStyle, 975 typeof(PieLabelStyle), 976 "Inside", 977 SR.DescriptionCustomAttributePieLabelStyle, 978 chartTypes, 979 true, 980 true) ); 981 982 983 // "MinimumRelativePieSize" attribute of the Pie chart 984 attrInfo = new CustomPropertyInfo( 985 CustomPropertyName.MinimumRelativePieSize, 986 typeof(float), 987 30f, 988 SR.DescriptionCustomAttributeMinimumRelativePieSize, 989 chartTypes, 990 true, 991 false); 992 attrInfo.MinValue = 10f; 993 attrInfo.MaxValue = 70f; 994 registeredCustomProperties.Add( attrInfo ); 995 996 // "3DLabelLineSize" attribute of the Pie chart 997 attrInfo = new CustomPropertyInfo( 998 CustomPropertyName._3DLabelLineSize, 999 typeof(float), 1000 100f, 1001 SR.DescriptionCustomAttribute_3DLabelLineSize, 1002 chartTypes, 1003 true, 1004 false); 1005 attrInfo.AppliesTo2D = false; 1006 attrInfo.MinValue = 30f; 1007 attrInfo.MaxValue = 200f; 1008 registeredCustomProperties.Add( attrInfo ); 1009 1010 // "PieLineColor" attribute of the Pie chart 1011 attrInfo = new CustomPropertyInfo( 1012 CustomPropertyName.PieLineColor, 1013 typeof(Color), 1014 "", 1015 SR.DescriptionCustomAttributePieLineColor, 1016 chartTypes, 1017 true, 1018 true); 1019 registeredCustomProperties.Add( attrInfo ); 1020 1021 //*********************************************************************** 1022 //** Doughnut chart types properties 1023 //*********************************************************************** 1024 1025 // "DoughnutRadius" attribute of the Pie chart 1026 attrInfo = new CustomPropertyInfo( 1027 CustomPropertyName.DoughnutRadius, 1028 typeof(float), 1029 60f, 1030 SR.DescriptionCustomAttributeDoughnutRadius, 1031 new SeriesChartType[] { SeriesChartType.Doughnut }, 1032 true, 1033 false); 1034 attrInfo.MinValue = 0f; 1035 attrInfo.MaxValue = 99f; 1036 registeredCustomProperties.Add( attrInfo ); 1037 1038 1039 //*********************************************************************** 1040 //** Other 1041 //*********************************************************************** 1042 1043 // "LabelStyle" attribute 1044 chartTypes = new SeriesChartType[] { 1045 SeriesChartType.Point, 1046 SeriesChartType.Column, 1047 SeriesChartType.Bubble, 1048 SeriesChartType.Line, 1049 SeriesChartType.Spline, 1050 SeriesChartType.StepLine, 1051 SeriesChartType.Area, 1052 SeriesChartType.SplineArea, 1053 SeriesChartType.Range, 1054 SeriesChartType.SplineRange, 1055 SeriesChartType.Radar, 1056 SeriesChartType.Polar, 1057 1058 }; 1059 registeredCustomProperties.Add( new CustomPropertyInfo( 1060 CustomPropertyName.LabelStyle, 1061 typeof(LabelAlignments), 1062 "Auto", 1063 SR.DescriptionCustomAttributeLabelStyle, 1064 chartTypes, 1065 true, 1066 true) ); 1067 1068 // "ShowMarkerLines" attribute 1069 chartTypes = new SeriesChartType[] { 1070 SeriesChartType.Line, 1071 SeriesChartType.Spline, 1072 SeriesChartType.StepLine, 1073 SeriesChartType.Area, 1074 SeriesChartType.SplineArea, 1075 SeriesChartType.Range, 1076 SeriesChartType.SplineRange 1077 }; 1078 attrInfo = new CustomPropertyInfo( 1079 CustomPropertyName.ShowMarkerLines, 1080 typeof(bool), 1081 false, 1082 SR.DescriptionCustomAttributeShowMarkerLines, 1083 chartTypes, 1084 true, 1085 true); 1086 attrInfo.AppliesTo2D = false; 1087 registeredCustomProperties.Add( attrInfo ); 1088 1089 // "LineTension" attribute 1090 chartTypes = new SeriesChartType[] { 1091 SeriesChartType.Spline, 1092 SeriesChartType.SplineArea, 1093 SeriesChartType.SplineRange 1094 }; 1095 attrInfo = new CustomPropertyInfo( 1096 CustomPropertyName.LineTension, 1097 typeof(float), 1098 0.5f, 1099 SR.DescriptionCustomAttributeLineTension, 1100 chartTypes, 1101 true, 1102 false); 1103 attrInfo.MinValue = 0f; 1104 attrInfo.MaxValue = 2f; 1105 registeredCustomProperties.Add( attrInfo ); 1106 1107 // "PixelPointDepth" attribute 1108 chartTypes = new SeriesChartType[] { 1109 SeriesChartType.Area, 1110 SeriesChartType.Bar, 1111 SeriesChartType.Bubble, 1112 SeriesChartType.Candlestick, 1113 SeriesChartType.Column, 1114 SeriesChartType.Line, 1115 SeriesChartType.Point, 1116 SeriesChartType.Spline, 1117 SeriesChartType.SplineArea, 1118 SeriesChartType.StackedArea, 1119 SeriesChartType.StackedArea100, 1120 SeriesChartType.StackedBar, 1121 SeriesChartType.StackedBar100, 1122 SeriesChartType.StackedColumn, 1123 SeriesChartType.StackedColumn100, 1124 SeriesChartType.StepLine, 1125 SeriesChartType.Stock, 1126 1127 SeriesChartType.ThreeLineBreak, 1128 SeriesChartType.BoxPlot, 1129 SeriesChartType.ErrorBar, 1130 SeriesChartType.RangeBar, 1131 SeriesChartType.Kagi, 1132 SeriesChartType.PointAndFigure, 1133 SeriesChartType.Range, 1134 SeriesChartType.RangeColumn, 1135 SeriesChartType.Renko, 1136 SeriesChartType.SplineRange, 1137 SeriesChartType.FastLine, 1138 }; 1139 attrInfo = new CustomPropertyInfo( 1140 CustomPropertyName.PixelPointDepth, 1141 typeof(int), 1142 0, 1143 SR.DescriptionCustomAttributePixelPointDepth, 1144 chartTypes, 1145 true, 1146 false); 1147 attrInfo.MinValue = 0; 1148 attrInfo.MaxValue = CustomPropertyRegistry.MaxValueOfPixelAttribute; 1149 attrInfo.AppliesTo2D = false; 1150 registeredCustomProperties.Add( attrInfo ); 1151 1152 // "PixelPointGapDepth" attribute 1153 attrInfo = new CustomPropertyInfo( 1154 CustomPropertyName.PixelPointGapDepth, 1155 typeof(int), 1156 0, 1157 SR.DescriptionCustomAttributePixelPointGapDepth, 1158 chartTypes, 1159 true, 1160 false); 1161 attrInfo.MinValue = 0; 1162 attrInfo.MaxValue = CustomPropertyRegistry.MaxValueOfPixelAttribute; 1163 attrInfo.AppliesTo2D = false; 1164 registeredCustomProperties.Add( attrInfo ); 1165 1166 1167 1168 //*********************************************************************** 1169 //** FastLine chart type properties 1170 //*********************************************************************** 1171 chartTypes = new SeriesChartType[] { 1172 SeriesChartType.FastLine, 1173 SeriesChartType.FastPoint, 1174 }; 1175 1176 /* NOTE: This is an internal attribute 1177 * 1178 // "PermittedPixelError" attribute 1179 attrInfo = new CustomPropertyInfo( 1180 CustomPropertyName.PixelPointGapDepth, 1181 typeof(float), 1182 1f, 1183 "Gets or sets the acceptable error in pixels for the data point filtering algorithm.", 1184 chartTypes, 1185 true, 1186 false); 1187 attrInfo.MinValue = 0f; 1188 attrInfo.MaxValue = 1f; 1189 registeredCustomProperties.Add( attrInfo ); 1190 */ 1191 //*********************************************************************** 1192 //** Polar chart type properties 1193 //*********************************************************************** 1194 chartTypes = new SeriesChartType[] { 1195 SeriesChartType.Polar 1196 }; 1197 // "AreaDrawingStyle" attribute 1198 attrInfo = new CustomPropertyInfo( 1199 CustomPropertyName.AreaDrawingStyle, 1200 typeof(CircularAreaDrawingStyles), 1201 "Circle", 1202 SR.DescriptionCustomAttributePolarAreaDrawingStyle, 1203 chartTypes, 1204 true, 1205 false); 1206 registeredCustomProperties.Add( attrInfo ); 1207 1208 // "CircularLabelsStyle" attribute 1209 attrInfo = new CustomPropertyInfo( 1210 CustomPropertyName.CircularLabelsStyle, 1211 typeof(CircularAxisLabelsStyle), 1212 "Auto", 1213 SR.DescriptionCustomAttributePolarCircularLabelsStyle, 1214 chartTypes, 1215 true, 1216 false); 1217 registeredCustomProperties.Add( attrInfo ); 1218 1219 // "PolarDrawingStyle" attribute 1220 attrInfo = new CustomPropertyInfo( 1221 CustomPropertyName.PolarDrawingStyle, 1222 typeof(PolarDrawingStyles), 1223 "Line", 1224 SR.DescriptionCustomAttributePolarDrawingStyle, 1225 chartTypes, 1226 true, 1227 false); 1228 registeredCustomProperties.Add( attrInfo ); 1229 1230 1231 1232 //*********************************************************************** 1233 //** Radar chart type properties 1234 //*********************************************************************** 1235 chartTypes = new SeriesChartType[] { 1236 SeriesChartType.Radar 1237 }; 1238 // "AreaDrawingStyle" attribute 1239 attrInfo = new CustomPropertyInfo( 1240 CustomPropertyName.AreaDrawingStyle, 1241 typeof(CircularAreaDrawingStyles), 1242 "Circle", 1243 SR.DescriptionCustomAttributeRadarAreaDrawingStyle, 1244 chartTypes, 1245 true, 1246 false); 1247 registeredCustomProperties.Add( attrInfo ); 1248 1249 // "CircularLabelsStyle" attribute 1250 attrInfo = new CustomPropertyInfo( 1251 CustomPropertyName.CircularLabelsStyle, 1252 typeof(CircularAxisLabelsStyle), 1253 "Auto", 1254 SR.DescriptionCustomAttributeRadarCircularLabelsStyle, 1255 chartTypes, 1256 true, 1257 false); 1258 registeredCustomProperties.Add( attrInfo ); 1259 1260 // "RadarDrawingStyle" attribute 1261 attrInfo = new CustomPropertyInfo( 1262 CustomPropertyName.RadarDrawingStyle, 1263 typeof(RadarDrawingStyle), 1264 "Area", 1265 SR.DescriptionCustomAttributeRadarDrawingStyle, 1266 chartTypes, 1267 true, 1268 false); 1269 registeredCustomProperties.Add( attrInfo ); 1270 1271 1272 //*********************************************************************** 1273 //** BoxPlot chart type properties 1274 //*********************************************************************** 1275 chartTypes = new SeriesChartType[] { 1276 SeriesChartType.BoxPlot 1277 }; 1278 // "BoxPlotPercentile" attribute 1279 attrInfo = new CustomPropertyInfo( 1280 CustomPropertyName.BoxPlotPercentile, 1281 typeof(float), 1282 25f, 1283 SR.DescriptionCustomAttributeBoxPlotPercentile, 1284 chartTypes, 1285 true, 1286 false); 1287 attrInfo.MinValue = 0f; 1288 attrInfo.MaxValue = 1000f; 1289 registeredCustomProperties.Add( attrInfo ); 1290 1291 // "BoxPlotWhiskerPercentile" attribute 1292 attrInfo = new CustomPropertyInfo( 1293 CustomPropertyName.BoxPlotWhiskerPercentile, 1294 typeof(float), 1295 10f, 1296 SR.DescriptionCustomAttributeBoxPlotWhiskerPercentile, 1297 chartTypes, 1298 true, 1299 false); 1300 attrInfo.MinValue = 0f; 1301 attrInfo.MaxValue = 1000f; 1302 registeredCustomProperties.Add( attrInfo ); 1303 1304 // "BoxPlotShowAverage" attribute 1305 attrInfo = new CustomPropertyInfo( 1306 CustomPropertyName.BoxPlotShowAverage, 1307 typeof(bool), 1308 true, 1309 SR.DescriptionCustomAttributeBoxPlotShowAverage, 1310 chartTypes, 1311 true, 1312 false); 1313 registeredCustomProperties.Add( attrInfo ); 1314 1315 // "BoxPlotShowMedian" attribute 1316 attrInfo = new CustomPropertyInfo( 1317 CustomPropertyName.BoxPlotShowMedian, 1318 typeof(bool), 1319 true, 1320 SR.DescriptionCustomAttributeBoxPlotShowMedian, 1321 chartTypes, 1322 true, 1323 false); 1324 registeredCustomProperties.Add( attrInfo ); 1325 1326 // "BoxPlotShowUnusualValues" attribute 1327 attrInfo = new CustomPropertyInfo( 1328 CustomPropertyName.BoxPlotShowUnusualValues, 1329 typeof(bool), 1330 false, 1331 SR.DescriptionCustomAttributeBoxPlotShowUnusualValues, 1332 chartTypes, 1333 true, 1334 false); 1335 registeredCustomProperties.Add( attrInfo ); 1336 1337 // "BoxPlotSeries" attribute 1338 attrInfo = new CustomPropertyInfo( 1339 CustomPropertyName.BoxPlotSeries, 1340 typeof(string), 1341 "", 1342 SR.DescriptionCustomAttributeBoxPlotSeries, 1343 chartTypes, 1344 true, 1345 false); 1346 registeredCustomProperties.Add( attrInfo ); 1347 1348 //*********************************************************************** 1349 //** ErrorBar chart type properties 1350 //*********************************************************************** 1351 chartTypes = new SeriesChartType[] { 1352 SeriesChartType.ErrorBar 1353 }; 1354 // "ErrorBarStyle" attribute 1355 attrInfo = new CustomPropertyInfo( 1356 CustomPropertyName.ErrorBarStyle, 1357 typeof(ErrorBarStyle), 1358 "Both", 1359 SR.DescriptionCustomAttributeErrorBarStyle, 1360 chartTypes, 1361 true, 1362 true); 1363 registeredCustomProperties.Add( attrInfo ); 1364 1365 // "ErrorBarCenterMarkerStyle" attribute 1366 attrInfo = new CustomPropertyInfo( 1367 CustomPropertyName.ErrorBarCenterMarkerStyle, 1368 typeof(ErrorBarMarkerStyles), 1369 "Line", 1370 SR.DescriptionCustomAttributeErrorBarCenterMarkerStyle, 1371 chartTypes, 1372 true, 1373 true); 1374 registeredCustomProperties.Add( attrInfo ); 1375 1376 // "ErrorBarSeries" attribute 1377 attrInfo = new CustomPropertyInfo( 1378 CustomPropertyName.ErrorBarSeries, 1379 typeof(string), 1380 "", 1381 SR.DescriptionCustomAttributeErrorBarSeries, 1382 chartTypes, 1383 true, 1384 false); 1385 registeredCustomProperties.Add( attrInfo ); 1386 1387 // "ErrorBarType" attribute 1388 attrInfo = new CustomPropertyInfo( 1389 CustomPropertyName.ErrorBarType, 1390 typeof(string), 1391 String.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}({1:N0})", ErrorBarType.StandardError, ErrorBarChart.DefaultErrorBarTypeValue(ErrorBarType.StandardError)), 1392 SR.DescriptionCustomAttributeErrorBarType, 1393 chartTypes, 1394 true, 1395 false); 1396 registeredCustomProperties.Add( attrInfo ); 1397 1398 1399 //*********************************************************************** 1400 //** PointAndFigure chart types properties 1401 //*********************************************************************** 1402 chartTypes = new SeriesChartType[] { SeriesChartType.PointAndFigure }; 1403 1404 // "UsedYValueHigh" attribute 1405 attrInfo = new CustomPropertyInfo( 1406 CustomPropertyName.UsedYValueHigh, 1407 typeof(int), 1408 0, 1409 SR.DescriptionCustomAttributeUsedYValueHigh, 1410 chartTypes, 1411 true, 1412 false); 1413 attrInfo.MinValue = 0; 1414 attrInfo.MaxValue = 20; 1415 registeredCustomProperties.Add( attrInfo ); 1416 1417 // "UsedYValueLow" attribute 1418 attrInfo = new CustomPropertyInfo( 1419 CustomPropertyName.UsedYValueLow, 1420 typeof(int), 1421 1, 1422 SR.DescriptionCustomAttributeUsedYValueLow, 1423 chartTypes, 1424 true, 1425 false); 1426 attrInfo.MinValue = 0; 1427 attrInfo.MaxValue = 20; 1428 registeredCustomProperties.Add( attrInfo ); 1429 1430 // "PriceUpColor" attribute 1431 attrInfo = new CustomPropertyInfo( 1432 CustomPropertyName.PriceUpColor, 1433 typeof(Color), 1434 "", 1435 SR.DescriptionCustomAttributeBarsPriceUpColor, 1436 chartTypes, 1437 true, 1438 false); 1439 registeredCustomProperties.Add( attrInfo ); 1440 1441 // "BoxSize" attribute 1442 attrInfo = new CustomPropertyInfo( 1443 CustomPropertyName.BoxSize, 1444 typeof(string), 1445 "4%", 1446 SR.DescriptionCustomAttributePointFigureBoxSize, 1447 chartTypes, 1448 true, 1449 false); 1450 registeredCustomProperties.Add( attrInfo ); 1451 1452 // "ProportionalSymbols" attribute 1453 attrInfo = new CustomPropertyInfo( 1454 CustomPropertyName.ProportionalSymbols, 1455 typeof(bool), 1456 true, 1457 SR.DescriptionCustomAttributeProportionalSymbols, 1458 chartTypes, 1459 true, 1460 false); 1461 registeredCustomProperties.Add( attrInfo ); 1462 1463 // "ReversalAmount" attribute 1464 attrInfo = new CustomPropertyInfo( 1465 CustomPropertyName.ReversalAmount, 1466 typeof(int), 1467 "3", 1468 SR.DescriptionCustomAttributeReversalAmount, 1469 chartTypes, 1470 true, 1471 false); 1472 registeredCustomProperties.Add( attrInfo ); 1473 1474 //*********************************************************************** 1475 //** Kagi chart types properties 1476 //*********************************************************************** 1477 chartTypes = new SeriesChartType[] { SeriesChartType.Kagi }; 1478 1479 // "UsedYValue" attribute 1480 attrInfo = new CustomPropertyInfo( 1481 CustomPropertyName.UsedYValue, 1482 typeof(int), 1483 0, 1484 SR.DescriptionCustomAttributeUsedYValue, 1485 chartTypes, 1486 true, 1487 false); 1488 attrInfo.MinValue = 0; 1489 attrInfo.MaxValue = 20; 1490 registeredCustomProperties.Add( attrInfo ); 1491 1492 // "PriceUpColor" attribute 1493 attrInfo = new CustomPropertyInfo( 1494 CustomPropertyName.PriceUpColor, 1495 typeof(Color), 1496 "", 1497 SR.DescriptionCustomAttributeBarsPriceUpColor, 1498 chartTypes, 1499 true, 1500 false); 1501 registeredCustomProperties.Add( attrInfo ); 1502 1503 // "ReversalAmount" attribute 1504 attrInfo = new CustomPropertyInfo( 1505 CustomPropertyName.ReversalAmount, 1506 typeof(string), 1507 "3%", 1508 SR.DescriptionCustomAttributeKagiReversalAmount, 1509 chartTypes, 1510 true, 1511 false); 1512 registeredCustomProperties.Add( attrInfo ); 1513 1514 //*********************************************************************** 1515 //** Renko chart types properties 1516 //*********************************************************************** 1517 chartTypes = new SeriesChartType[] { SeriesChartType.Renko }; 1518 1519 // "UsedYValue" attribute 1520 attrInfo = new CustomPropertyInfo( 1521 CustomPropertyName.UsedYValue, 1522 typeof(int), 1523 0, 1524 SR.DescriptionCustomAttributeRenkoUsedYValue, 1525 chartTypes, 1526 true, 1527 false); 1528 attrInfo.MinValue = 0; 1529 attrInfo.MaxValue = 20; 1530 registeredCustomProperties.Add( attrInfo ); 1531 1532 // "PriceUpColor" attribute 1533 attrInfo = new CustomPropertyInfo( 1534 CustomPropertyName.PriceUpColor, 1535 typeof(Color), 1536 "", 1537 SR.DescriptionCustomAttributeBarsPriceUpColor, 1538 chartTypes, 1539 true, 1540 false); 1541 registeredCustomProperties.Add( attrInfo ); 1542 1543 // "BoxSize" attribute 1544 attrInfo = new CustomPropertyInfo( 1545 CustomPropertyName.BoxSize, 1546 typeof(string), 1547 "4%", 1548 SR.DescriptionCustomAttributeBoxSize, 1549 chartTypes, 1550 true, 1551 false); 1552 registeredCustomProperties.Add( attrInfo ); 1553 1554 //*********************************************************************** 1555 //** ThreeLineBreak chart types properties 1556 //*********************************************************************** 1557 chartTypes = new SeriesChartType[] { SeriesChartType.ThreeLineBreak }; 1558 1559 // "UsedYValue" attribute 1560 attrInfo = new CustomPropertyInfo( 1561 CustomPropertyName.UsedYValue, 1562 typeof(int), 1563 0, 1564 SR.DescriptionCustomAttributeThreeLineBreakUsedYValue, 1565 chartTypes, 1566 true, 1567 false); 1568 attrInfo.MinValue = 0; 1569 attrInfo.MaxValue = 20; 1570 registeredCustomProperties.Add( attrInfo ); 1571 1572 // "PriceUpColor" attribute 1573 attrInfo = new CustomPropertyInfo( 1574 CustomPropertyName.PriceUpColor, 1575 typeof(Color), 1576 "", 1577 SR.DescriptionCustomAttributeBarsPriceUpColor, 1578 chartTypes, 1579 true, 1580 false); 1581 registeredCustomProperties.Add( attrInfo ); 1582 1583 // "NumberOfLinesInBreak" attribute 1584 attrInfo = new CustomPropertyInfo( 1585 CustomPropertyName.NumberOfLinesInBreak, 1586 typeof(int), 1587 3, 1588 SR.DescriptionCustomAttributeNumberOfLinesInBreak, 1589 chartTypes, 1590 true, 1591 false); 1592 registeredCustomProperties.Add( attrInfo ); 1593 1594 1595 1596 //*********************************************************************** 1597 //** Funnel chart types properties 1598 //*********************************************************************** 1599 chartTypes = new SeriesChartType[] { SeriesChartType.Funnel }; 1600 1601 1602 // "FunnelLabelStyle" attribute 1603 attrInfo = new CustomPropertyInfo( 1604 CustomPropertyName.FunnelLabelStyle, 1605 typeof(FunnelLabelStyle), 1606 "OutsideInColumn", 1607 SR.DescriptionCustomAttributeFunnelLabelStyle, 1608 chartTypes, 1609 true, 1610 true); 1611 registeredCustomProperties.Add( attrInfo ); 1612 1613 1614 // "FunnelNeckWidth" attribute 1615 attrInfo = new CustomPropertyInfo( 1616 CustomPropertyName.FunnelNeckWidth, 1617 typeof(float), 1618 5f, 1619 SR.DescriptionCustomAttributeFunnelNeckWidth, 1620 chartTypes, 1621 true, 1622 false); 1623 attrInfo.MinValue = 0f; 1624 attrInfo.MaxValue = 100f; 1625 registeredCustomProperties.Add( attrInfo ); 1626 1627 // "FunnelNeckHeight" attribute 1628 attrInfo = new CustomPropertyInfo( 1629 CustomPropertyName.FunnelNeckHeight, 1630 typeof(float), 1631 5f, 1632 SR.DescriptionCustomAttributeFunnelNeckHeight, 1633 chartTypes, 1634 true, 1635 false); 1636 attrInfo.MinValue = 0f; 1637 attrInfo.MaxValue = 100f; 1638 registeredCustomProperties.Add( attrInfo ); 1639 1640 // "FunnelMinPointHeight" attribute 1641 attrInfo = new CustomPropertyInfo( 1642 CustomPropertyName.FunnelMinPointHeight, 1643 typeof(float), 1644 0f, 1645 SR.DescriptionCustomAttributeFunnelMinPointHeight, 1646 chartTypes, 1647 true, 1648 false); 1649 attrInfo.MinValue = 0f; 1650 attrInfo.MaxValue = 100f; 1651 registeredCustomProperties.Add( attrInfo ); 1652 1653 // "Funnel3DRotationAngle" attribute 1654 attrInfo = new CustomPropertyInfo( 1655 CustomPropertyName.Funnel3DRotationAngle, 1656 typeof(float), 1657 5f, 1658 SR.DescriptionCustomAttributeFunnel3DRotationAngle, 1659 chartTypes, 1660 true, 1661 false); 1662 attrInfo.AppliesTo2D = false; 1663 attrInfo.MinValue = -10f; 1664 attrInfo.MaxValue = 10f; 1665 registeredCustomProperties.Add( attrInfo ); 1666 1667 // "FunnelPointGap" attribute 1668 attrInfo = new CustomPropertyInfo( 1669 CustomPropertyName.FunnelPointGap, 1670 typeof(float), 1671 0f, 1672 SR.DescriptionCustomAttributeFunnelPointGap, 1673 chartTypes, 1674 true, 1675 false); 1676 attrInfo.MinValue = 0f; 1677 attrInfo.MaxValue = 100f; 1678 registeredCustomProperties.Add( attrInfo ); 1679 1680 // "Funnel3DDrawingStyle" attribute 1681 attrInfo = new CustomPropertyInfo( 1682 CustomPropertyName.Funnel3DDrawingStyle, 1683 typeof(Funnel3DDrawingStyle), 1684 "CircularBase", 1685 SR.DescriptionCustomAttributeFunnel3DDrawingStyle, 1686 chartTypes, 1687 true, 1688 false); 1689 attrInfo.AppliesTo2D = false; 1690 registeredCustomProperties.Add( attrInfo ); 1691 1692 // "FunnelStyle" attribute 1693 attrInfo = new CustomPropertyInfo( 1694 CustomPropertyName.FunnelStyle, 1695 typeof(FunnelStyle), 1696 "YIsHeight", 1697 SR.DescriptionCustomAttributeFunnelStyle, 1698 chartTypes, 1699 true, 1700 false); 1701 registeredCustomProperties.Add( attrInfo ); 1702 1703 // "FunnelInsideLabelAlignment" attribute 1704 attrInfo = new CustomPropertyInfo( 1705 CustomPropertyName.FunnelInsideLabelAlignment, 1706 typeof(FunnelLabelVerticalAlignment), 1707 "Center", 1708 SR.DescriptionCustomAttributeFunnelInsideLabelAlignment, 1709 chartTypes, 1710 true, 1711 true); 1712 registeredCustomProperties.Add( attrInfo ); 1713 1714 // "FunnelOutsideLabelPlacement" attribute 1715 attrInfo = new CustomPropertyInfo( 1716 CustomPropertyName.FunnelOutsideLabelPlacement, 1717 typeof(FunnelLabelPlacement), 1718 "Right", 1719 SR.DescriptionCustomAttributeFunnelOutsideLabelPlacement, 1720 chartTypes, 1721 true, 1722 true); 1723 registeredCustomProperties.Add( attrInfo ); 1724 1725 // "CalloutLineColor" attribute 1726 attrInfo = new CustomPropertyInfo( 1727 CustomPropertyName.CalloutLineColor, 1728 typeof(Color), 1729 "Black", 1730 SR.DescriptionCustomAttributeCalloutLineColor, 1731 chartTypes, 1732 true, 1733 true); 1734 registeredCustomProperties.Add( attrInfo ); 1735 1736 //*********************************************************************** 1737 //** Pyramid chart types properties 1738 //*********************************************************************** 1739 chartTypes = new SeriesChartType[] { SeriesChartType.Pyramid }; 1740 1741 1742 // "PyramidLabelStyle" attribute 1743 attrInfo = new CustomPropertyInfo( 1744 CustomPropertyName.PyramidLabelStyle, 1745 typeof(FunnelLabelStyle), 1746 "OutsideInColumn", 1747 SR.DescriptionCustomAttributePyramidLabelStyle, 1748 chartTypes, 1749 true, 1750 true); 1751 registeredCustomProperties.Add( attrInfo ); 1752 1753 1754 // "PyramidMinPointHeight" attribute 1755 attrInfo = new CustomPropertyInfo( 1756 CustomPropertyName.PyramidMinPointHeight, 1757 typeof(float), 1758 0f, 1759 SR.DescriptionCustomAttributePyramidMinPointHeight, 1760 chartTypes, 1761 true, 1762 false); 1763 attrInfo.MinValue = 0f; 1764 attrInfo.MaxValue = 100f; 1765 registeredCustomProperties.Add( attrInfo ); 1766 1767 // "Pyramid3DRotationAngle" attribute 1768 attrInfo = new CustomPropertyInfo( 1769 CustomPropertyName.Pyramid3DRotationAngle, 1770 typeof(float), 1771 5f, 1772 SR.DescriptionCustomAttributePyramid3DRotationAngle, 1773 chartTypes, 1774 true, 1775 false); 1776 attrInfo.AppliesTo2D = false; 1777 attrInfo.MinValue = -10f; 1778 attrInfo.MaxValue = 10f; 1779 registeredCustomProperties.Add( attrInfo ); 1780 1781 // "PyramidPointGap" attribute 1782 attrInfo = new CustomPropertyInfo( 1783 CustomPropertyName.PyramidPointGap, 1784 typeof(float), 1785 0f, 1786 SR.DescriptionCustomAttributePyramidPointGap, 1787 chartTypes, 1788 true, 1789 false); 1790 attrInfo.MinValue = 0f; 1791 attrInfo.MaxValue = 100f; 1792 registeredCustomProperties.Add( attrInfo ); 1793 1794 // "Pyramid3DDrawingStyle" attribute 1795 attrInfo = new CustomPropertyInfo( 1796 CustomPropertyName.Pyramid3DDrawingStyle, 1797 typeof(Funnel3DDrawingStyle), 1798 "SquareBase", 1799 SR.DescriptionCustomAttributePyramid3DDrawingStyle, 1800 chartTypes, 1801 true, 1802 false); 1803 attrInfo.AppliesTo2D = false; 1804 registeredCustomProperties.Add( attrInfo ); 1805 1806 // "PyramidInsideLabelAlignment" attribute 1807 attrInfo = new CustomPropertyInfo( 1808 CustomPropertyName.PyramidInsideLabelAlignment, 1809 typeof(FunnelLabelVerticalAlignment), 1810 "Center", 1811 SR.DescriptionCustomAttributePyramidInsideLabelAlignment, 1812 chartTypes, 1813 true, 1814 true); 1815 registeredCustomProperties.Add( attrInfo ); 1816 1817 // "PyramidOutsideLabelPlacement" attribute 1818 attrInfo = new CustomPropertyInfo( 1819 CustomPropertyName.PyramidOutsideLabelPlacement, 1820 typeof(FunnelLabelPlacement), 1821 "Right", 1822 SR.DescriptionCustomAttributePyramidOutsideLabelPlacement, 1823 chartTypes, 1824 true, 1825 true); 1826 registeredCustomProperties.Add( attrInfo ); 1827 1828 // "CalloutLineColor" attribute 1829 attrInfo = new CustomPropertyInfo( 1830 CustomPropertyName.CalloutLineColor, 1831 typeof(Color), 1832 "Black", 1833 SR.DescriptionCustomAttributeCalloutLineColor, 1834 chartTypes, 1835 true, 1836 true); 1837 registeredCustomProperties.Add( attrInfo ); 1838 1839 // "PyramidValueType" attribute 1840 attrInfo = new CustomPropertyInfo( 1841 CustomPropertyName.PyramidValueType, 1842 typeof(PyramidValueType), 1843 "Linear", 1844 SR.DescriptionCustomAttributePyramidValueType, 1845 chartTypes, 1846 true, 1847 false); 1848 registeredCustomProperties.Add( attrInfo ); 1849 1850 1851 } 1852 1853 #endregion // Attributes Regestering methods 1854 1855 #region Registry methods 1856 1857 /// <summary> 1858 /// Adds custom attribute information into the registry. 1859 /// </summary> 1860 /// <param name="customPropertyInfo">Custom attribute information.</param> Register(CustomPropertyInfo customPropertyInfo)1861 public void Register(CustomPropertyInfo customPropertyInfo) 1862 { 1863 // Add custom attribute information to the hash table 1864 registeredCustomProperties.Add(customPropertyInfo); 1865 } 1866 1867 #endregion 1868 } 1869 1870 /// <summary> 1871 /// CustomPropertyInfo class stores information about single 1872 /// custom attribute. It includes Name, Description, Default 1873 /// Value, any restrictions and the conditions when it can 1874 /// be used. 1875 /// 1876 /// Most of the custom attribute can only be used when specific 1877 /// chart type is selected. Some of the properties only work 1878 /// in 2D or 3D mode and some can be applied to the whole 1879 /// series or data points only. 1880 /// </summary> 1881 internal class CustomPropertyInfo 1882 { 1883 #region Public Fields 1884 1885 /// <summary> 1886 /// Attribute name. 1887 /// </summary> 1888 public string Name = String.Empty; 1889 1890 /// <summary> 1891 /// Attribute value type. 1892 /// </summary> 1893 public Type ValueType = typeof(int); 1894 1895 /// <summary> 1896 /// Attribute default value. 1897 /// </summary> 1898 public object DefaultValue = null; 1899 1900 /// <summary> 1901 /// Attribute description. 1902 /// </summary> 1903 public string Description = String.Empty; 1904 1905 /// <summary> 1906 /// Array of chart type supported by the attribute 1907 /// </summary> 1908 public SeriesChartType[] AppliesToChartType = null; 1909 1910 /// <summary> 1911 /// Indicates that attribute can be applied on series. 1912 /// </summary> 1913 public bool AppliesToSeries = true; 1914 1915 /// <summary> 1916 /// Indicates that attribute can be applied on data point. 1917 /// </summary> 1918 public bool AppliesToDataPoint = true; 1919 1920 /// <summary> 1921 /// Indicates that attribute can be applied on 3D chart type. 1922 /// </summary> 1923 public bool AppliesTo3D = true; 1924 1925 /// <summary> 1926 /// Indicates that attribute can be applied on 2D chart type. 1927 /// </summary> 1928 public bool AppliesTo2D = true; 1929 1930 /// <summary> 1931 /// Attribute minimum value. 1932 /// </summary> 1933 public object MinValue = null; 1934 1935 /// <summary> 1936 /// Attribute maximum value. 1937 /// </summary> 1938 public object MaxValue = null; 1939 1940 #endregion // Public Fields 1941 1942 #region Constructor 1943 1944 /// <summary> 1945 /// Public constructor. 1946 /// </summary> 1947 /// <param name="name">Attribute name</param> 1948 /// <param name="valueType">Attribute value type.</param> 1949 /// <param name="defaultValue">Attribute default value.</param> 1950 /// <param name="description">Attribute description.</param> 1951 /// <param name="appliesToChartType">Array of chart types where attribute used.</param> 1952 /// <param name="appliesToSeries">True if properties can be set in series.</param> 1953 /// <param name="appliesToDataPoint">True if properties can be set in data point.</param> CustomPropertyInfo( string name, Type valueType, object defaultValue, string description, SeriesChartType[] appliesToChartType, bool appliesToSeries, bool appliesToDataPoint)1954 public CustomPropertyInfo( 1955 string name, 1956 Type valueType, 1957 object defaultValue, 1958 string description, 1959 SeriesChartType[] appliesToChartType, 1960 bool appliesToSeries, 1961 bool appliesToDataPoint) 1962 { 1963 this.Name = name; 1964 this.ValueType = valueType; 1965 this.DefaultValue = defaultValue; 1966 this.Description = description; 1967 this.AppliesToChartType = appliesToChartType; 1968 this.AppliesToSeries = appliesToSeries; 1969 this.AppliesToDataPoint = appliesToDataPoint; 1970 } 1971 1972 #endregion // Constructor 1973 } 1974 } 1975