#region License Information /* HeuristicLab * Copyright (C) 2002-2008 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.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using HeuristicLab.Core; namespace HeuristicLab.Data { /// /// The visual representation of the class . /// public partial class ConstrainedItemListView : ViewBase { private ChooseItemDialog chooseItemDialog; /// /// Gets or sets the item list to represent. /// /// Uses property of base class . public ConstrainedItemList ConstrainedItemList { get { return (ConstrainedItemList)base.Item; } set { base.Item = value; } } /// /// Initializes a new instance of the class . /// public ConstrainedItemListView() { InitializeComponent(); //itemsListView.Columns[0].Width = Math.Max(0, itemsListView.Width - 25); } /// /// Initializes a new instance of the class with the given /// . /// No CopyConstructor! is not copied! /// /// The item list to represent visually. public ConstrainedItemListView(ConstrainedItemList constrainedItemList) : this() { ConstrainedItemList = constrainedItemList; } /// /// Removes the eventhandlers from the underlying . /// /// Calls of base class . /// protected override void RemoveItemEvents() { ConstrainedItemList.ItemAdded -= new EventHandler(ConstrainedItemList_ItemAdded); ConstrainedItemList.ItemRemoved -= new EventHandler(ConstrainedItemList_ItemRemoved); ConstrainedItemList.Cleared -= new EventHandler(ConstrainedItemList_Cleared); base.RemoveItemEvents(); } /// /// Adds eventhandlers to the underlying . /// /// Calls of base class . /// protected override void AddItemEvents() { base.AddItemEvents(); ConstrainedItemList.ItemAdded += new EventHandler(ConstrainedItemList_ItemAdded); ConstrainedItemList.ItemRemoved += new EventHandler(ConstrainedItemList_ItemRemoved); ConstrainedItemList.Cleared += new EventHandler(ConstrainedItemList_Cleared); } /// /// Updates all controls with the latest elements in the list. /// protected override void UpdateControls() { base.UpdateControls(); detailsGroupBox.Enabled = false; detailsGroupBox.Controls.Clear(); removeItemButton.Enabled = false; if (ConstrainedItemList == null) { itemsGroupBox.Enabled = false; itemsSplitContainer.Enabled = false; constraintsConstrainedItemBaseView.Enabled = false; } else { foreach (ListViewItem item in itemsListView.Items) { ((IItem)item.Tag).Changed -= new EventHandler(Item_Changed); } itemsListView.Items.Clear(); foreach (IItem data in ConstrainedItemList) { ListViewItem item = new ListViewItem(); item.Text = data.ToString(); item.Tag = data; itemsListView.Items.Add(item); data.Changed += new EventHandler(Item_Changed); } itemsSplitContainer.Enabled = true; constraintsConstrainedItemBaseView.ConstrainedItem = ConstrainedItemList; constraintsConstrainedItemBaseView.Enabled = true; } } private void itemsListView_SelectedIndexChanged(object sender, EventArgs e) { detailsGroupBox.Enabled = false; if (detailsGroupBox.Controls.Count > 0) detailsGroupBox.Controls[0].Dispose(); detailsGroupBox.Controls.Clear(); if (itemsListView.SelectedItems.Count == 1) { IItem data = (IItem)itemsListView.SelectedItems[0].Tag; Control view = (Control)data.CreateView(); detailsGroupBox.Controls.Add(view); view.Dock = DockStyle.Fill; detailsGroupBox.Enabled = true; } removeItemButton.Enabled = (itemsListView.SelectedItems.Count == 1); } #region ConstrainedItemList changes void ConstrainedItemList_ItemAdded(object sender, ItemIndexEventArgs e) { if (InvokeRequired) Invoke(new EventHandler(ConstrainedItemList_ItemAdded), sender, e); else { ListViewItem item = new ListViewItem(); item.Text = e.Item.ToString(); item.Tag = e.Item; itemsListView.Items.Insert(e.Index, item); e.Item.Changed += new EventHandler(Item_Changed); } } void ConstrainedItemList_ItemRemoved(object sender, ItemIndexEventArgs e) { if (InvokeRequired) Invoke(new EventHandler(ConstrainedItemList_ItemRemoved), sender, e); else { itemsListView.Items.RemoveAt(e.Index); e.Item.Changed -= new EventHandler(Item_Changed); } } void ConstrainedItemList_Cleared(object sender, EventArgs e) { Refresh(); } void Item_Changed(object sender, EventArgs e) { if (InvokeRequired) Invoke(new EventHandler(Item_Changed), sender, e); else { IItem data = (IItem)sender; foreach (ListViewItem item in itemsListView.Items) { if (item.Tag == data) item.Text = data.ToString(); } } } #endregion #region Button events private void addItemButton_Click(object sender, EventArgs e) { if (chooseItemDialog == null) { chooseItemDialog = new ChooseItemDialog(); chooseItemDialog.Caption = "Add Item"; } if (chooseItemDialog.ShowDialog(this) == DialogResult.OK) { ICollection violatedConstraints; if (!ConstrainedItemList.TryAdd(chooseItemDialog.Item, out violatedConstraints)) { Auxiliary.ShowConstraintViolationMessageBox(violatedConstraints); } } } private void removeItemButton_Click(object sender, EventArgs e) { ICollection violatedConstraints; if (!ConstrainedItemList.TryRemoveAt(itemsListView.SelectedIndices[0], out violatedConstraints)) { Auxiliary.ShowConstraintViolationMessageBox(violatedConstraints); } } #endregion #region Key events private void itemsListView_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Delete) { ICollection violatedConstraints; if (!ConstrainedItemList.TryRemoveAt(itemsListView.SelectedIndices[0], out violatedConstraints)) { Auxiliary.ShowConstraintViolationMessageBox(violatedConstraints); } } } #endregion } }