source: trunk/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.cs @ 16430

Last change on this file since 16430 was 16430, checked in by pfleck, 8 months ago

#2845 merged branch into trunk
Reviewed by mkommenda

File size: 11.0 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.IO;
24using System.Threading.Tasks;
25using System.Windows.Forms;
26using HeuristicLab.Common;
27using HeuristicLab.Core;
28using HeuristicLab.Core.Views;
29using HeuristicLab.MainForm;
30using HeuristicLab.Problems.DataAnalysis;
31using HeuristicLab.Problems.Instances.DataAnalysis;
32using HeuristicLab.Problems.Instances.DataAnalysis.Views;
33
34namespace HeuristicLab.DataPreprocessing.Views {
35  [View("DataPreprocessing View")]
36  [Content(typeof(PreprocessingContext), true)]
37  public partial class DataPreprocessingView : NamedItemView {
38    public new PreprocessingContext Content {
39      get { return (PreprocessingContext)base.Content; }
40      set { base.Content = value; }
41    }
42
43    public DataPreprocessingView() {
44      InitializeComponent();
45    }
46
47    protected override void OnContentChanged() {
48      base.OnContentChanged();
49      if (Content != null) {
50        var data = Content.Data;
51
52        var viewShortcuts = new ItemList<IViewShortcut> {
53          new DataGridContent(data),
54          new StatisticsContent(data),
55
56          new LineChartContent(data),
57          new HistogramContent(data),
58          new SingleScatterPlotContent(data),
59          new MultiScatterPlotContent(data),
60          new CorrelationMatrixContent(Content),
61          new DataCompletenessChartContent(data),
62
63          new FilterContent(data),
64          new ManipulationContent(data),
65          new TransformationContent(data)
66        };
67
68        viewShortcutListView.Content = viewShortcuts.AsReadOnly();
69        viewShortcutListView.ItemsListView.Items[0].Selected = true;
70        viewShortcutListView.Select();
71
72        applyTypeContextMenuStrip.Items.Clear();
73        exportTypeContextMenuStrip.Items.Clear();
74        foreach (var exportOption in Content.GetSourceExportOptions()) {
75          var applyMenuItem = new ToolStripMenuItem(exportOption.Key) { Tag = exportOption.Value };
76          applyMenuItem.Click += applyToolStripMenuItem_Click;
77          applyTypeContextMenuStrip.Items.Add(applyMenuItem);
78
79          var exportMenuItem = new ToolStripMenuItem(exportOption.Key) { Tag = exportOption.Value };
80          exportMenuItem.Click += exportToolStripMenuItem_Click;
81          exportTypeContextMenuStrip.Items.Add(exportMenuItem);
82        }
83        var exportCsvMenuItem = new ToolStripMenuItem(".csv");
84        exportCsvMenuItem.Click += exportCsvMenuItem_Click;
85        exportTypeContextMenuStrip.Items.Add(exportCsvMenuItem);
86      } else {
87        viewShortcutListView.Content = null;
88      }
89    }
90    protected override void RegisterContentEvents() {
91      base.RegisterContentEvents();
92      Content.Reset += Content_Reset;
93      Content.Data.FilterChanged += Data_FilterChanged;
94    }
95
96    protected override void DeregisterContentEvents() {
97      base.DeregisterContentEvents();
98      Content.Reset -= Content_Reset;
99      Content.Data.FilterChanged -= Data_FilterChanged;
100    }
101
102    void Content_Reset(object sender, EventArgs e) {
103      OnContentChanged(); // Reset by setting new content
104    }
105
106    void Data_FilterChanged(object sender, EventArgs e) {
107      lblFilterActive.Visible = Content.Data.IsFiltered;
108    }
109
110    protected override void SetEnabledStateOfControls() {
111      base.SetEnabledStateOfControls();
112      viewShortcutListView.Enabled = Content != null;
113      applyInNewTabButton.Enabled = Content != null;
114      exportProblemButton.Enabled = Content != null && Content.CanExport;
115      undoButton.Enabled = Content != null;
116    }
117
118    #region New
119    private void newButton_Click(object sender, EventArgs e) {
120      newProblemDataTypeContextMenuStrip.Show(Cursor.Position);
121    }
122    private void newRegressionToolStripMenuItem_Click(object sender, EventArgs e) {
123      if (CheckNew("Regression"))
124        Content.Import(new RegressionProblemData());
125    }
126    private void newClassificationToolStripMenuItem_Click(object sender, EventArgs e) {
127      if (CheckNew("Classification"))
128        Content.Import(new ClassificationProblemData());
129    }
130    private void newTimeSeriesToolStripMenuItem_Click(object sender, EventArgs e) {
131      if (CheckNew("Time Series Prognosis"))
132        Content.Import(new TimeSeriesPrognosisProblemData());
133    }
134
135    private bool CheckNew(string type) {
136      return DialogResult.OK == MessageBox.Show(
137               this,
138               string.Format("When creating a new {0}, all previous information will be lost.", type),
139               "Continue?",
140               MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
141    }
142    #endregion
143
144    #region Import
145    private void importButton_Click(object sender, EventArgs e) {
146      importProblemDataTypeContextMenuStrip.Show(Cursor.Position);
147    }
148    private async void importRegressionToolStripMenuItem_Click(object sender, EventArgs e) {
149      await ImportAsync(new RegressionCSVInstanceProvider(), new RegressionImportDialog(),
150        dialog => ((RegressionImportDialog)dialog).ImportType);
151    }
152    private async void importClassificationToolStripMenuItem_Click(object sender, EventArgs e) {
153      await ImportAsync(new ClassificationCSVInstanceProvider(), new ClassificationImportDialog(),
154        dialog => ((ClassificationImportDialog)dialog).ImportType);
155    }
156    private async void importTimeSeriesToolStripMenuItem_Click(object sender, EventArgs e) {
157      await ImportAsync(new TimeSeriesPrognosisCSVInstanceProvider(), new TimeSeriesPrognosisImportDialog(),
158        dialog => ((TimeSeriesPrognosisImportDialog)dialog).ImportType);
159    }
160    private async Task ImportAsync<TProblemData, TImportType>(DataAnalysisInstanceProvider<TProblemData, TImportType> instanceProvider, DataAnalysisImportDialog importDialog,
161      Func<DataAnalysisImportDialog, TImportType> getImportType)
162      where TProblemData : class, IDataAnalysisProblemData
163      where TImportType : DataAnalysisImportType {
164      if (importDialog.ShowDialog() == DialogResult.OK) {
165        await Task.Run(() => {
166          TProblemData instance;
167          // lock active view and show progress bar
168
169          try {
170            var progress = Progress.Show(Content, "Loading problem instance.");
171            instanceProvider.ProgressChanged += (o, args) => { progress.ProgressValue = args.ProgressPercentage / 100.0; };
172
173            instance = instanceProvider.ImportData(importDialog.Path, getImportType(importDialog), importDialog.CSVFormat);
174          } catch (IOException ex) {
175            MessageBox.Show(string.Format("There was an error parsing the file: {0}", Environment.NewLine + ex.Message), "Error while parsing", MessageBoxButtons.OK, MessageBoxIcon.Error);
176            Progress.Hide(Content);
177            return;
178          }
179          try {
180            Content.Import(instance);
181          } catch (IOException ex) {
182            MessageBox.Show(string.Format("This problem does not support loading the instance {0}: {1}", Path.GetFileName(importDialog.Path), Environment.NewLine + ex.Message), "Cannot load instance");
183          } finally {
184            Progress.Hide(Content);
185          }
186        });
187      }
188    }
189    #endregion
190
191    #region Apply
192    private void applyInNewTabButton_Click(object sender, EventArgs e) {
193      applyTypeContextMenuStrip.Show(Cursor.Position);
194    }
195    private void applyToolStripMenuItem_Click(object sender, EventArgs e) {
196      var menuItem = (ToolStripMenuItem)sender;
197      var itemCreator = (Func<IItem>)menuItem.Tag;
198      MainFormManager.MainForm.ShowContent(itemCreator());
199    }
200    #endregion
201
202    #region Export
203    private void exportProblemButton_Click(object sender, EventArgs e) {
204      exportTypeContextMenuStrip.Show(Cursor.Position);
205    }
206    private void exportToolStripMenuItem_Click(object sender, EventArgs e) {
207      var menuItem = (ToolStripMenuItem)sender;
208      var itemCreator = (Func<IItem>)menuItem.Tag;
209      var saveFileDialog = new SaveFileDialog {
210        Title = "Save Item",
211        DefaultExt = "hl",
212        Filter = "Uncompressed HeuristicLab Files|*.hl|HeuristicLab Files|*.hl|All Files|*.*",
213        FilterIndex = 2
214      };
215
216      if (saveFileDialog.ShowDialog() == DialogResult.OK) {
217        Task.Run(() => {
218          bool compressed = saveFileDialog.FilterIndex != 1;
219          var storable = itemCreator() as IStorableContent;
220          if (storable != null) {
221            try {
222              Progress.Show(Content, "Exporting data.", ProgressMode.Indeterminate);
223              ContentManager.Save(storable, saveFileDialog.FileName, compressed);
224            } finally {
225              Progress.Hide(Content);
226            }
227          }
228        });
229      }
230    }
231    private void exportCsvMenuItem_Click(object sender, EventArgs e) {
232      var saveFileDialog = new SaveFileDialog {
233        Title = "Save Data",
234        DefaultExt = "csv",
235        Filter = "CSV files|*.csv|All files|*.*",
236        FilterIndex = 1
237      };
238
239      if (saveFileDialog.ShowDialog() == DialogResult.OK) {
240        Task.Run(() => {
241          try {
242            var problemData = Content.CreateNewProblemData();
243            Progress.Show(Content, "Exporting data.", ProgressMode.Indeterminate);
244            if (problemData is TimeSeriesPrognosisProblemData)
245              Export(new TimeSeriesPrognosisCSVInstanceProvider(), problemData, saveFileDialog.FileName);
246            else if (problemData is RegressionProblemData)
247              Export(new RegressionCSVInstanceProvider(), problemData, saveFileDialog.FileName);
248            else if (problemData is ClassificationProblemData)
249              Export(new ClassificationCSVInstanceProvider(), problemData, saveFileDialog.FileName);
250          } finally {
251            Progress.Hide(Content);
252          }
253        });
254      }
255    }
256    private void Export<TProblemData, TImportType>(DataAnalysisInstanceProvider<TProblemData, TImportType> instanceProvider,
257      IDataAnalysisProblemData problemData, string path)
258      where TProblemData : class, IDataAnalysisProblemData where TImportType : DataAnalysisImportType {
259      instanceProvider.ExportData((TProblemData)problemData, path);
260    }
261    #endregion
262
263    #region Undo / Redo
264    private void undoButton_Click(object sender, EventArgs e) {
265      Content.Data.Undo();
266    }
267    #endregion
268  }
269}
Note: See TracBrowser for help on using the repository browser.