/* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2013 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ * * This program 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 1 of the License, or * (at your option) any later version. * * This program 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 this program. If not, see . */ using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace Greenshot.Forms { /// /// Description of ToolStripMenuSelectList. /// public class ToolStripMenuSelectList : ToolStripMenuItem { private bool multiCheckAllowed = false; private bool updateInProgress = false; /// /// Occurs when one of the list's child element's Checked state changes. /// public new event EventHandler CheckedChanged; public Object Identifier; public ToolStripMenuSelectList(Object identifier, bool allowMultiCheck) { Identifier = identifier; CheckOnClick = false; multiCheckAllowed = allowMultiCheck; } public ToolStripMenuSelectList() : this(null, false) { } public ToolStripMenuSelectList(Object identifier) : this(identifier, false) { } /// /// gets or sets the currently checked item /// public Object CheckedItem { get { IEnumerator items = DropDownItems.GetEnumerator(); while (items.MoveNext()) { ToolStripMenuItem tsmi = (ToolStripMenuItem)items.Current; if (tsmi.Checked) { return tsmi; } } return null; } set { IEnumerator items = DropDownItems.GetEnumerator(); while (items.MoveNext()) { ToolStripMenuItem tsmi = (ToolStripMenuItem)items.Current; if (!multiCheckAllowed && !tsmi.Equals(value)) { tsmi.Checked = false; } else if (tsmi.Equals(value)) { tsmi.Checked = true; } } } } /// /// gets or sets the currently checked items /// public ToolStripMenuSelectListItem[] CheckedItems { get { List sel = new List(); IEnumerator items = DropDownItems.GetEnumerator(); while (items.MoveNext()) { ToolStripMenuSelectListItem tsmi = (ToolStripMenuSelectListItem)items.Current; if (tsmi.Checked) { sel.Add(tsmi); } } return sel.ToArray(); } set { if (!multiCheckAllowed) { throw new ArgumentException("Writing to checkedItems is only allowed in multi-check mode. Either set allowMultiCheck to true or use set SelectedItem instead of SelectedItems."); } IEnumerator items = DropDownItems.GetEnumerator(); IEnumerator sel = value.GetEnumerator(); while (items.MoveNext()) { ToolStripMenuItem tsmi = (ToolStripMenuItem)items.Current; while (sel.MoveNext()) { if (tsmi.Equals(sel.Current)) { tsmi.Checked = true; } else { tsmi.Checked = false; } if (!multiCheckAllowed && !tsmi.Equals(sel.Current)) { tsmi.Checked = false; } else if (tsmi.Equals(value)) { tsmi.Checked = true; } } } } } private void ItemCheckStateChanged(object sender, EventArgs e) { if (updateInProgress) { return; } ToolStripMenuSelectListItem tsmi = (ToolStripMenuSelectListItem)sender; updateInProgress = true; if (tsmi.Checked && !multiCheckAllowed) { UncheckAll(); tsmi.Checked = true; } updateInProgress = false; if (CheckedChanged != null) { CheckedChanged(this, new ItemCheckedChangedEventArgs(tsmi)); } } /// /// adds an item to the select list /// /// the label to be displayed /// the icon to be displayed /// the data to be returned when an item is queried /// whether the item is initially checked public void AddItem(string label, Image image, Object data, bool isChecked) { ToolStripMenuSelectListItem newItem = new ToolStripMenuSelectListItem(); newItem.Text = label; newItem.Image = image; newItem.CheckOnClick = true; newItem.CheckStateChanged += ItemCheckStateChanged; newItem.Data = data; if (isChecked) { if (!multiCheckAllowed) { updateInProgress = true; UncheckAll(); updateInProgress = false; } newItem.Checked = isChecked; } DropDownItems.Add(newItem); } /// /// adds an item to the select list /// /// the label to be displayed /// the icon to be displayed public void AddItem(string label, Image image) { AddItem(label, image, null, false); } /// /// adds an item to the select list /// /// the label to be displayed /// the data to be returned when an item is queried public void AddItem(string label, Object data) { AddItem(label, null, data, false); } /// /// adds an item to the select list /// /// the label to be displayed public void AddItem(string label) { AddItem(label, null, null, false); } // /// adds an item to the select list /// /// the label to be displayed /// the icon to be displayed /// whether the item is initially selected /// whether the item is initially checked public void AddItem(string label, Image image, bool isChecked) { AddItem(label, image, null, isChecked); } /// /// adds an item to the select list /// /// the label to be displayed /// the data to be returned when an item is queried /// whether the item is initially checked public void AddItem(string label, Object data, bool isChecked) { AddItem(label, null, data, isChecked); } /// /// adds an item to the select list /// /// the label to be displayed /// whether the item is initially checked public void AddItem(string label, bool isChecked) { AddItem(label, null, null, isChecked); } /// /// unchecks all items of the list /// public void UncheckAll() { IEnumerator items = DropDownItems.GetEnumerator(); while (items.MoveNext()) { ((ToolStripMenuItem)items.Current).Checked = false; } } } public class ItemCheckedChangedEventArgs : EventArgs { public ToolStripMenuSelectListItem Item; public ItemCheckedChangedEventArgs(ToolStripMenuSelectListItem item) { Item = item; } } public class ToolStripMenuSelectListItem : ToolStripMenuItem { public Object Data; } }