#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.Linq;
using System.Windows.Forms;
using HeuristicLab.Collections;
using HeuristicLab.Common;
using HeuristicLab.Core;
using HeuristicLab.MainForm;
using HeuristicLab.MainForm.WindowsForms;
namespace HeuristicLab.Optimization.Views {
[View("Results Producing Item View")]
[Content(typeof(IResultsProducingItem), true)]
public partial class ResultsProducingItemView : AsynchronousContentView {
public ResultsProducingItemView() {
InitializeComponent();
parameterGroup = listView.Groups["parametersGroup"];
resultsGroup = listView.Groups["resultsGroup"];
}
public new IResultsProducingItem Content {
get { return (IResultsProducingItem)base.Content; }
set { base.Content = value; }
}
private Dictionary itemToListViewItem = new Dictionary();
private ListViewGroup parameterGroup;
private ListViewGroup resultsGroup;
protected override void OnContentChanged() {
base.OnContentChanged();
listView.Items.Clear();
itemToListViewItem.Clear();
RebuildImageList();
viewHost.Content = null;
if (Content != null) {
FillListView();
AdjustListViewColumnSizes();
}
}
protected override void SetEnabledStateOfControls() {
base.SetEnabledStateOfControls();
if (Content == null) {
addButton.Enabled = false;
sortAscendingButton.Enabled = false;
sortDescendingButton.Enabled = false;
removeButton.Enabled = false;
listView.Enabled = false;
detailsGroupBox.Enabled = false;
return;
}
addButton.Enabled = !ReadOnly && !Content.Parameters.IsReadOnly && !((IKeyedItemCollection)Content.Results).IsReadOnly;
sortAscendingButton.Enabled = listView.Items.Count > 1;
sortDescendingButton.Enabled = listView.Items.Count > 1;
removeButton.Enabled = !ReadOnly && !Content.Parameters.IsReadOnly && !((IKeyedItemCollection)Content.Results).IsReadOnly;
listView.Enabled = true;
detailsGroupBox.Enabled = listView.SelectedItems.Count == 1;
}
#region Content event registration
protected override void RegisterContentEvents() {
base.RegisterContentEvents();
RegisterContentParametersEvents();
RegisterContentResultsEvents();
}
private void RegisterContentParametersEvents() {
Content.Parameters.ItemsAdded += ParametersOnItemsChanged;
Content.Parameters.ItemsRemoved += ParametersOnItemsRemoved;
Content.Parameters.ItemsReplaced += ParametersOnItemsChanged;
Content.Parameters.CollectionReset += ParametersOnItemsChanged;
foreach (var item in Content.Parameters) {
RegisterItemEvents(item);
}
}
private void RegisterContentResultsEvents() {
Content.Results.ItemsAdded += ResultsOnItemsChanged;
Content.Results.ItemsRemoved += ResultsOnItemsRemoved;
Content.Results.ItemsReplaced += ResultsOnItemsChanged;
Content.Results.CollectionReset += ResultsOnItemsChanged;
foreach (var item in Content.Results) {
RegisterItemEvents(item);
}
}
protected virtual void RegisterItemEvents(IItem item) {
item.ItemImageChanged += new EventHandler(Item_ItemImageChanged);
item.ToStringChanged += new EventHandler(Item_ToStringChanged);
}
protected override void DeregisterContentEvents() {
DeregisterContentParametersEvents();
DeregisterContentResultsEvents();
foreach (var item in itemToListViewItem.Keys) {
DeregisterItemEvents(item);
}
base.DeregisterContentEvents();
}
private void DeregisterContentParametersEvents() {
Content.Parameters.ItemsAdded -= ParametersOnItemsChanged;
Content.Parameters.ItemsRemoved -= ParametersOnItemsRemoved;
Content.Parameters.ItemsReplaced -= ParametersOnItemsChanged;
Content.Parameters.CollectionReset -= ParametersOnItemsChanged;
}
private void DeregisterContentResultsEvents() {
Content.Results.ItemsAdded -= ResultsOnItemsChanged;
Content.Results.ItemsRemoved -= ResultsOnItemsRemoved;
Content.Results.ItemsReplaced -= ResultsOnItemsChanged;
Content.Results.CollectionReset -= ResultsOnItemsChanged;
}
protected virtual void DeregisterItemEvents(IItem item) {
item.ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
item.ToStringChanged -= new EventHandler(Item_ToStringChanged);
}
#endregion
private string selectedName;
private void FillListView() {
if (listView.SelectedItems.Count == 1) selectedName = listView.SelectedItems[0].SubItems[0].Text;
FillListView(false);
if (listView.Items.Count > 0)
selectedName = null;
}
private void FillListView(bool resize = true) {
listView.BeginUpdate();
foreach (var item in listView.Items.OfType().OrderByDescending(x => x.ImageIndex).ToList()) {
listView.SmallImageList.Images.RemoveAt(item.ImageIndex);
listView.Items.Remove(item);
}
itemToListViewItem.Clear();
listView.EndUpdate();
if (Content == null) return;
//Fill list view with new content
foreach (var parameter in Content.Parameters) {
var listViewItem = CreateListViewItem(parameter, parameterGroup);
listView.Items.Add(listViewItem);
if ((selectedName != null) && parameter.Name.Equals(selectedName)) listViewItem.Selected = true;
itemToListViewItem[parameter] = listViewItem;
}
foreach (var result in Content.Results) {
var listViewItem = CreateListViewItem(result, resultsGroup);
listView.Items.Add(listViewItem);
if ((selectedName != null) && result.Name.Equals(selectedName)) listViewItem.Selected = true;
itemToListViewItem[result] = listViewItem;
}
if (resize && listView.Items.Count > 0) {
for (int i = 0; i < listView.Columns.Count; i++)
listView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
}
}
private void ParametersOnItemsChanged(object sender, CollectionItemsChangedEventArgs e) {
foreach (var item in e.OldItems) {
listView.Items.Remove(itemToListViewItem[item]);
itemToListViewItem.Remove(item);
}
foreach (var item in e.Items) {
var listViewItem = CreateListViewItem(item, parameterGroup);
RegisterItemEvents(item);
listView.Items.Add(listViewItem);
itemToListViewItem[item] = listViewItem;
}
AdjustListViewColumnSizes();
}
private void ParametersOnItemsRemoved(object sender, CollectionItemsChangedEventArgs e) {
var eventArgs = new CollectionItemsChangedEventArgs(new IParameter[0], e.Items);
ParametersOnItemsChanged(sender, eventArgs);
}
private void ResultsOnItemsChanged(object sender, CollectionItemsChangedEventArgs e) {
foreach (var item in e.OldItems) {
listView.Items.Remove(itemToListViewItem[item]);
itemToListViewItem.Remove(item);
}
foreach (var item in e.Items) {
var listViewItem = CreateListViewItem(item, resultsGroup);
RegisterItemEvents(item);
listView.Items.Add(listViewItem);
itemToListViewItem[item] = listViewItem;
}
AdjustListViewColumnSizes();
}
private void ResultsOnItemsRemoved(object sender, CollectionItemsChangedEventArgs e) {
var eventArgs = new CollectionItemsChangedEventArgs(new IResult[0], e.Items);
ResultsOnItemsChanged(sender, eventArgs);
}
private ListViewItem CreateListViewItem(INamedItem value, ListViewGroup group) {
var item = new ListViewItem();
item.Text = value.ToString();
item.ToolTipText = value.Name + ": " + value.Description;
item.Tag = value;
item.Group = group;
listView.SmallImageList.Images.Add(value == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : value.ItemImage);
item.ImageIndex = listView.SmallImageList.Images.Count - 1;
return item;
}
private void UpdateListViewItemImage(ListViewItem listViewItem) {
if (listViewItem == null) throw new ArgumentNullException();
var item = listViewItem.Tag as IItem;
int i = listViewItem.ImageIndex;
listView.SmallImageList.Images[i] = item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage;
listViewItem.ImageIndex = -1;
listViewItem.ImageIndex = i;
}
private void UpdateListViewItemText(ListViewItem listViewItem) {
if (listViewItem == null) throw new ArgumentNullException();
var item = listViewItem.Tag as INamedItem;
listViewItem.Text = item.ToString();
listViewItem.ToolTipText = item.Name + ": " + item.Description;
}
#region listView events
private void listView_SelectedIndexChanged(object sender, EventArgs e) {
if (!showDetailsCheckBox.Checked) return;
if (listView.SelectedItems.Count == 1) {
detailsGroupBox.Enabled = true;
viewHost.Content = listView.SelectedItems[0].Tag as IContent;
} else {
viewHost.Content = null;
detailsGroupBox.Enabled = false;
}
}
private void listView_DoubleClick(object sender, EventArgs e) {
if (listView.SelectedItems.Count == 1) {
IItem item = (IItem)listView.SelectedItems[0].Tag;
IContentView view = MainFormManager.MainForm.ShowContent(item);
if (view != null) {
view.ReadOnly = true;
view.Locked = Locked;
}
}
}
protected virtual void listView_Layout(object sender, LayoutEventArgs e) {
AdjustListViewColumnSizes();
}
protected virtual void listView_Resize(object sender, EventArgs e) {
AdjustListViewColumnSizes();
}
#endregion
#region Item Events
protected virtual void Item_ItemImageChanged(object sender, EventArgs e) {
if (InvokeRequired)
Invoke(new EventHandler(Item_ItemImageChanged), sender, e);
else {
IItem item = (IItem)sender;
var listViewItem = itemToListViewItem[item];
UpdateListViewItemImage(listViewItem);
}
}
protected virtual void Item_ToStringChanged(object sender, EventArgs e) {
if (InvokeRequired)
Invoke(new EventHandler(Item_ToStringChanged), sender, e);
else {
IItem item = (IItem)sender;
var listViewItem = itemToListViewItem[item];
UpdateListViewItemText(listViewItem);
if (listView.Columns.Count > 1)
AdjustListViewColumnSizes();
}
}
#endregion
#region Helper Methods
protected virtual void AdjustListViewColumnSizes() {
if (listView.Columns.Count == 1)
listView.Columns[0].Width = listView.ClientSize.Width;
else {
if (listView.Items.Count > 0) {
for (int i = 0; i < listView.Columns.Count; i++)
listView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
}
}
}
protected virtual void RebuildImageList() {
listView.SmallImageList.Images.Clear();
foreach (ListViewItem listViewItem in listView.Items) {
var item = listViewItem.Tag as IItem;
listView.SmallImageList.Images.Add(item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage);
listViewItem.ImageIndex = listView.SmallImageList.Images.Count - 1;
}
}
#endregion
}
}