Free cookie consent management tool by TermsFeed Policy Generator

source: stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs @ 14791

Last change on this file since 14791 was 14075, checked in by mkommend, 8 years ago

#2559: Merged r13502, r13504, r13507, r13508, r13512, r13514, r13517 into stable.

File size: 7.1 KB
RevLine 
[10882]1using System;
2using System.Collections.Generic;
3using System.Drawing;
4using System.Linq;
5using System.Windows.Forms;
6using HeuristicLab.Analysis;
[10987]7using HeuristicLab.Common;
[10882]8using HeuristicLab.Core.Views;
9using HeuristicLab.MainForm;
10
11namespace HeuristicLab.DataPreprocessing.Views {
[10987]12  [View("Scatter Plot Multi View")]
[10952]13  [Content(typeof(ScatterPlotContent), false)]
[10987]14  public partial class ScatterPlotMultiView : ItemView {
[10882]15
[10952]16    private const int HEADER_WIDTH = 50;
17    private const int HEADER_HEIGHT = 50;
18    private const int MAX_AUTO_SIZE_ELEMENTS = 6;
19    private const int FIXED_CHART_WIDTH = 250;
20    private const int FIXED_CHART_HEIGHT = 150;
21
[10987]22    public ScatterPlotMultiView() {
[10882]23      InitializeComponent();
24    }
25
26    public new ScatterPlotContent Content {
27      get { return (ScatterPlotContent)base.Content; }
28      set { base.Content = value; }
29    }
30
31    protected override void OnContentChanged() {
32      base.OnContentChanged();
33      if (Content != null) {
[10915]34        GenerateMultiLayout();
[10882]35      }
36    }
37
[10952]38    //Add header elements to the table layout panel
39    private void addHeaderToTableLayoutPanels() {
40
[10992]41      List<string> variables = Content.PreprocessingData.GetDoubleVariableNames().ToList();
[10987]42
[10952]43      for (int i = 1; i < variables.Count + 1; i++) {
44        // Use buttons for header elements
45        Button xButton = new Button();
46        xButton.Enabled = false;
47        xButton.BackColor = Color.Gainsboro;
48        xButton.Text = variables[i - 1];
49        xButton.Dock = DockStyle.Fill;
50        tableLayoutPanel.Controls.Add(xButton, 0, i);
51        Button yButton = new Button();
52        yButton.Enabled = false;
53        yButton.BackColor = Color.Gainsboro;
54        yButton.Text = variables[i - 1];
55        yButton.Dock = DockStyle.Fill;
56        tableLayoutPanel.Controls.Add(yButton, i, 0);
57      }
58    }
59
[10992]60    private void GenerateMultiLayout() {
61      List<string> variables = Content.PreprocessingData.GetDoubleVariableNames().ToList();
[10987]62
[10915]63      tableLayoutPanel.Controls.Clear();
64      //Clear out the existing row and column styles
65      tableLayoutPanel.ColumnStyles.Clear();
66      tableLayoutPanel.RowStyles.Clear();
[10882]67
[10915]68      //Set row and column count
[10992]69      tableLayoutPanel.ColumnCount = variables.Count + 1;
70      tableLayoutPanel.RowCount = variables.Count + 1;
[10915]71
[10952]72      tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, HEADER_WIDTH));
73      tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, HEADER_HEIGHT));
[10915]74      // set column and row layout
[10992]75      for (int x = 0; x < variables.Count; x++) {
[10915]76        // auto size
[10952]77        if (variables.Count <= MAX_AUTO_SIZE_ELEMENTS) {
78          tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, (tableLayoutPanel.Width - HEADER_WIDTH) / variables.Count));
79          tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, (tableLayoutPanel.Height - HEADER_HEIGHT) / variables.Count));
[10992]80        }
[14075]81        // fixed size
[10915]82        else {
[10952]83          tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, FIXED_CHART_WIDTH));
84          tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, FIXED_CHART_HEIGHT));
[10915]85        }
[10882]86      }
[10915]87
[10952]88      addHeaderToTableLayoutPanels();
89      addChartsToTableLayoutPanel();
[10992]90
[10952]91    }
[10915]92
[10952]93    private void addChartsToTableLayoutPanel() {
[10987]94
[10992]95      List<string> variables = Content.PreprocessingData.GetDoubleVariableNames().ToList();
[10987]96
[10915]97      //set scatter plots and histograms
[10952]98      for (int x = 1; x < variables.Count + 1; x++) {
[10915]99
[10952]100        for (int y = 1; y < variables.Count + 1; y++) {
101          // use historgram if x and y variable are equal
[10915]102          if (x == y) {
103            PreprocessingDataTable dataTable = new PreprocessingDataTable();
[10987]104            DataRow dataRow = Content.CreateDataRow(variables[x - 1], DataRowVisualProperties.DataRowChartType.Histogram);
[10915]105            dataTable.Rows.Add(dataRow);
106            PreprocessingDataTableView pcv = new PreprocessingDataTableView();
[10952]107            pcv.ChartDoubleClick += HistogramDoubleClick;
[10915]108            pcv.Content = dataTable;
109            tableLayoutPanel.Controls.Add(pcv, y, x);
110          }
[14075]111          //scatter plot
[10952]112          else {
[10987]113            ScatterPlot scatterPlot = Content.CreateScatterPlot(variables[x - 1], variables[y - 1]);
[10915]114            PreprocessingScatterPlotView pspv = new PreprocessingScatterPlotView();
[10952]115            pspv.ChartDoubleClick += ScatterPlotDoubleClick;
[10915]116            pspv.Content = scatterPlot;
117            pspv.Dock = DockStyle.Fill;
[10952]118            tableLayoutPanel.Controls.Add(pspv, x, y);
[10915]119          }
120        }
121      }
[10882]122    }
123
[10952]124    //Open scatter plot in new tab with new content when double clicked
125    private void ScatterPlotDoubleClick(object sender, EventArgs e) {
126      PreprocessingScatterPlotView pspv = (PreprocessingScatterPlotView)sender;
[10987]127      ScatterPlotContent scatterContent = new ScatterPlotContent(Content, new Cloner());  // create new content
[10952]128      ScatterPlot scatterPlot = pspv.Content;
129      setVariablesInContentFromScatterPlot(scatterContent, scatterPlot);
[10915]130
[10987]131      MainFormManager.MainForm.ShowContent(scatterContent, typeof(ScatterPlotSingleView));  // open in new tab
[10952]132    }
[10915]133
[10952]134    //Extract variable names from scatter plot and set them in content
135    private void setVariablesInContentFromScatterPlot(ScatterPlotContent scatterContent, ScatterPlot scatterPlot) {
136
137      // only one data row should be in scatter plot
138      if (scatterPlot.Rows.Count == 1) {
[10992]139        string[] variables = scatterPlot.Rows.ElementAt(0).Name.Split(new string[] { " - " }, StringSplitOptions.None); // extract variable names from string
[10952]140        scatterContent.SelectedXVariable = variables[0];
141        scatterContent.SelectedYVariable = variables[1];
142      }
[10915]143    }
[10952]144
145    //Set variable item list from with variable from data table
146    private void setVariableItemListFromDataTable(HistogramContent histoContent, PreprocessingDataTable dataTable) {
147
148      // only one data row should be in data table
149      if (dataTable.Rows.Count == 1) {
150        string variableName = dataTable.Rows.ElementAt(0).Name;
151
152        // set only variable name checked
[10992]153        foreach (var checkedItem in histoContent.VariableItemList) {
154          if (checkedItem.Value == variableName)
155            histoContent.VariableItemList.SetItemCheckedState(checkedItem, true);
[10952]156          else
[10992]157            histoContent.VariableItemList.SetItemCheckedState(checkedItem, false);
158
[10952]159        }
160      }
161    }
162
163    //open histogram in new tab with new content when double clicked
164    private void HistogramDoubleClick(object sender, EventArgs e) {
[10992]165      PreprocessingDataTableView pcv = (PreprocessingDataTableView)sender;
166      HistogramContent histoContent = new HistogramContent(Content.PreprocessingData);  // create new content     
167      histoContent.VariableItemList = Content.CreateVariableItemList();
168      PreprocessingDataTable dataTable = pcv.Content;
169      setVariableItemListFromDataTable(histoContent, dataTable);
[10952]170
[10992]171      MainFormManager.MainForm.ShowContent(histoContent, typeof(HistogramView));  // open in new tab
[10952]172    }
[10915]173
[10992]174
[10882]175  }
176
[10992]177
[10882]178}
Note: See TracBrowser for help on using the repository browser.