Changeset 15110 for trunk/sources/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs
- Timestamp:
- 07/03/17 10:57:53 (7 years ago)
- Location:
- trunk/sources/HeuristicLab.DataPreprocessing.Views
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.DataPreprocessing.Views
- Property svn:mergeinfo changed
-
trunk/sources/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs
r14418 r15110 22 22 using System; 23 23 using System.Collections.Generic; 24 using System.Drawing; 24 25 using System.Linq; 25 26 using System.Windows.Forms; 26 27 using HeuristicLab.Analysis; 28 using HeuristicLab.Analysis.Views; 27 29 using HeuristicLab.Collections; 28 30 using HeuristicLab.Data; 29 31 using HeuristicLab.MainForm; 32 using HeuristicLab.MainForm.WindowsForms; 30 33 31 34 namespace HeuristicLab.DataPreprocessing.Views { … … 33 36 [Content(typeof(PreprocessingChartContent), false)] 34 37 public partial class PreprocessingChartView : PreprocessingCheckedVariablesView { 35 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"; 45 private const int FIXED_CHART_SIZE = 300; 46 private const int MAX_TABLE_AUTO_SIZE_ROWS = 3; 47 48 49 public IEnumerable<double> Classification { get; set; } 50 public bool IsDetailedChartViewEnabled { get; set; } 38 protected Dictionary<string, DataTable> dataTables; 39 protected Dictionary<string, DataTableView> dataTableViews; 40 41 public static readonly Color[] Colors = { 42 Color.FromArgb(59, 136, 239), Color.FromArgb(252, 177, 59), Color.FromArgb(226, 64, 10), 43 Color.FromArgb(5, 100, 146), Color.FromArgb(191, 191, 191), Color.FromArgb(26, 59, 105), 44 Color.FromArgb(255, 226, 126), Color.FromArgb(18, 156, 221), Color.FromArgb(202, 107, 75), 45 Color.FromArgb(0, 92, 219), Color.FromArgb(243, 210, 136), Color.FromArgb(80, 99, 129), 46 Color.FromArgb(241, 185, 168), Color.FromArgb(224, 131, 10), Color.FromArgb(120, 147, 190) 47 }; 51 48 52 49 public PreprocessingChartView() { 53 50 InitializeComponent(); 54 chartType = DataRowVisualProperties.DataRowChartType.Line;55 chartTitle = DEFAULT_CHART_TITLE;51 dataTables = new Dictionary<string, DataTable>(); 52 dataTableViews = new Dictionary<string, DataTableView>(); 56 53 } 57 54 … … 60 57 if (Content != null) { 61 58 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(); 59 GenerateLayout(); 60 } 61 } 62 63 protected virtual int GetNumberOfVisibleDataTables() { 64 return Content.VariableItemList.CheckedItems.Count(); 65 } 66 67 protected virtual IEnumerable<DataTableView> GetVisibleDataTables() { 68 foreach (var name in Content.VariableItemList.CheckedItems) { 69 if (!dataTableViews.ContainsKey(name.Value.Value)) 70 dataTableViews.Add(name.Value.Value, new DataTableView() { Content = dataTables[name.Value.Value], ShowChartOnly = true }); 71 yield return dataTableViews[name.Value.Value]; 72 } 73 } 74 75 protected virtual DataTable CreateDataTable(string variableName) { 76 return null; 77 } 78 79 protected virtual void InitData() { 80 dataTables.Clear(); 81 dataTableViews.Clear(); 82 foreach (var variable in Content.VariableItemList.Select(v => v.Value)) { 83 dataTables.Add(variable, CreateDataTable(variable)); 84 } 95 85 } 96 86 … … 98 88 base.CheckedItemsChanged(sender, checkedItems); 99 89 100 foreach (IndexedItem<StringValue> item in checkedItems.Items) { 101 string variableName = item.Value.Value; 102 103 104 if (!IsVariableChecked(variableName)) { 105 // not checked -> remove 106 dataTableView.SetRowEnabled(variableName, false); 107 dataTable.SelectedRows.Remove(variableName); 108 dataTablePerVariable.Remove(dataTablePerVariable.Find(x => (x.Name == variableName))); 109 } else { 110 // 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); 117 // 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 } 126 } 127 } 128 129 // 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 } 90 GenerateLayout(); 91 } 92 148 93 149 94 #region Add/Remove/Update Variable, Reset 150 95 protected override void AddVariable(string name) { 151 96 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(); 97 dataTables.Add(name, CreateDataTable(name)); 98 99 GenerateLayout(); 160 100 } 161 101 … … 163 103 protected override void RemoveVariable(string name) { 164 104 base.RemoveVariable(name); 165 dataTable.Rows.Remove(name); 166 dataTablePerVariable.Remove(dataTablePerVariable.Find(x => (x.Name == name))); 167 168 if (!Content.AllInOneMode) 169 GenerateChart(); 105 dataTables.Remove(name); 106 dataTableViews.Remove(name); 107 108 GenerateLayout(); 170 109 } 171 110 172 111 protected override void UpdateVariable(string name) { 173 112 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 } 113 dataTables.Remove(name); 114 var newDataTable = CreateDataTable(name); 115 dataTables.Add(name, newDataTable); 116 dataTableViews[name].Content = newDataTable; 117 GenerateLayout(); 182 118 } 183 119 protected override void ResetAllVariables() { … … 186 122 #endregion 187 123 188 #region Generate Charts 189 protected void GenerateChart() { 124 protected override void CheckedChangedUpdate() { 125 GenerateLayout(); 126 } 127 128 #region Generate Layout 129 protected void GenerateLayout() { 130 if (SuppressCheckedChangedUpdate) 131 return; 132 133 scrollPanel.SuspendRepaint(); 134 190 135 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); 214 215 tableLayoutPanel.ColumnCount = columns; 216 tableLayoutPanel.RowCount = rows; 217 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)); 136 137 int nrCharts = GetNumberOfVisibleDataTables(); 138 139 // Set columns and rows based on number of items 140 int columns = Math.Min(nrCharts, (int)columnsNumericUpDown.Value); 141 int rows = (int)Math.Ceiling((float)nrCharts / columns); 142 143 tableLayoutPanel.ColumnCount = Math.Max(columns, 0); 144 tableLayoutPanel.RowCount = Math.Max(rows, 0); 145 146 if (columns > 0 && rows > 0) { 147 var width = (splitContainer.Panel2.Width - SystemInformation.VerticalScrollBarWidth) / columns; 148 var height = width * 0.75f; 149 150 using (var enumerator = GetVisibleDataTables().GetEnumerator()) { 151 for (int row = 0; row < rows; row++) { 152 tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, height)); 153 for (int col = 0; col < columns; col++) { 154 if (row == 0) { 155 // Add a column-style only when creating the first row 156 tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, width)); 157 } 158 159 if (enumerator.MoveNext()) 160 AddDataTableToTableLayout(enumerator.Current, row, col); 161 162 } 234 163 } 235 236 enumerator.MoveNext();237 PreprocessingDataTable d = enumerator.Current;238 AddDataTableToTableLayout(d, x, y);239 240 164 } 241 } 242 } 243 private int GetNrOfMultiChartColumns(int itemCount) { 244 int columns = 0; 245 if (itemCount <= 2) 246 columns = 1; 247 else if (itemCount <= 6) 248 columns = 2; 249 else 250 columns = 3; 251 return columns; 252 } 253 private int GetNrOfMultiChartRows(int itemCount, int columns) { 254 int rows = 0; 255 if (columns == 3) 256 rows = (itemCount + 2) / columns; 257 else if (columns == 2) 258 rows = (itemCount + 1) / columns; 259 else 260 rows = itemCount / columns; 261 return rows; 262 } 263 264 private void AddDataTableToTableLayout(PreprocessingDataTable dataTable, int x, int y) { 265 PreprocessingDataTableView dataView = new PreprocessingDataTableView(); 266 dataView.Classification = Classification; 267 dataView.IsDetailedChartViewEnabled = IsDetailedChartViewEnabled; 268 165 tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 0)); 166 } 167 168 scrollPanel.ResumeRepaint(true); 169 } 170 171 private void AddDataTableToTableLayout(DataTableView dataTable, int row, int col) { 269 172 if (dataTable == null) { 270 173 // dummy panel for empty field 271 Panel p = new Panel(); 272 p.Dock = DockStyle.Fill; 273 tableLayoutPanel.Controls.Add(p, y, x); 174 Panel p = new Panel { Dock = DockStyle.Fill }; 175 tableLayoutPanel.Controls.Add(p, col, row); 274 176 } else { 275 dataView.Content = dataTable; 276 dataView.Dock = DockStyle.Fill; 277 tableLayoutPanel.Controls.Add(dataView, y, x); 177 dataTable.Dock = DockStyle.Fill; 178 tableLayoutPanel.Controls.Add(dataTable, col, row); 278 179 } 279 180 } … … 286 187 tableLayoutPanel.ColumnStyles.Clear(); 287 188 tableLayoutPanel.RowStyles.Clear(); 288 tableLayoutPanel.AutoScroll = false;289 tableLayoutPanel.AutoScroll = true;290 189 } 291 190 //Remove horizontal scroll bar if visible … … 293 192 if (tableLayoutPanel.HorizontalScroll.Visible) { 294 193 // Add padding on the right in order to accomodate the vertical scrollbar 295 int vWidth = SystemInformation.VerticalScrollBarWidth; 296 tableLayoutPanel.Padding = new Padding(0, 0, vWidth, 0); 194 tableLayoutPanel.Padding = new Padding(0, 0, SystemInformation.VerticalScrollBarWidth, 0); 297 195 } else { 298 196 // Reset padding … … 302 200 #endregion 303 201 304 #region Update Selection 305 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 selection 312 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 selection 320 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 #endregion 202 private void columnsNumericUpDown_ValueChanged(object sender, System.EventArgs e) { 203 GenerateLayout(); 204 } 328 205 } 329 206 }
Note: See TracChangeset
for help on using the changeset viewer.