using System; using System.Text; using System.ComponentModel; namespace DevComponents.DotNetBar { /// /// Represents the base class that provides link between DotNetBar BaseItem commands and typed code representation for them. /// [ToolboxItem(false), DesignTimeVisible(false), DefaultEvent("Click")] public class CommandLink : Component { #region Private Variables private string m_Name = ""; private DotNetBarManager m_Manager = null; private static string CommandPrefix = "cmd"; #endregion #region Events /// /// Occurs when item connected to the command link is clicked. /// public event EventHandler Click; #endregion /// /// Returns name of the item that can be used to identify item from the code. You should not set this property directly since it is populated by DotNetBar designer. /// [Browsable(false), Category("Design"), Description("Indicates the name used to identify item command link is connected to.")] public string Name { get { if (this.Site != null) m_Name = this.Site.Name; return m_Name; } set { if (this.Site != null) this.Site.Name = value; if (value == null) m_Name = ""; else m_Name = value; } } protected virtual BaseItem GetItem(Type expectedItemType) { if (this.Manager == null) throw new InvalidOperationException("Manager property is not assigned to the instance of DotNetBarManager this CommandLink is linking to."); string itemName = GetItemName(this.Name); if (itemName == "") { throw new InvalidOperationException("Command link name is not in expected format. Could not retrive item."); } BaseItem item = this.Manager.GetItem(itemName, true); if (item == null) throw new InvalidOperationException("Item '" + itemName + "' cannot be found. DotNetBarManager definition might not be loaded. Try moving your code to Load event."); if (item.GetType() != expectedItemType) throw new InvalidOperationException("This CommandLink type can only by connected to " + expectedItemType.Name + " type. Currently link is connecting to " + item.GetType().ToString()); return item; } /// /// Disconnects the CommandLink object to the DotNetBarManager. /// protected virtual void DisconnectManager() { if (m_Manager == null) return; m_Manager.ItemClick -= new EventHandler(ItemClick); m_Manager.CommandLinks.Remove(this); } /// /// Connects the CommandLink object to the DotNetBarManager. /// protected virtual void ConnectManager() { if (m_Manager == null) return; m_Manager.ItemClick += new EventHandler(ItemClick); m_Manager.CommandLinks.Add(this); } private void ItemClick(object sender, EventArgs e) { if(sender is BaseItem) { BaseItem item = sender as BaseItem; if(item.Name == GetItemName(this.Name)) { if (Click != null) Click(sender, e); } } } /// /// Gets or sets the instance of DotNetBarManager associated with the command link. /// [Browsable(false), DefaultValue(null)] public DotNetBarManager Manager { get { return m_Manager; } set { if (m_Manager != null) DisconnectManager(); m_Manager = value; if (m_Manager != null) ConnectManager(); } } protected override void Dispose(bool disposing) { if (disposing) this.Manager = null; base.Dispose(disposing); } internal static string GetCommandLinkName(string itemName) { return CommandPrefix + itemName; } internal static string GetItemName(string commandLinkName) { if (commandLinkName.StartsWith(CommandPrefix)) return commandLinkName.Substring(CommandPrefix.Length); return ""; } } }