| OLD | NEW |
| (Empty) |
| 1 // | |
| 2 // Copyright 2014 Google Inc. All rights reserved. | |
| 3 // | |
| 4 // Use of this source code is governed by a BSD-style | |
| 5 // license that can be found in the LICENSE file or at | |
| 6 // https://developers.google.com/open-source/licenses/bsd | |
| 7 // | |
| 8 | |
| 9 part of charted.charts; | |
| 10 | |
| 11 /// | |
| 12 /// Interface to be implemented by data providers to give tabular access to | |
| 13 /// data for chart renderers. | |
| 14 /// | |
| 15 abstract class ChartData { | |
| 16 /// Read-only access to column specs | |
| 17 Iterable<ChartColumnSpec> get columns; | |
| 18 | |
| 19 /// Read-only access to rows | |
| 20 Iterable<Iterable> get rows; | |
| 21 | |
| 22 /// Create a new instance of [ChartData]'s internal implementation | |
| 23 factory ChartData( | |
| 24 Iterable<ChartColumnSpec> columns, Iterable<Iterable> rows) = DefaultChart
DataImpl; | |
| 25 } | |
| 26 | |
| 27 /// | |
| 28 /// Interface implemented by [ChartData] transformers. | |
| 29 /// Examples: | |
| 30 /// [AggregationTransformer] to compute aggregated rows/columns | |
| 31 /// [FilterTransformer] to filter data | |
| 32 /// [TransposeTransformer] to convert rows to columns and vice-versa | |
| 33 /// | |
| 34 abstract class ChartDataTransform { | |
| 35 /// Create a new instance of [ChartData] by selecting a subset | |
| 36 /// of rows and columns from the current one | |
| 37 ChartData transform(ChartData source); | |
| 38 } | |
| 39 | |
| 40 | |
| 41 /// | |
| 42 /// Implementation of [ChangeRecord], that is used to notify when rows get added | |
| 43 /// or removed to ChartData | |
| 44 /// | |
| 45 class ChartRowChangeRecord implements ChangeRecord { | |
| 46 /// Changes to the rows - contains all updates to rows since last notification
. | |
| 47 final List<ListChangeRecord> changes; | |
| 48 | |
| 49 const ChartRowChangeRecord(this.changes); | |
| 50 } | |
| 51 | |
| 52 /// | |
| 53 /// Implementation of [ChangeRecord], that is used to notify changes to | |
| 54 /// values in [ChartData]. | |
| 55 /// | |
| 56 class ChartValueChangeRecord implements ChangeRecord { | |
| 57 /// Row that changed. | |
| 58 final int row; | |
| 59 | |
| 60 /// List of changes to data on the row - includes all updates since the | |
| 61 /// last change notification. | |
| 62 final List<ListChangeRecord> changes; | |
| 63 | |
| 64 const ChartValueChangeRecord(this.row, this.changes); | |
| 65 } | |
| 66 | |
| 67 /// | |
| 68 /// Meta information for each column in ChartData | |
| 69 /// | |
| 70 class ChartColumnSpec { | |
| 71 static const String TYPE_BOOLEAN = 'boolean'; | |
| 72 static const String TYPE_DATE = 'date'; | |
| 73 static const String TYPE_NUMBER = 'number'; | |
| 74 static const String TYPE_STRING = 'string'; | |
| 75 static const String TYPE_TIMESTAMP = 'timestamp'; | |
| 76 | |
| 77 static const List ORDINAL_SCALES = const [ TYPE_STRING ]; | |
| 78 static const List LINEAR_SCALES = const [ TYPE_NUMBER ]; | |
| 79 static const List TIME_SCALES = const [ TYPE_DATE, TYPE_TIMESTAMP ]; | |
| 80 | |
| 81 /// Formatter for values that belong to this column | |
| 82 final FormatFunction formatter; | |
| 83 | |
| 84 /// Label for the column. Used in legend, tooltips etc; | |
| 85 /// When not specified, defaults to empty string. | |
| 86 final String label; | |
| 87 | |
| 88 /// Type of data in this column. Used for interpolations, computing | |
| 89 /// scales and ranges. When not specified, it is assumed to be "number" | |
| 90 /// for measures and "string" for dimensions. | |
| 91 final String type; | |
| 92 | |
| 93 /// Indicates if this column requires [OrdinalScale]. | |
| 94 /// | |
| 95 /// If not specified, an ordinal scale is used for string columns and | |
| 96 /// quantitative scales are used for others. | |
| 97 final bool useOrdinalScale; | |
| 98 | |
| 99 /// Initialize axis scale according to [ChartColumnSpec] type. | |
| 100 /// This logic is extracted from [ChartArea] implementation for conveniently | |
| 101 /// adding more scale types. | |
| 102 Scale createDefaultScale() { | |
| 103 if (useOrdinalScale == true) { | |
| 104 return new OrdinalScale(); | |
| 105 } | |
| 106 else if (LINEAR_SCALES.contains(type)) { | |
| 107 return new LinearScale(); | |
| 108 } | |
| 109 else if (TIME_SCALES.contains(type)) { | |
| 110 return new TimeScale(); | |
| 111 } | |
| 112 return null; | |
| 113 } | |
| 114 | |
| 115 ChartColumnSpec({this.label, String type : TYPE_NUMBER, | |
| 116 this.formatter, bool useOrdinalScale}) | |
| 117 : useOrdinalScale = | |
| 118 useOrdinalScale == true || | |
| 119 useOrdinalScale == null && ORDINAL_SCALES.contains(type), | |
| 120 type = type; | |
| 121 } | |
| OLD | NEW |