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