- Timestamp:
- 04/15/11 18:41:13 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/histogram/HeuristicLab.Analysis.Views/3.3/DataTableView.cs
r6011 r6012 60 60 } 61 61 62 #region Event Handler Registration 62 63 /// <summary> 63 64 /// Removes the eventhandlers from the underlying <see cref="Variable"/>. … … 89 90 RegisterDataRowEvents(row); 90 91 } 92 93 /// <summary> 94 /// Automatically called for every existing data row and whenever a data row is added 95 /// to the data table. Do not call this method directly. 96 /// </summary> 97 /// <param name="row">The DataRow that was added.</param> 98 protected virtual void RegisterDataRowEvents(DataRow row) { 99 row.NameChanged += new EventHandler(Row_NameChanged); 100 row.VisualPropertiesChanged += new EventHandler(Row_VisualPropertiesChanged); 101 valuesRowsTable.Add(row.Values, row); 102 row.Values.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsAdded); 103 row.Values.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsRemoved); 104 row.Values.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsReplaced); 105 row.Values.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsMoved); 106 row.Values.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_CollectionReset); 107 } 108 109 /// <summary> 110 /// Automatically called for every data row that is removed from the DataTable. Do 111 /// not directly call this method. 112 /// </summary> 113 /// <param name="row">The DataRow that was removed.</param> 114 protected virtual void DeregisterDataRowEvents(DataRow row) { 115 row.Values.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsAdded); 116 row.Values.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsRemoved); 117 row.Values.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsReplaced); 118 row.Values.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsMoved); 119 row.Values.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_CollectionReset); 120 valuesRowsTable.Remove(row.Values); 121 row.VisualPropertiesChanged -= new EventHandler(Row_VisualPropertiesChanged); 122 row.NameChanged -= new EventHandler(Row_NameChanged); 123 } 124 #endregion 91 125 92 126 protected override void OnContentChanged() { … … 113 147 } 114 148 115 116 149 /// <summary> 117 150 /// Add the DataRow as a series to the chart. … … 120 153 protected virtual void AddDataRow(DataRow row) { 121 154 Series series = new Series(row.Name); 155 ConfigureSeries(series, row); 156 FillSeriesWithRowValues(series, row); 157 158 chart.Series.Add(series); 159 chart.ChartAreas[0].RecalculateAxesScale(); 160 UpdateYCursorInterval(); 161 } 162 163 private void ConfigureSeries(Series series, DataRow row) { 164 RemoveCustomPropertyIfExists(series, "PointWidth"); 165 series.BorderWidth = 1; 166 series.BorderDashStyle = ChartDashStyle.Solid; 167 122 168 switch (row.VisualProperties.ChartType) { 123 169 case DataRowVisualProperties.DataRowChartType.Line: 124 170 series.ChartType = SeriesChartType.FastLine; 171 series.BorderWidth = row.VisualProperties.LineWidth; 172 series.BorderDashStyle = ConvertLineStyle(row.VisualProperties.LineStyle); 125 173 break; 126 174 case DataRowVisualProperties.DataRowChartType.Bars: … … 132 180 case DataRowVisualProperties.DataRowChartType.Points: 133 181 series.ChartType = SeriesChartType.FastPoint; 182 series.BorderWidth = row.VisualProperties.LineWidth; 183 series.BorderDashStyle = ConvertLineStyle(row.VisualProperties.LineStyle); 134 184 break; 135 185 case DataRowVisualProperties.DataRowChartType.Histogram: 136 186 series.ChartType = SeriesChartType.Column; 137 series ["PointWidth"] = "1";187 series.SetCustomProperty("PointWidth", "1"); 138 188 break; 139 189 default: … … 143 193 series.YAxisType = row.VisualProperties.SecondYAxis ? AxisType.Secondary : AxisType.Primary; 144 194 series.XAxisType = row.VisualProperties.SecondXAxis ? AxisType.Secondary : AxisType.Primary; 145 if (row.VisualProperties.Color != Color.Empty) series.Color = row.VisualProperties.Color; 195 if (row.VisualProperties.Color != Color.Empty) 196 series.Color = row.VisualProperties.Color; 197 else series.Color = Color.Empty; 146 198 series.ToolTip = row.Name + " X = #INDEX, Y = #VAL"; 147 FillSeriesWithRowValues(series, row); 148 chart.Series.Add(series); 149 chart.ChartAreas[0].RecalculateAxesScale(); 150 UpdateYCursorInterval(); 151 } 152 199 } 153 200 154 201 /// <summary> … … 156 203 /// </summary> 157 204 protected virtual void UpdateYCursorInterval() { 158 double interestingValuesRange = (from series in chart.Series 159 where series.Enabled 160 let values = (from point in series.Points 161 where !point.IsEmpty 162 select point.YValues[0]) 163 .DefaultIfEmpty(1.0) 164 let range = values.Max() - values.Min() 165 where range > 0.0 166 select range) 167 .DefaultIfEmpty(1.0) 168 .Min(); 205 double interestingValuesRange = ( 206 from series in chart.Series 207 where series.Enabled 208 let values = (from point in series.Points 209 where !point.IsEmpty 210 select point.YValues[0]).DefaultIfEmpty(1.0) 211 let range = values.Max() - values.Min() 212 where range > 0.0 213 select range 214 ).DefaultIfEmpty(1.0).Min(); 169 215 170 216 double digits = (int)Math.Log10(interestingValuesRange) - 3; … … 186 232 } 187 233 188 #region Content Events 189 /// <summary> 190 /// Automatically called for every existing data row and whenever a data row is added 191 /// to the data table. Do not call this method directly. 192 /// </summary> 193 /// <param name="row">The DataRow that was added.</param> 194 protected virtual void RegisterDataRowEvents(DataRow row) { 195 row.NameChanged += new EventHandler(Row_NameChanged); 196 row.VisualPropertiesChanged += new EventHandler(Row_VisualPropertiesChanged); 197 valuesRowsTable.Add(row.Values, row); 198 row.Values.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsAdded); 199 row.Values.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsRemoved); 200 row.Values.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsReplaced); 201 row.Values.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsMoved); 202 row.Values.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_CollectionReset); 203 } 204 205 /// <summary> 206 /// Automatically called for every data row that is removed from the DataTable. Do 207 /// not directly call this method. 208 /// </summary> 209 /// <param name="row">The DataRow that was removed.</param> 210 protected virtual void DeregisterDataRowEvents(DataRow row) { 211 row.Values.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsAdded); 212 row.Values.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsRemoved); 213 row.Values.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsReplaced); 214 row.Values.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsMoved); 215 row.Values.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_CollectionReset); 216 valuesRowsTable.Remove(row.Values); 217 row.VisualPropertiesChanged -= new EventHandler(Row_VisualPropertiesChanged); 218 row.NameChanged -= new EventHandler(Row_NameChanged); 219 } 234 #region Event Handlers 235 #region Content Event Handlers 220 236 protected override void Content_NameChanged(object sender, EventArgs e) { 221 237 if (InvokeRequired) … … 231 247 else { 232 248 chart.ChartAreas[0].AxisX.Title = Content.VisualProperties.XAxisTitle; 249 chart.ChartAreas[0].AxisX2.Title = Content.VisualProperties.SecondXAxisTitle; 233 250 chart.ChartAreas[0].AxisY.Title = Content.VisualProperties.YAxisTitle; 234 251 chart.ChartAreas[0].AxisY2.Title = Content.VisualProperties.SecondYAxisTitle; 235 252 } 236 253 } 254 #endregion 255 #region Rows Event Handlers 237 256 private void Rows_ItemsAdded(object sender, CollectionItemsChangedEventArgs<DataRow> e) { 238 257 if (InvokeRequired) … … 283 302 } 284 303 } 304 #endregion 305 #region Row Event Handlers 285 306 private void Row_VisualPropertiesChanged(object sender, EventArgs e) { 286 307 if (InvokeRequired) … … 288 309 else { 289 310 DataRow row = (DataRow)sender; 290 if (chart.Series[row.Name].IsCustomPropertySet("PointWidth")) 291 chart.Series[row.Name].DeleteCustomProperty("PointWidth"); 292 switch (row.VisualProperties.ChartType) { 293 case DataRowVisualProperties.DataRowChartType.Line: 294 chart.Series[row.Name].ChartType = SeriesChartType.FastLine; 295 break; 296 case DataRowVisualProperties.DataRowChartType.Bars: 297 chart.Series[row.Name].ChartType = SeriesChartType.Bar; 298 break; 299 case DataRowVisualProperties.DataRowChartType.Columns: 300 chart.Series[row.Name].ChartType = SeriesChartType.Column; 301 break; 302 case DataRowVisualProperties.DataRowChartType.Points: 303 chart.Series[row.Name].ChartType = SeriesChartType.FastPoint; 304 break; 305 case DataRowVisualProperties.DataRowChartType.Histogram: 306 chart.Series[row.Name].ChartType = SeriesChartType.Column; 307 chart.Series[row.Name]["PointWidth"] = "1"; 308 CalculateHistogram(chart.Series[row.Name], row); 309 break; 310 default: 311 chart.Series[row.Name].ChartType = SeriesChartType.FastPoint; 312 break; 313 } 314 chart.Series[row.Name].YAxisType = row.VisualProperties.SecondYAxis ? AxisType.Secondary : AxisType.Primary; 315 chart.Series[row.Name].XAxisType = row.VisualProperties.SecondXAxis ? AxisType.Secondary : AxisType.Primary; 316 if (row.VisualProperties.Color != Color.Empty) chart.Series[row.Name].Color = row.VisualProperties.Color; 311 Series series = chart.Series[row.Name]; 312 series.Points.Clear(); 313 ConfigureSeries(series, row); 314 FillSeriesWithRowValues(series, row); 317 315 chart.ChartAreas[0].RecalculateAxesScale(); 318 316 } … … 326 324 } 327 325 } 326 #endregion 327 #region Values Event Handlers 328 328 private void Values_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e) { 329 329 if (InvokeRequired) … … 419 419 } 420 420 #endregion 421 422 #region Chart Events 421 #endregion 422 423 #region Chart Event Handlers 423 424 private void chart_MouseDown(object sender, MouseEventArgs e) { 424 425 HitTestResult result = chart.HitTest(e.X, e.Y); … … 427 428 } 428 429 } 430 private void chart_MouseMove(object sender, MouseEventArgs e) { 431 HitTestResult result = chart.HitTest(e.X, e.Y); 432 if (result.ChartElementType == ChartElementType.LegendItem) 433 this.Cursor = Cursors.Hand; 434 else 435 this.Cursor = Cursors.Default; 436 } 437 private void chart_CustomizeLegend(object sender, CustomizeLegendEventArgs e) { 438 foreach (LegendItem legendItem in e.LegendItems) { 439 var series = chart.Series[legendItem.SeriesName]; 440 if (series != null) { 441 bool seriesIsInvisible = invisibleSeries.Contains(series); 442 foreach (LegendCell cell in legendItem.Cells) { 443 cell.ForeColor = seriesIsInvisible ? Color.Gray : Color.Black; 444 } 445 } 446 } 447 } 448 private void chart_PropertiesClicked(object sender, EventArgs e) { 449 DataTableVisualPropertiesDialog dialog = new DataTableVisualPropertiesDialog(Content); 450 dialog.ShowDialog(); 451 } 452 #endregion 429 453 430 454 private void ToggleSeriesVisible(Series series) { … … 467 491 } 468 492 469 pr ivatevoid CalculateHistogram(Series series, DataRow row) {493 protected virtual void CalculateHistogram(Series series, DataRow row) { 470 494 series.Points.Clear(); 471 495 if (!row.Values.Any()) return; … … 494 518 } 495 519 series.Points.AddXY(current + intervalCenter, frequency); 520 } 521 522 #region Helpers 523 protected void RemoveCustomPropertyIfExists(Series series, string property) { 524 if (series.IsCustomPropertySet(property)) series.DeleteCustomProperty(property); 496 525 } 497 526 … … 507 536 } 508 537 509 private void chart_MouseMove(object sender, MouseEventArgs e) { 510 HitTestResult result = chart.HitTest(e.X, e.Y); 511 if (result.ChartElementType == ChartElementType.LegendItem) 512 this.Cursor = Cursors.Hand; 513 else 514 this.Cursor = Cursors.Default; 515 } 516 private void chart_CustomizeLegend(object sender, CustomizeLegendEventArgs e) { 517 foreach (LegendItem legendItem in e.LegendItems) { 518 var series = chart.Series[legendItem.SeriesName]; 519 if (series != null) { 520 bool seriesIsInvisible = invisibleSeries.Contains(series); 521 foreach (LegendCell cell in legendItem.Cells) { 522 cell.ForeColor = seriesIsInvisible ? Color.Gray : Color.Black; 523 } 524 } 525 } 526 } 527 528 private void chart_PropertiesClicked(object sender, EventArgs e) { 529 DataTableVisualPropertiesDialog dialog = new DataTableVisualPropertiesDialog(Content); 530 dialog.ShowDialog(); 531 } 532 #endregion 533 538 private ChartDashStyle ConvertLineStyle(DataRowVisualProperties.DataRowLineStyle dataRowLineStyle) { 539 switch (dataRowLineStyle) { 540 case DataRowVisualProperties.DataRowLineStyle.Dash: 541 return ChartDashStyle.Dash; 542 case DataRowVisualProperties.DataRowLineStyle.DashDot: 543 return ChartDashStyle.DashDot; 544 case DataRowVisualProperties.DataRowLineStyle.DashDotDot: 545 return ChartDashStyle.DashDotDot; 546 case DataRowVisualProperties.DataRowLineStyle.Dot: 547 return ChartDashStyle.Dot; 548 case DataRowVisualProperties.DataRowLineStyle.NotSet: 549 return ChartDashStyle.NotSet; 550 case DataRowVisualProperties.DataRowLineStyle.Solid: 551 return ChartDashStyle.Solid; 552 default: 553 return ChartDashStyle.NotSet; 554 } 555 } 534 556 535 557 /// <summary> … … 542 564 return double.IsNaN(x) || x < (double)decimal.MinValue || x > (double)decimal.MaxValue; 543 565 } 566 #endregion 544 567 } 545 568 }
Note: See TracChangeset
for help on using the changeset viewer.