Changeset 14459 for branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs
- Timestamp:
- 12/07/16 13:50:21 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs
r14418 r14459 20 20 #endregion 21 21 22 using System;23 22 using System.Collections.Generic; 23 using System.Drawing; 24 24 using System.Linq; 25 25 using System.Windows.Forms; 26 26 using HeuristicLab.Analysis; 27 using HeuristicLab.Analysis.Views; 27 28 using HeuristicLab.Collections; 28 29 using HeuristicLab.Data; 29 30 using HeuristicLab.MainForm; 31 using HeuristicLab.MainForm.WindowsForms; 30 32 31 33 namespace HeuristicLab.DataPreprocessing.Views { … … 34 36 public partial class PreprocessingChartView : PreprocessingCheckedVariablesView { 35 37 36 protected PreprocessingDataTable dataTable; 37 protected List<PreprocessingDataTable> dataTablePerVariable; 38 protected List<DataRow> dataRows; 39 protected List<DataRow> selectedDataRows; 40 41 protected DataRowVisualProperties.DataRowChartType chartType; 42 protected string chartTitle; 43 44 private const string DEFAULT_CHART_TITLE = "Chart"; 38 protected Dictionary<string, DataTable> dataTables; 39 protected Dictionary<string, DataTableControl> dataTableControls; 40 45 41 private const int FIXED_CHART_SIZE = 300; 46 42 private const int MAX_TABLE_AUTO_SIZE_ROWS = 3; 47 43 48 49 public IEnumerable<double> Classification { get; set; } 50 public bool IsDetailedChartViewEnabled { get; set; } 44 protected static readonly Color[] Colors = { 45 Color.FromArgb(59, 136, 239), Color.FromArgb(252, 177, 59), Color.FromArgb(226, 64, 10), 46 Color.FromArgb(5, 100, 146), Color.FromArgb(191, 191, 191), Color.FromArgb(26, 59, 105), 47 Color.FromArgb(255, 226, 126), Color.FromArgb(18, 156, 221), Color.FromArgb(202, 107, 75), 48 Color.FromArgb(0, 92, 219), Color.FromArgb(243, 210, 136), Color.FromArgb(80, 99, 129), 49 Color.FromArgb(241, 185, 168), Color.FromArgb(224, 131, 10), Color.FromArgb(120, 147, 190) 50 }; 51 51 52 52 53 public PreprocessingChartView() { 53 54 InitializeComponent(); 54 chartType = DataRowVisualProperties.DataRowChartType.Line;55 chartTitle = DEFAULT_CHART_TITLE;55 dataTables = new Dictionary<string, DataTable>(); 56 dataTableControls= new Dictionary<string, DataTableControl>(); 56 57 } 57 58 … … 60 61 if (Content != null) { 61 62 InitData(); 62 GenerateChart(); 63 64 foreach (var row in dataRows) { 65 string variableName = row.Name; 66 if (!IsVariableChecked(variableName)) { 67 dataTableView.SetRowEnabled(variableName, false); 68 dataTable.SelectedRows.Remove(variableName); 69 dataTablePerVariable.Remove(dataTablePerVariable.Find(x => (x.Name == variableName))); 70 } 71 } 72 } 73 } 74 75 private void InitData() { 76 //Create data tables and data rows 77 dataRows = Content.CreateAllDataRows(chartType); 78 dataTable = new PreprocessingDataTable(chartTitle); 79 dataTablePerVariable = new List<PreprocessingDataTable>(); 80 81 //add data rows to data tables according to checked item list 82 foreach (var row in dataRows) { 83 string variableName = row.Name; 84 85 //add row to data table 86 dataTable.Rows.Add(row); 87 88 //add row to data table per variable 89 PreprocessingDataTable d = new PreprocessingDataTable(variableName); 90 d.Rows.Add(row); 91 dataTablePerVariable.Add(d); 92 } 93 94 UpdateSelection(); 63 GenerateLayout(); 64 } 65 } 66 67 protected virtual int GetNumberOfVisibleDataTables() { 68 return checkedItemList.Content.CheckedItems.Count(); 69 } 70 71 protected virtual IEnumerable<DataTableControl> GetVisibleDataTables() { 72 foreach (var name in Content.VariableItemList.CheckedItems) { 73 if (!dataTableControls.ContainsKey(name.Value.Value)) 74 dataTableControls.Add(name.Value.Value, new DataTableControl() { Content = dataTables[name.Value.Value] }); 75 yield return dataTableControls[name.Value.Value]; 76 } 77 } 78 79 protected virtual DataTable CreateDataTable(string variableName) { 80 return null; 81 } 82 83 protected virtual void InitData() { 84 dataTables.Clear(); 85 dataTableControls.Clear(); 86 foreach (var variable in Content.VariableItemList.Select(v => v.Value)) { 87 dataTables.Add(variable, CreateDataTable(variable)); 88 } 95 89 } 96 90 … … 101 95 string variableName = item.Value.Value; 102 96 103 104 97 if (!IsVariableChecked(variableName)) { 105 98 // not checked -> remove 106 dataTableView.SetRowEnabled(variableName, false); 107 dataTable.SelectedRows.Remove(variableName); 108 dataTablePerVariable.Remove(dataTablePerVariable.Find(x => (x.Name == variableName))); 99 //dataTableView.SetRowEnabled(variableName, false); 100 //dataTablePerVariable.Remove(dataTablePerVariable.Find(x => (x.Name == variableName))); 109 101 } else { 110 102 // checked -> add 111 DataRow row = GetDataRow(variableName);112 DataRow selectedRow = GetSelectedDataRow(variableName);113 dataTableView.SetRowEnabled(variableName, true); 114 115 PreprocessingDataTable pdt = new PreprocessingDataTable(variableName);116 pdt.Rows.Add(row);103 //DataRow row = GetDataRow(variableName); 104 //dataTableView.SetRowEnabled(variableName, true); 105 106 //var pdt = new DataTable(variableName); 107 //pdt.VisualProperties.Title = string.Empty; 108 //pdt.Rows.Add(row); 117 109 // dataTablePerVariable does not contain unchecked variables => reduce insert position by number of uncheckt variables to correct the index 118 int uncheckedUntilVariable = checkedItemList.Content.TakeWhile(x => x.Value != variableName).Count(x => !checkedItemList.Content.ItemChecked(x)); 119 dataTablePerVariable.Insert(item.Index - uncheckedUntilVariable, pdt); 120 121 //update selection 122 if (selectedRow != null) { 123 dataTable.SelectedRows.Add(selectedRow); 124 pdt.SelectedRows.Add(selectedRow); 125 } 110 //int uncheckedUntilVariable = checkedItemList.Content.TakeWhile(x => x.Value != variableName).Count(x => !checkedItemList.Content.ItemChecked(x)); 111 //dataTables.Insert(item.Index - uncheckedUntilVariable, pdt); 126 112 } 127 113 } 128 114 129 115 // update chart if not in all in one mode 130 if (Content != null && !Content.AllInOneMode) 131 GenerateChart(); 132 } 133 134 private DataRow GetSelectedDataRow(string variableName) { 135 foreach (DataRow row in selectedDataRows) { 136 if (row.Name == variableName) 137 return row; 138 } 139 return null; 140 } 141 private DataRow GetDataRow(string variableName) { 142 foreach (DataRow row in dataRows) { 143 if (row.Name == variableName) 144 return row; 145 } 146 return null; 147 } 116 //if (Content != null && !Content.AllInOneMode) 117 //GenerateChart();?? 118 GenerateLayout(); 119 } 120 148 121 149 122 #region Add/Remove/Update Variable, Reset 150 123 protected override void AddVariable(string name) { 151 124 base.AddVariable(name); 152 DataRow row = Content.CreateDataRow(name, chartType); 153 dataTable.Rows.Add(row); 154 PreprocessingDataTable d = new PreprocessingDataTable(name); 155 d.Rows.Add(row); 156 dataTablePerVariable.Add(d); 157 158 if (!Content.AllInOneMode) 159 GenerateChart(); 125 dataTables.Add(name, CreateDataTable(name)); 126 127 GenerateLayout(); 160 128 } 161 129 … … 163 131 protected override void RemoveVariable(string name) { 164 132 base.RemoveVariable(name); 165 dataTable.Rows.Remove(name); 166 dataTablePerVariable.Remove(dataTablePerVariable.Find(x => (x.Name == name))); 167 168 if (!Content.AllInOneMode) 169 GenerateChart(); 133 dataTables.Remove(name); 134 dataTableControls.Remove(name); 135 136 GenerateLayout(); 170 137 } 171 138 172 139 protected override void UpdateVariable(string name) { 173 140 base.UpdateVariable(name); 174 DataRow newRow = Content.CreateDataRow(name, chartType); 175 dataTable.Rows.Remove(name); 176 dataTable.Rows.Add(newRow); 177 DataTable dt = dataTablePerVariable.Find(x => x.Rows.Find(y => y.Name == name) != null); 178 if (dt != null) { 179 dt.Rows.Remove(name); 180 dt.Rows.Add(newRow); 181 } 141 dataTables.Remove(name); 142 var newDataTable = CreateDataTable(name); 143 dataTables.Add(name, newDataTable); 144 dataTableControls[name].Content = newDataTable; 145 GenerateLayout(); 182 146 } 183 147 protected override void ResetAllVariables() { … … 186 150 #endregion 187 151 188 #region Generate Charts 189 protected void GenerateChart() { 152 #region Generate Layout 153 protected void GenerateLayout() { 154 tableLayoutPanel.SuspendRepaint(); 155 190 156 ClearTableLayout(); 191 if (Content.AllInOneMode) { 192 GenerateSingleChartLayout(); 193 } else 194 GenerateMultiChartLayout(); 195 } 196 197 private void GenerateSingleChartLayout() { 198 tableLayoutPanel.ColumnCount = 1; 199 tableLayoutPanel.RowCount = 1; 200 tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); 201 tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); 202 tableLayoutPanel.Controls.Add(dataTableView, 0, 0); 203 dataTableView.Content = dataTable; 204 } 205 206 private void GenerateMultiChartLayout() { 207 int checkedItemsCnt = 0; 208 foreach (var item in Content.VariableItemList.CheckedItems) 209 checkedItemsCnt++; 210 211 // set columns and rows based on number of items 212 int columns = GetNrOfMultiChartColumns(checkedItemsCnt); 213 int rows = GetNrOfMultiChartRows(checkedItemsCnt, columns); 157 158 int nrCharts = GetNumberOfVisibleDataTables(); 159 160 // Set columns and rows based on number of items 161 int columns = GetNrOfMultiChartColumns(nrCharts); 162 int rows = GetNrOfMultiChartRows(nrCharts, columns); 214 163 215 164 tableLayoutPanel.ColumnCount = columns; 216 165 tableLayoutPanel.RowCount = rows; 217 166 218 List<PreprocessingDataTable>.Enumerator enumerator = dataTablePerVariable.GetEnumerator(); 219 for (int x = 0; x < columns; x++) { 220 221 if (rows <= MAX_TABLE_AUTO_SIZE_ROWS) 222 tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100 / columns)); 223 else 224 //scrollbar is shown if there are more than 3 rows -> remove scroll bar width from total width 225 tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, (tableLayoutPanel.Width - System.Windows.Forms.SystemInformation.VerticalScrollBarWidth) / columns)); 226 for (int y = 0; y < rows; y++) { 227 //Add a row only when creating the first column 228 if (x == 0) { 229 // fixed chart size when there are more than 3 tables 230 if (rows > MAX_TABLE_AUTO_SIZE_ROWS) 231 tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, FIXED_CHART_SIZE)); 232 else 233 tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100 / rows)); 167 using (var enumerator = GetVisibleDataTables().GetEnumerator()) { 168 for (int x = 0; x < columns; x++) { 169 var columnStyle = rows <= MAX_TABLE_AUTO_SIZE_ROWS 170 ? new ColumnStyle(SizeType.Percent, 100 / columns) 171 : new ColumnStyle(SizeType.Absolute, (tableLayoutPanel.Width - SystemInformation.VerticalScrollBarWidth) / columns); 172 tableLayoutPanel.ColumnStyles.Add(columnStyle); 173 174 for (int y = 0; y < rows; y++) { 175 // Add a row only when creating the first column 176 if (x == 0) { 177 var rowStyle = rows > MAX_TABLE_AUTO_SIZE_ROWS 178 ? new RowStyle(SizeType.Absolute, FIXED_CHART_SIZE) 179 : new RowStyle(SizeType.Percent, 100 / rows); 180 tableLayoutPanel.RowStyles.Add(rowStyle); 181 } 182 183 if (enumerator.MoveNext()) 184 AddDataTableToTableLayout(enumerator.Current, x, y); 234 185 } 235 236 enumerator.MoveNext();237 PreprocessingDataTable d = enumerator.Current;238 AddDataTableToTableLayout(d, x, y);239 240 186 } 241 187 } 242 } 188 189 tableLayoutPanel.ResumeRepaint(true); 190 } 191 243 192 private int GetNrOfMultiChartColumns(int itemCount) { 244 193 int columns = 0; … … 262 211 } 263 212 264 private void AddDataTableToTableLayout(PreprocessingDataTable dataTable, int x, int y) { 265 PreprocessingDataTableView dataView = new PreprocessingDataTableView(); 266 dataView.Classification = Classification; 267 dataView.IsDetailedChartViewEnabled = IsDetailedChartViewEnabled; 213 private void AddDataTableToTableLayout(DataTableControl dataTable, int x, int y) { 214 //dataView.Classification = Classification; 215 //dataView.IsDetailedChartViewEnabled = IsDetailedChartViewEnabled; 268 216 269 217 if (dataTable == null) { 270 218 // dummy panel for empty field 271 Panel p = new Panel(); 272 p.Dock = DockStyle.Fill; 219 Panel p = new Panel { Dock = DockStyle.Fill }; 273 220 tableLayoutPanel.Controls.Add(p, y, x); 274 221 } else { 275 dataView.Content = dataTable; 276 dataView.Dock = DockStyle.Fill; 277 tableLayoutPanel.Controls.Add(dataView, y, x); 222 dataTable.Dock = DockStyle.Fill; 223 tableLayoutPanel.Controls.Add(dataTable, y, x); 278 224 } 279 225 } … … 286 232 tableLayoutPanel.ColumnStyles.Clear(); 287 233 tableLayoutPanel.RowStyles.Clear(); 234 235 tableLayoutPanel.Width = 0; 236 tableLayoutPanel.Height = 0; 237 288 238 tableLayoutPanel.AutoScroll = false; 289 239 tableLayoutPanel.AutoScroll = true; … … 301 251 } 302 252 #endregion 303 304 #region Update Selection305 protected override void PreprocessingData_SelctionChanged(object sender, EventArgs e) {306 base.PreprocessingData_SelctionChanged(sender, e);307 UpdateSelection();308 }309 310 private void UpdateSelection() {311 //update data table selection312 selectedDataRows = Content.CreateAllSelectedDataRows(chartType);313 dataTable.SelectedRows.Clear();314 foreach (var selectedRow in selectedDataRows) {315 if (IsVariableChecked(selectedRow.Name))316 dataTable.SelectedRows.Add(selectedRow);317 }318 319 //update data table per variable selection320 foreach (PreprocessingDataTable d in dataTablePerVariable) {321 d.SelectedRows.Clear();322 DataRow row = selectedDataRows.Find(x => x.Name == d.Name);323 if (row != null)324 d.SelectedRows.Add(row);325 }326 }327 #endregion328 253 } 329 254 }
Note: See TracChangeset
for help on using the changeset viewer.