#region License Information /* HeuristicLab * Copyright (C) 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.Drawing; using System.Linq; using System.Windows.Forms; using HEAL.Attic; using HeuristicLab.Core; using HeuristicLab.Core.Views; using HeuristicLab.MainForm; using HeuristicLab.Optimization; using HeuristicLab.PluginInfrastructure; namespace HeuristicLab.Problems.DataAnalysis.Views { [View("DataAnalysisSolution View")] [Content(typeof(DataAnalysisSolution), false)] public partial class DataAnalysisSolutionView : NamedItemCollectionView { public DataAnalysisSolutionView() { InitializeComponent(); viewHost.ViewsLabelVisible = false; } public new DataAnalysisSolution Content { get { return (DataAnalysisSolution)base.Content; } set { base.Content = value; } } protected override void SetEnabledStateOfControls() { base.SetEnabledStateOfControls(); addButton.Enabled = false; removeButton.Enabled = false; loadProblemDataButton.Enabled = Content != null && !Locked; } protected override void RegisterContentEvents() { base.RegisterContentEvents(); Content.ProblemDataChanged += new EventHandler(Content_ProblemDataChanged); } protected override void DeregisterContentEvents() { base.DeregisterContentEvents(); Content.ProblemDataChanged -= new EventHandler(Content_ProblemDataChanged); } private void Content_ProblemDataChanged(object sender, EventArgs e) { OnContentChanged(); } protected override void OnContentChanged() { string selectedName = null; if ((itemsListView.SelectedItems.Count == 1) && (itemsListView.SelectedItems[0].Tag != null && itemsListView.SelectedItems[0].Tag is Type)) selectedName = itemsListView.SelectedItems[0].Text; base.OnContentChanged(); AddEvaluationViewTypes(); // recover selection if (selectedName != null) { foreach (ListViewItem item in itemsListView.Items) { if (item.Tag != null && item.Tag is Type && item.Text == selectedName) item.Selected = true; } } } protected override IResult CreateItem() { return null; } protected virtual void AddEvaluationViewTypes() { if (Content != null && !Content.ProblemData.IsEmpty) { var viewTypes = MainFormManager.GetViewTypes(Content.GetType(), true) .Where(t => typeof(IDataAnalysisSolutionEvaluationView).IsAssignableFrom(t)); foreach (var viewType in viewTypes) AddViewListViewItem(viewType, ((IDataAnalysisSolutionEvaluationView)Activator.CreateInstance(viewType)).ViewImage); } } protected sealed override void itemsListView_DoubleClick(object sender, EventArgs e) { if (itemsListView.SelectedItems.Count != 1) return; IResult result = itemsListView.SelectedItems[0].Tag as IResult; Type viewType = itemsListView.SelectedItems[0].Tag as Type; if (result != null) { IContentView view = MainFormManager.MainForm.ShowContent(result.Value); if (view != null) { view.Caption = result.Name; view.ReadOnly = ReadOnly; view.Locked = Locked; } } else if (viewType != null) { MainFormManager.MainForm.ShowContent(Content, viewType); } } protected override void itemsListView_SelectedIndexChanged(object sender, EventArgs e) { if (itemsListView.SelectedItems.Count == 1 && itemsListView.SelectedItems[0].Tag is Type) { detailsGroupBox.Enabled = true; Type viewType = (Type)itemsListView.SelectedItems[0].Tag; viewHost.ViewType = viewType; viewHost.Content = Content; } else base.itemsListView_SelectedIndexChanged(sender, e); } protected virtual void loadProblemDataButton_Click(object sender, EventArgs e) { if (loadProblemDataFileDialog.ShowDialog(this) != DialogResult.OK) return; try { var ser = new ProtoBufSerializer(); object hlFile = ser.Deserialize(loadProblemDataFileDialog.FileName); IDataAnalysisProblemData problemData = null; if (hlFile is IDataAnalysisProblemData) { problemData = (IDataAnalysisProblemData)hlFile; } else if (hlFile is IDataAnalysisProblem) { problemData = ((IDataAnalysisProblem)hlFile).ProblemData; } else if (hlFile is IDataAnalysisSolution) { problemData = ((IDataAnalysisSolution)hlFile).ProblemData; } if (problemData == null) throw new InvalidOperationException("The chosen HeuristicLab file does not contain a ProblemData, Problem, or DataAnalysisSolution."); var solution = (IDataAnalysisSolution)Content.Clone(); solution.ProblemData = problemData; if (!solution.Name.EndsWith(" with loaded problemData")) solution.Name += " with loaded problemData"; MainFormManager.MainForm.ShowContent(solution); } catch (InvalidOperationException invalidOperationException) { ErrorHandling.ShowErrorDialog(this, invalidOperationException); } catch (ArgumentException argumentException) { ErrorHandling.ShowErrorDialog(this, argumentException); } } protected void AddViewListViewItem(Type viewType, Image image) { ListViewItem listViewItem = new ListViewItem(); listViewItem.Text = ViewAttribute.GetViewName(viewType); itemsListView.SmallImageList.Images.Add(image); listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1; listViewItem.Tag = viewType; itemsListView.Items.Add(listViewItem); AdjustListViewColumnSizes(); } protected void RemoveViewListViewItem(Type viewType) { List itemsToRemove = itemsListView.Items.Cast().Where(item => item.Tag as Type == viewType).ToList(); foreach (ListViewItem item in itemsToRemove) itemsListView.Items.Remove(item); } protected override void showDetailsCheckBox_CheckedChanged(object sender, EventArgs e) { if (showDetailsCheckBox.Checked && itemsListView.SelectedItems.Count == 1 && itemsListView.SelectedItems[0].Tag is Type) { Type viewType = (Type)itemsListView.SelectedItems[0].Tag; viewHost.ViewType = viewType; viewHost.Content = Content; splitContainer.Panel2Collapsed = false; detailsGroupBox.Enabled = true; } else base.showDetailsCheckBox_CheckedChanged(sender, e); } protected override void RebuildImageList() { itemsListView.SmallImageList.Images.Clear(); foreach (ListViewItem listViewItem in itemsListView.Items) { IResult result = listViewItem.Tag as IResult; Type viewType = listViewItem.Tag as Type; if (result != null) itemsListView.SmallImageList.Images.Add(result.ItemImage); else if (viewType != null && typeof(IDataAnalysisSolutionEvaluationView).IsAssignableFrom(viewType)) itemsListView.SmallImageList.Images.Add(((IDataAnalysisSolutionEvaluationView)Activator.CreateInstance(viewType)).ViewImage); else itemsListView.SmallImageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Nothing); listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1; } } #region drag and drop protected override void itemsListView_DragEnter(object sender, DragEventArgs e) { validDragOperation = false; if (ReadOnly) return; if (e.Effect != DragDropEffects.Copy) return; var dropData = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat); if (dropData is IDataAnalysisProblemData) validDragOperation = true; else if (dropData is IDataAnalysisProblem) validDragOperation = true; else if (dropData is IValueParameter) { var param = (IValueParameter)dropData; if (param.Value is IDataAnalysisProblemData) validDragOperation = true; } } protected override void itemsListView_DragDrop(object sender, DragEventArgs e) { if (e.Effect != DragDropEffects.Copy) return; IDataAnalysisProblemData problemData = null; var dropData = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat); if (dropData is IDataAnalysisProblemData) problemData = (IDataAnalysisProblemData)dropData; else if (dropData is IDataAnalysisProblem) problemData = ((IDataAnalysisProblem)dropData).ProblemData; else if (dropData is IValueParameter) { var param = (IValueParameter)dropData; problemData = param.Value as DataAnalysisProblemData; } if (problemData == null) return; problemData = (IDataAnalysisProblemData)problemData.Clone(); try { Content.ProblemData = problemData; if (!Content.Name.EndsWith(" with changed problemData")) Content.Name += " with changed problemData"; Content.Filename = string.Empty; MainFormManager.GetMainForm().UpdateTitle(); } catch (InvalidOperationException invalidOperationException) { ErrorHandling.ShowErrorDialog(this, invalidOperationException); } catch (ArgumentException argumentException) { ErrorHandling.ShowErrorDialog(this, argumentException); } } #endregion } }