using System; using Gwen.ControlInternal; namespace Gwen.Control { /// /// CollapsibleCategory control. Used in CollapsibleList. /// public class CollapsibleCategory : Base { private readonly Button m_HeaderButton; private readonly CollapsibleList m_List; /// /// Header text. /// public String Text { get { return m_HeaderButton.Text; } set { m_HeaderButton.Text = value; } } /// /// Determines whether the category is collapsed (closed). /// public bool IsCollapsed { get { return m_HeaderButton.ToggleState; } set { m_HeaderButton.ToggleState = value; } } /// /// Invoked when an entry has been selected. /// public event GwenEventHandler Selected; /// /// Invoked when the category collapsed state has been changed (header button has been pressed). /// public event GwenEventHandler Collapsed; /// /// Initializes a new instance of the class. /// /// Parent control. public CollapsibleCategory(CollapsibleList parent) : base(parent) { m_HeaderButton = new CategoryHeaderButton(this); m_HeaderButton.Text = "Category Title"; // [omeg] todo: i18n m_HeaderButton.Dock = Pos.Top; m_HeaderButton.Height = 20; m_HeaderButton.Toggled += OnHeaderToggle; m_List = parent; Padding = new Padding(1, 0, 1, 5); SetSize(512, 512); } /// /// Gets the selected entry. /// public Button GetSelectedButton() { foreach (Base child in Children) { CategoryButton button = child as CategoryButton; if (button == null) continue; if (button.ToggleState) return button; } return null; } /// /// Handler for header button toggle event. /// /// Source control. protected virtual void OnHeaderToggle(Base control) { if (Collapsed != null) Collapsed.Invoke(this); } /// /// Handler for Selected event. /// /// Event source. protected virtual void OnSelected(Base control) { CategoryButton child = control as CategoryButton; if (child == null) return; if (m_List != null) { m_List.UnselectAll(); } else { UnselectAll(); } child.ToggleState = true; if (Selected != null) Selected.Invoke(this); } /// /// Adds a new entry. /// /// Entry name (displayed). /// Newly created control. public Button Add(String name) { CategoryButton button = new CategoryButton(this); button.Text = name; button.Dock = Pos.Top; button.SizeToContents(); button.SetSize(button.Width + 4, button.Height + 4); button.Padding = new Padding(5, 2, 2, 2); button.Clicked += OnSelected; return button; } /// /// Renders the control using specified skin. /// /// Skin to use. protected override void Render(Skin.Base skin) { skin.DrawCategoryInner(this, m_HeaderButton.ToggleState); base.Render(skin); } /// /// Unselects all entries. /// public void UnselectAll() { foreach (Base child in Children) { CategoryButton button = child as CategoryButton; if (button == null) continue; button.ToggleState = false; } } /// /// Function invoked after layout. /// /// Skin to use. protected override void PostLayout(Skin.Base skin) { if (IsCollapsed) { Height = m_HeaderButton.Height; } else { SizeToChildren(false, true); } // alternate row coloring bool b = true; foreach (Base child in Children) { CategoryButton button = child as CategoryButton; if (button == null) continue; button.m_Alt = b; button.UpdateColors(); b = !b; } } } }