using System.Collections;
namespace DevComponents.DotNetBar
{
	using System;
	using System.Drawing;
    /// 
    /// Interface for designer-item integration.
    /// 
    public interface IBarItemDesigner
    {
        void StartExternalDrag(BaseItem item);
    }
    /// 
    /// Interface implemented by target Bar interested in access to designer.
    /// 
    public interface IBarDesignerServices
    {
        /// 
        /// Gets or sets the BarBaseControlDesigner instance.
        /// 
        IBarItemDesigner Designer { get;set;}
    }
	/// 
	/// Provides design-time support for DotNetBar items.
	/// 
	public interface IDesignTimeProvider
	{
		InsertPosition GetInsertPosition(Point pScreen, BaseItem DragItem);
		void DrawReversibleMarker(int iPos, bool Before);
		void InsertItemAt(BaseItem objItem, int iPos, bool Before);
	}
	public class InsertPosition
	{
		public int Position;
		public bool Before;
		public IDesignTimeProvider TargetProvider;
		public InsertPosition()
		{
			Position=-1;
			Before=false;
			TargetProvider=null;
		}
		public InsertPosition(int iPosition, bool bBefore, IDesignTimeProvider target)
		{
			this.Position=iPosition;
			this.Before=bBefore;
			this.TargetProvider=target;
		}
        public override string ToString()
        {
            if (TargetProvider == null)
                return string.Format("TargetProvider={0}, Position={1}, Before={2}", "null", Position, Before);
            else
                return string.Format("TargetProvider={0}, Position={1}, Before={2}", TargetProvider, Position, Before);
        }
	}
	/// 
	/// Provides support for personalized menu items.
	/// 
	public interface IPersonalizedMenuItem
	{
		eMenuVisibility MenuVisibility {get;set;}
		bool RecentlyUsed {get;set;}
	}
	public interface IOwnerItemEvents
	{
		void InvokeItemAdded(BaseItem item,EventArgs e);
		void InvokeItemRemoved(BaseItem item, BaseItem parent, int itemIndex);
		void InvokeMouseEnter(BaseItem item,EventArgs e);
		void InvokeMouseHover(BaseItem item,EventArgs e);
        void InvokeMouseLeave(BaseItem item,EventArgs e);
		void InvokeMouseDown(BaseItem item, System.Windows.Forms.MouseEventArgs e);
		void InvokeMouseUp(BaseItem item, System.Windows.Forms.MouseEventArgs e);
		void InvokeMouseMove(BaseItem item, System.Windows.Forms.MouseEventArgs e);
		void InvokeItemClick(BaseItem objItem);
        void InvokeItemDoubleClick(BaseItem objItem, System.Windows.Forms.MouseEventArgs e);
		void InvokeGotFocus(BaseItem item,EventArgs e);
		void InvokeLostFocus(BaseItem item,EventArgs e);
		void InvokeExpandedChange(BaseItem item,EventArgs e);
		void InvokeItemTextChanged(BaseItem item, EventArgs e);
//		void InvokeItemDisplayedChanged(BaseItem item, EventArgs e);
		void InvokeContainerControlDeserialize(BaseItem item,ControlContainerSerializationEventArgs e);
        void InvokeContainerControlSerialize(BaseItem item,ControlContainerSerializationEventArgs e);
		void InvokeContainerLoadControl(BaseItem item,EventArgs e);
		void InvokeOptionGroupChanging(BaseItem item, OptionGroupChangingEventArgs e);
		void InvokeToolTipShowing(object item, EventArgs e);
        void InvokeCheckedChanged(ButtonItem item, EventArgs e);
	}
	public interface IOwnerMenuSupport
	{
		bool PersonalizedAllVisible {get;set;}
		bool ShowFullMenusOnHover {get;set;}
		bool AlwaysShowFullMenus {get;set;}
		void RegisterPopup(PopupItem objPopup);
		void UnregisterPopup(PopupItem objPopup);
		bool RelayMouseHover();
		// Events
		void InvokePopupClose(PopupItem item,EventArgs e);
		void InvokePopupContainerLoad(PopupItem item,EventArgs e);
		void InvokePopupContainerUnload(PopupItem item,EventArgs e);
		void InvokePopupOpen(PopupItem item,PopupOpenEventArgs e);
		void InvokePopupShowing(PopupItem item,EventArgs e);
		bool ShowPopupShadow {get;}
		eMenuDropShadow MenuDropShadow{get;set;}
		ePopupAnimation PopupAnimation{get;set;}
		bool AlphaBlendShadow{get;set;}
        /// 
        /// Closes all popups managed by the owner control.
        /// 
        void ClosePopups();
	}
	public interface IOwnerBarSupport
	{
		void InvokeDockTabChange(Bar bar,DockTabChangeEventArgs e);
		void InvokeBarDock(Bar bar,EventArgs e);
		void InvokeBarUndock(Bar bar,EventArgs e);
		void InvokeAutoHideChanged(Bar bar,EventArgs e);
		void InvokeBarClosing(Bar bar,BarClosingEventArgs e);
		void InvokeAutoHideDisplay(Bar bar,AutoHideDisplayEventArgs e);
		void InvokeBarTearOff(Bar bar,EventArgs e);
		void InvokeBeforeDockTabDisplay(BaseItem item, EventArgs e);
		DockSiteInfo GetDockInfo(IDockInfo pDock, int x, int y);
		void DockComplete();
		void BarContextMenu(System.Windows.Forms.Control bar, System.Windows.Forms.MouseEventArgs e);
		System.Collections.ArrayList WereVisible{get;}
		void AddShortcutsFromBar(Bar bar);
		void RemoveShortcutsFromBar(Bar bar);
		// Dock Site Support
		DockSite LeftDockSite{get;set;}
		DockSite RightDockSite{get;set;}
		DockSite TopDockSite{get;set;}
		DockSite BottomDockSite{get;set;}
		DockSite FillDockSite{get;set;}
        DockSite ToolbarLeftDockSite { get;set;}
        DockSite ToolbarRightDockSite { get;set;}
        DockSite ToolbarTopDockSite { get;set;}
        DockSite ToolbarBottomDockSite { get;set;}
		bool ApplyDocumentBarStyle{get;set;}
	}
	public interface IOwnerAutoHideSupport
	{
		// Auto-hide support
		AutoHidePanel LeftAutoHidePanel {get;set;}
		AutoHidePanel RightAutoHidePanel {get;set;}
		AutoHidePanel TopAutoHidePanel {get;set;}
		AutoHidePanel BottomAutoHidePanel {get;set;}
		bool HasLeftAutoHidePanel {get;}
		bool HasRightAutoHidePanel {get;}
		bool HasTopAutoHidePanel {get;}
		bool HasBottomAutoHidePanel {get;}
	}
	public interface IOwner
	{
		System.Windows.Forms.Form ParentForm {get;set;}
		System.Collections.ArrayList GetItems(string ItemName);
		System.Collections.ArrayList GetItems(string ItemName, Type itemType);
        System.Collections.ArrayList GetItems(string ItemName, Type itemType, bool useGlobalName);
		BaseItem GetItem(string ItemName);
		void SetExpandedItem(BaseItem objItem);
		BaseItem GetExpandedItem();
		void SetFocusItem(BaseItem objFocusItem);
		BaseItem GetFocusItem();
		void DesignTimeContextMenu(BaseItem objItem);
		void RemoveShortcutsFromItem(BaseItem objItem);
		void AddShortcutsFromItem(BaseItem objItem);
		System.Windows.Forms.ImageList Images {get;set;}
		System.Windows.Forms.ImageList ImagesMedium {get;set;}
		System.Windows.Forms.ImageList ImagesLarge {get;set;}
		// Drag support
		void StartItemDrag(BaseItem objItem);
		BaseItem DragItem{get;}
		bool DragInProgress{get;}
		bool ShowToolTips{get;set;}
		bool ShowShortcutKeysInToolTips{get;set;}
		bool AlwaysDisplayKeyAccelerators{get;set;}
		System.Windows.Forms.Form ActiveMdiChild{get;}
		System.Windows.Forms.MdiClient GetMdiClient(System.Windows.Forms.Form MdiForm);
		
		void Customize();
		void InvokeResetDefinition(BaseItem item,EventArgs e);
        bool ShowResetButton{get;set;}
		void InvokeDefinitionLoaded(object sender,EventArgs e);
		void InvokeUserCustomize(object sender,EventArgs e);
		void InvokeEndUserCustomize(object sender, EndUserCustomizeEventArgs e);
		void OnApplicationActivate();
		void OnApplicationDeactivate();
		void OnParentPositionChanging();
		bool DesignMode {get;}
		bool DisabledImagesGrayScale{get;set;}
	}
	/// 
	/// Provides support for custom localization.
	/// 
	public interface IOwnerLocalize
	{
		void InvokeLocalizeString(LocalizeEventArgs e);
	}
	internal interface IThemeCache
	{
		DevComponents.DotNetBar.ThemeWindow ThemeWindow{get;}
		DevComponents.DotNetBar.ThemeRebar ThemeRebar{get;}
		DevComponents.DotNetBar.ThemeToolbar ThemeToolbar{get;}
		DevComponents.DotNetBar.ThemeHeader ThemeHeader{get;}
		DevComponents.DotNetBar.ThemeScrollBar ThemeScrollBar{get;}
		DevComponents.DotNetBar.ThemeExplorerBar ThemeExplorerBar{get;}
		DevComponents.DotNetBar.ThemeProgress ThemeProgress{get;}
        DevComponents.DotNetBar.ThemeButton ThemeButton { get;}
	}
	public interface IBarImageSize
	{
		eBarImageSize ImageSize {get;set;}
	}
	/// 
	/// Describes container support for setting the word-wrap behavior of it's sub-items.
	/// 
	public interface IContainerWordWrap
	{
		/// 
		/// Gets or sets whether sub items text will be word wrapped if it cannot fit the space allocated.
		/// 
		bool WordWrapSubItems{get;set;}
	}
    /// 
    /// Desribes interface that provides custom serialization support for items.
    /// 
    public interface ICustomSerialization
    {
        /// 
        /// Occurs after an item has been serialized to XmlElement and provides you with opportunity to add any custom data
        /// to serialized XML. This allows you to serialize any data with the item and load it back up in DeserializeItem event.
        /// 
        /// 
        /// 	To serialize custom data to XML definition control creates handle this event and use CustomXmlElement
        /// property on SerializeItemEventArgs to add new nodes or set attributes with custom data you want saved.
        /// 
        event SerializeItemEventHandler SerializeItem;
        /// 
        /// Occurs after an item has been de-serialized (load) from XmlElement and provides you with opportunity to load any custom data
        /// you have serialized during SerializeItem event.
        /// 
        /// 
        /// 	To de-serialize custom data from XML definition handle this event and use CustomXmlElement
        /// property on SerializeItemEventArgs to retrive any data you saved in SerializeItem event.
        /// 
        event SerializeItemEventHandler DeserializeItem;
        /// 
        /// Invokes SerializeItem event.
        /// 
        /// Provides data for the event.
        void InvokeSerializeItem(SerializeItemEventArgs e);
        /// 
        /// Invokes DeserializeItem event.
        /// 
        /// Provides data for the event.
        void InvokeDeserializeItem(SerializeItemEventArgs e);
        /// 
        /// Gets whether any handlers have been defined for SerializeItem event. If no handles have been defined to optimize performance SerializeItem event will not be attempted to fire.
        /// 
        bool HasSerializeItemHandlers { get;}
        /// 
        /// Gets whether any handlers have been defined for DeserializeItem event. If no handles have been defined to optimize performance DeserializeItem event will not be attempted to fire.
        /// 
        bool HasDeserializeItemHandlers { get;}
    }
    /// 
    /// Defines interface that should be implemented by controls that support per control renderers.
    /// 
    public interface IRenderingSupport
    {
        /// 
        /// Gets the renderer control will be rendered with. This can be either custom renderer set on the control or the
        /// Rendering.GlobalManager specified renderer.
        /// 
        /// 
        Rendering.BaseRenderer GetRenderer();
        /// 
        /// Gets or sets the redering mode used by control. Default value is eRenderMode.Global which means that static GlobalManager.Renderer is used. If set to Custom then Renderer property must
        /// also be set to the custom renderer that will be used.
        /// 
        eRenderMode RenderMode { get; set; }
        /// 
        /// Gets or sets the custom renderer used by the items on this control. RenderMode property must also be set to eRenderMode.Custom in order renderer
        /// specified here to be used.
        /// 
        DevComponents.DotNetBar.Rendering.BaseRenderer Renderer { get; set;}
    }
    /// 
    /// Defines interface for internal accessibility support for DotNetBar control.
    /// 
    public interface IAccessibilitySupport
    {
        /// 
        /// Gets or sets the item default accesibility action will be performed on.
        /// 
        BaseItem DoDefaultActionItem { get; set;}
    }
    /// 
    /// Provides interface for controls that support ribbon customization.
    /// 
    public interface IRibbonCustomize
    {
        /// 
        /// Called when item contained by the container is right-clicked.
        /// 
        /// Instance of the item that was right-clicked.
        void ItemRightClick(BaseItem item);
    }
    /// 
    /// Defines notification interface for scrollable item controls.
    /// 
    public interface IScrollableItemControl
    {
        /// 
        /// Indicates that item has been selected via keyboard.
        /// 
        /// Reference to item being selected
        void KeyboardItemSelected(BaseItem item);
    }
}