Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/15/11 18:41:13 (13 years ago)
Author:
abeham
Message:

#1465

  • fine tuned UI for setting data(table|row) visual properties
  • added control for the data table visual properties
  • added a few more visual properties
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/histogram/HeuristicLab.Analysis.Views/3.3/DataTableView.cs

    r6011 r6012  
    6060    }
    6161
     62    #region Event Handler Registration
    6263    /// <summary>
    6364    /// Removes the eventhandlers from the underlying <see cref="Variable"/>.
     
    8990        RegisterDataRowEvents(row);
    9091    }
     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
    91125
    92126    protected override void OnContentChanged() {
     
    113147    }
    114148
    115 
    116149    /// <summary>
    117150    /// Add the DataRow as a series to the chart.
     
    120153    protected virtual void AddDataRow(DataRow row) {
    121154      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
    122168      switch (row.VisualProperties.ChartType) {
    123169        case DataRowVisualProperties.DataRowChartType.Line:
    124170          series.ChartType = SeriesChartType.FastLine;
     171          series.BorderWidth = row.VisualProperties.LineWidth;
     172          series.BorderDashStyle = ConvertLineStyle(row.VisualProperties.LineStyle);
    125173          break;
    126174        case DataRowVisualProperties.DataRowChartType.Bars:
     
    132180        case DataRowVisualProperties.DataRowChartType.Points:
    133181          series.ChartType = SeriesChartType.FastPoint;
     182          series.BorderWidth = row.VisualProperties.LineWidth;
     183          series.BorderDashStyle = ConvertLineStyle(row.VisualProperties.LineStyle);
    134184          break;
    135185        case DataRowVisualProperties.DataRowChartType.Histogram:
    136186          series.ChartType = SeriesChartType.Column;
    137           series["PointWidth"] = "1";
     187          series.SetCustomProperty("PointWidth", "1");
    138188          break;
    139189        default:
     
    143193      series.YAxisType = row.VisualProperties.SecondYAxis ? AxisType.Secondary : AxisType.Primary;
    144194      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;
    146198      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    }
    153200
    154201    /// <summary>
     
    156203    /// </summary>
    157204    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();
    169215
    170216      double digits = (int)Math.Log10(interestingValuesRange) - 3;
     
    186232    }
    187233
    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
    220236    protected override void Content_NameChanged(object sender, EventArgs e) {
    221237      if (InvokeRequired)
     
    231247      else {
    232248        chart.ChartAreas[0].AxisX.Title = Content.VisualProperties.XAxisTitle;
     249        chart.ChartAreas[0].AxisX2.Title = Content.VisualProperties.SecondXAxisTitle;
    233250        chart.ChartAreas[0].AxisY.Title = Content.VisualProperties.YAxisTitle;
    234251        chart.ChartAreas[0].AxisY2.Title = Content.VisualProperties.SecondYAxisTitle;
    235252      }
    236253    }
     254    #endregion
     255    #region Rows Event Handlers
    237256    private void Rows_ItemsAdded(object sender, CollectionItemsChangedEventArgs<DataRow> e) {
    238257      if (InvokeRequired)
     
    283302      }
    284303    }
     304    #endregion
     305    #region Row Event Handlers
    285306    private void Row_VisualPropertiesChanged(object sender, EventArgs e) {
    286307      if (InvokeRequired)
     
    288309      else {
    289310        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);
    317315        chart.ChartAreas[0].RecalculateAxesScale();
    318316      }
     
    326324      }
    327325    }
     326    #endregion
     327    #region Values Event Handlers
    328328    private void Values_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e) {
    329329      if (InvokeRequired)
     
    419419    }
    420420    #endregion
    421 
    422     #region Chart Events
     421    #endregion
     422
     423    #region Chart Event Handlers
    423424    private void chart_MouseDown(object sender, MouseEventArgs e) {
    424425      HitTestResult result = chart.HitTest(e.X, e.Y);
     
    427428      }
    428429    }
     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
    429453
    430454    private void ToggleSeriesVisible(Series series) {
     
    467491    }
    468492
    469     private void CalculateHistogram(Series series, DataRow row) {
     493    protected virtual void CalculateHistogram(Series series, DataRow row) {
    470494      series.Points.Clear();
    471495      if (!row.Values.Any()) return;
     
    494518      }
    495519      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);
    496525    }
    497526
     
    507536    }
    508537
    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    }
    534556
    535557    /// <summary>
     
    542564      return double.IsNaN(x) || x < (double)decimal.MinValue || x > (double)decimal.MaxValue;
    543565    }
     566    #endregion
    544567  }
    545568}
Note: See TracChangeset for help on using the changeset viewer.