#region License Information /* HeuristicLab * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using System; using System.Collections.Generic; using System.Windows.Forms; using HeuristicLab.Analysis; using HeuristicLab.Analysis.Views; using HeuristicLab.Collections; using HeuristicLab.Core; using HeuristicLab.Core.Views; using HeuristicLab.Data; using HeuristicLab.DataPreprocessing.Implementations; using HeuristicLab.MainForm; namespace HeuristicLab.DataPreprocessing.Views { [View("Preprocessing Chart View")] [Content(typeof(PreprocessingChartContent), false)] public partial class PreprocessingChartView : ItemView { private IChartLogic logic; private PreprocessingDataTable dataTable; private List dataTablePerVariable; private List dataRows; protected DataRowVisualProperties.DataRowChartType chartType; protected string chartTitle; private const string DEFAULT_CHART_TITLE = "Chart"; public PreprocessingChartView() { InitializeComponent(); chartType = DataRowVisualProperties.DataRowChartType.Line; chartTitle = DEFAULT_CHART_TITLE; } private void CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs> checkedItems) { foreach (IndexedItem item in checkedItems.Items) { string variableName = item.Value.Value; if (VariableIsDisplayed(variableName)) { dataTable.Rows.Remove(variableName); dataTablePerVariable.Remove(dataTablePerVariable.Find(x => (x.Name == variableName))); } else { DataRow row = GetDataRow(variableName); dataTable.Rows.Add(row); PreprocessingDataTable d = new PreprocessingDataTable(variableName); d.Rows.Add(row); dataTablePerVariable.Add(d); } } //if (!Content.AllInOneMode) if (Content != null && !Content.AllInOneMode) GenerateChart(); } private bool VariableIsDisplayed(string name) { foreach (var item in dataTable.Rows) { if (item.Name == name) return true; } return false; } protected override void RegisterContentEvents() { base.RegisterContentEvents(); Content.ChartLogic.Changed += PreprocessingData_Changed; } protected override void DeregisterContentEvents() { base.DeregisterContentEvents(); Content.ChartLogic.Changed -= PreprocessingData_Changed; } public new PreprocessingChartContent Content { get { return (PreprocessingChartContent)base.Content; } set { base.Content = value; } } private void InitData() { if (Content.VariableItemList == null) { Content.VariableItemList = logic.CreateVariableItemList(); } checkedItemList.Content = Content.VariableItemList; dataRows = logic.CreateAllDataRows(chartType); // init data table dataTable = new PreprocessingDataTable(chartTitle); dataTable.Rows.AddRange(dataRows); // init data table per variable dataTablePerVariable = new List(); foreach (var checkedItem in Content.VariableItemList.CheckedItems) { string variableName = Content.VariableItemList[checkedItem.Index].Value; PreprocessingDataTable d = new PreprocessingDataTable(variableName); DataRow row = GetDataRow(variableName); //DataRow rowSelect = logic.CreateDataRowRange(variableName, 200, 400, chartType); //rowSelect.Name = variableName + "(Selected)"; //rowSelect.VisualProperties.Color = Color.Green; d.Rows.Add(row); //d.SelectedRows.Add(rowSelect); dataTablePerVariable.Add(d); } } private DataRow GetDataRow(string variableName) { foreach (DataRow row in dataRows) { if (row.Name == variableName) return row; } return null; } protected override void OnContentChanged() { base.OnContentChanged(); if (Content != null) { logic = Content.ChartLogic; InitData(); Content.VariableItemList.CheckedItemsChanged += CheckedItemsChanged; GenerateChart(); } } // TODO : handle also other changed events void PreprocessingData_Changed(object sender, DataPreprocessingChangedEventArgs e) { switch (e.Type) { case DataPreprocessingChangedEventType.DeleteColumn: RemoveVariable(logic.GetVariableNameByIndex(e.Column)); break; case DataPreprocessingChangedEventType.AddColumn: AddVariable(logic.GetVariableNameByIndex(e.Column)); break; case DataPreprocessingChangedEventType.ChangeColumn: case DataPreprocessingChangedEventType.ChangeItem: UpdateDataForVariable(logic.GetVariableNameByIndex(e.Column)); break; case DataPreprocessingChangedEventType.DeleteRow: case DataPreprocessingChangedEventType.AddRow: case DataPreprocessingChangedEventType.Any: default: InitData(); GenerateChart(); break; } } private void UpdateDataForVariable(string variableName) { DataRow newRow = logic.CreateDataRow(variableName, chartType); dataTable.Rows.Remove(variableName); dataTable.Rows.Add(newRow); DataTable dt = dataTablePerVariable.Find(x => x.Rows.Find(y => y.Name == variableName) != null); if (dt != null) { dt.Rows.Remove(variableName); dt.Rows.Add(newRow); } } // add variable to data table and item list private void AddVariable(string name) { DataRow row = logic.CreateDataRow(name, chartType); dataTable.Rows.Add(row); PreprocessingDataTable d = new PreprocessingDataTable(name); d.Rows.Add(row); dataTablePerVariable.Add(d); Content.VariableItemList.Add(new StringValue(name)); if (!Content.AllInOneMode) GenerateChart(); } // remove variable from data table and item list private void RemoveVariable(string name) { dataTable.Rows.Remove(name); dataTablePerVariable.Remove(dataTablePerVariable.Find(x => (x.Name == name))); StringValue stringValue = FindVariableItemList(name); if (stringValue != null) Content.VariableItemList.Remove(stringValue); if (!Content.AllInOneMode) GenerateChart(); } private StringValue FindVariableItemList(string name) { foreach (StringValue stringValue in Content.VariableItemList) { if (stringValue.Value == name) return stringValue; } return null; } protected void GenerateChart() { ClearTableLayout(); if (Content.AllInOneMode) { GenerateSingleChartLayout(); } else GenerateMultiChartLayout(); } private void ClearTableLayout() { //Clear out the existing controls tableLayoutPanel.Controls.Clear(); //Clear out the existing row and column styles tableLayoutPanel.ColumnStyles.Clear(); tableLayoutPanel.RowStyles.Clear(); tableLayoutPanel.AutoScroll = false; tableLayoutPanel.AutoScroll = true; } private void GenerateSingleChartLayout() { tableLayoutPanel.ColumnCount = 1; tableLayoutPanel.RowCount = 1; tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); tableLayoutPanel.Controls.Add(dataTableView, 0, 0); dataTableView.Content = dataTable; } private void GenerateMultiChartLayout() { int checkedItemsCnt = 0; foreach (var item in Content.VariableItemList.CheckedItems) checkedItemsCnt++; int rows = 0; int columns = 0; // set columns and rows based on number of items if (checkedItemsCnt <= 2) columns = 1; else if (checkedItemsCnt <= 6) columns = 2; else columns = 3; if (columns == 3) rows = (checkedItemsCnt + 2) / columns; else if (columns == 2) rows = (checkedItemsCnt + 1) / columns; else rows = checkedItemsCnt / columns; //Now we will generate the table, setting up the row and column counts first tableLayoutPanel.ColumnCount = columns; tableLayoutPanel.RowCount = rows; List.Enumerator enumerator = dataTablePerVariable.GetEnumerator(); for (int x = 0; x < columns; x++) { if (rows <= 3) tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100 / columns)); else //scrollbar is shown if there are more than 3 rows -> remove scroll bar width from total width tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, (tableLayoutPanel.Width - System.Windows.Forms.SystemInformation.VerticalScrollBarWidth) / columns)); for (int y = 0; y < rows; y++) { //Add a row only when creating the first column if (x == 0) { // fixed chart size when there are more than 3 tables if (rows > 3) tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 300)); else tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100 / rows)); } PreprocessingDataTableView dataView = new PreprocessingDataTableView(); enumerator.MoveNext(); PreprocessingDataTable d = enumerator.Current; if (d == null) { // dummy panel for empty field Panel p = new Panel(); p.Dock = DockStyle.Fill; tableLayoutPanel.Controls.Add(p, y, x); } else { dataView.Content = d; dataView.Dock = DockStyle.Fill; tableLayoutPanel.Controls.Add(dataView, y, x); } } } } //Remove horizontal scroll bar if visible private void tableLayoutPanel_Layout(object sender, LayoutEventArgs e) { if (tableLayoutPanel.HorizontalScroll.Visible) { // Add padding on the right in order to accomodate the vertical scrollbar int vWidth = SystemInformation.VerticalScrollBarWidth; tableLayoutPanel.Padding = new Padding(0, 0, vWidth, 0); } else { // Reset padding tableLayoutPanel.Padding = new Padding(0); } } private void radioButton1_CheckedChanged(object sender, EventArgs e) { if (Content.AllInOneMode == false) Content.AllInOneMode = true; else Content.AllInOneMode = false; GenerateChart(); } } }