using System; using System.Drawing; using System.ComponentModel; using System.Windows.Forms; using DevComponents.DotNetBar.Rendering; namespace DevComponents.DotNetBar { /// /// Summary description for ControlContainerItem. /// [System.ComponentModel.ToolboxItem(false), System.ComponentModel.DesignTimeVisible(false), Designer("DevComponents.DotNetBar.Design.SimpleBaseItemDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")] public class ControlContainerItem:ImageItem,IPersonalizedMenuItem { /// /// Occurs when container control needs to be assigned to the item. /// public event EventHandler ContainerLoadControl; public delegate void ControlContainerSerializationEventHandler(object sender, ControlContainerSerializationEventArgs e); public event ControlContainerSerializationEventHandler ContainerControlSerialize; public event ControlContainerSerializationEventHandler ContainerControlDeserialize; // IPersonalizedMenuItem Implementation private eMenuVisibility m_MenuVisibility=eMenuVisibility.VisibleAlways; private bool m_RecentlyUsed=false; private System.Windows.Forms.Control m_Control=null; private bool m_MouseOver=false; private bool m_AllowItemResize=true; /// /// Creates new instance of ControlContainerItem and assigns item name. /// public ControlContainerItem():this("","") {} /// /// Creates new instance of ControlContainerItem and assigns item name. /// /// Item name. public ControlContainerItem(string sName):this(sName,""){} /// /// Creates new instance of ControlContainerItem and assigns item name and item text. /// /// Item name. /// Item text. public ControlContainerItem(string sName, string ItemText):base(sName,ItemText) { m_SupportedOrientation=eSupportedOrientation.Horizontal; } internal void InitControl() { EventArgs e=new EventArgs(); if(ContainerLoadControl!=null) ContainerLoadControl(this,e); IOwnerItemEvents owner=this.GetIOwnerItemEvents(); if(owner!=null) owner.InvokeContainerLoadControl(this,e); CustomizeChanged(); } /// /// Overridden. Returns the copy of the ControlContainerItem. /// /// Copy of the ControlContainerItem. public override BaseItem Copy() { ControlContainerItem objCopy=new ControlContainerItem(this.Name); objCopy.AllowItemResize = this.AllowItemResize; this.CopyToItem(objCopy); return objCopy; } protected override void CopyToItem(BaseItem copy) { ControlContainerItem objCopy=copy as ControlContainerItem; base.CopyToItem(objCopy); objCopy.ContainerLoadControl=this.ContainerLoadControl; objCopy.InitControl(); } protected override void Dispose(bool disposing) { if(m_Control!=null) { m_Control.Enter -= new EventHandler(HostedControlEnter); m_Control.GotFocus -= new EventHandler(HostedControlGotFocus); m_Control.Resize -= new EventHandler(HostedControlResized); // if(m_Control.Parent!=null && (!m_Control.Parent.Disposing && !(m_Control.Parent is Bar && ((Bar)m_Control.Parent).IsDisposing))) // { // m_Control.Parent.Controls.Remove(m_Control); // } m_Control=null; } base.Dispose(disposing); } protected internal override void Serialize(ItemSerializationContext context) { base.Serialize(context); System.Xml.XmlElement ThisItem = context.ItemXmlElement; ThisItem.SetAttribute("AllowResize",System.Xml.XmlConvert.ToString(m_AllowItemResize)); if(ContainerControlSerialize!=null) this.ContainerControlSerialize(this,new ControlContainerSerializationEventArgs(ThisItem)); IOwnerItemEvents owner=this.GetIOwnerItemEvents(); if(owner!=null) owner.InvokeContainerControlSerialize(this,new ControlContainerSerializationEventArgs(ThisItem)); } public override void Deserialize(ItemSerializationContext context) { base.Deserialize(context); System.Xml.XmlElement ItemXmlSource = context.ItemXmlElement; m_AllowItemResize=System.Xml.XmlConvert.ToBoolean(ItemXmlSource.GetAttribute("AllowResize")); InitControl(); if(ContainerControlDeserialize!=null) this.ContainerControlDeserialize(this,new ControlContainerSerializationEventArgs(ItemXmlSource)); IOwnerItemEvents owner=this.GetIOwnerItemEvents(); if(owner!=null) owner.InvokeContainerControlDeserialize(this,new ControlContainerSerializationEventArgs(ItemXmlSource)); } // IPersonalizedMenuItem Impementation /// /// Indicates item's visiblity when on pop-up menu. /// [System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("Indicates item's visiblity when on pop-up menu.")] public eMenuVisibility MenuVisibility { get { return m_MenuVisibility; } set { if(m_MenuVisibility!=value) { m_MenuVisibility=value; if(ShouldSyncProperties) BarFunctions.SyncProperty(this, "MenuVisibility"); } } } /// /// Indicates whether item was recently used. /// [System.ComponentModel.Browsable(false),System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] public bool RecentlyUsed { get { return m_RecentlyUsed; } set { if(m_RecentlyUsed!=value) { m_RecentlyUsed=value; if(ShouldSyncProperties) BarFunctions.SyncProperty(this, "RecentlyUsed"); } } } /// /// Gets/Sets informational text (tooltip) for the item. /// [System.ComponentModel.Browsable(false),DevCoBrowsable(false),System.ComponentModel.DefaultValue(""),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("Indicates the text that is displayed when mouse hovers over the item."),System.ComponentModel.Localizable(true)] public override string Tooltip { get { return base.Tooltip; } set { base.Tooltip=value; } } /// /// Gets or sets the reference to the control that is managed by the item. /// [Category("Data"), DefaultValue(null), Description("Indicates the control that is managed by the item.")] public System.Windows.Forms.Control Control { get { return m_Control; } set { if(m_Control!=null) { if(m_Control.Parent!=null) m_Control.Parent.Controls.Remove(m_Control); m_Control.Enter -= new EventHandler(HostedControlEnter); m_Control.GotFocus -= new EventHandler(HostedControlGotFocus); m_Control.Resize -= new EventHandler(HostedControlResized); } m_Control=value; if(m_Control!=null) { m_Control.Enter += new EventHandler(HostedControlEnter); m_Control.GotFocus += new EventHandler(HostedControlGotFocus); m_Control.Resize += new EventHandler(HostedControlResized); if(m_Control.Parent!=null) m_Control.Parent.Controls.Remove(m_Control); m_Control.Dock=System.Windows.Forms.DockStyle.None; //if (m_Control is System.Windows.Forms.ListBox) //{ // TypeDescriptor.GetProperties(m_Control)["IntegralHeight"].SetValue(m_Control, false); //} //if (!(m_Control is ItemControl) && TypeDescriptor.GetProperties(m_Control).Find("AutoSize", true) != null) // TypeDescriptor.GetProperties(m_Control)["AutoSize"].SetValue(m_Control, false); System.Windows.Forms.Control objCtrl=null; if(this.ContainerControl!=null) { objCtrl=this.ContainerControl as System.Windows.Forms.Control; if(objCtrl!=null) { objCtrl.Controls.Add(m_Control); m_Control.Refresh(); } } if(!this.Displayed) m_Control.Visible=false; } } } void HostedControlResized(object sender, EventArgs e) { NeedRecalcSize = true; if (this.ContainerControl is MenuPanel) ((MenuPanel)this.ContainerControl).RecalcLayout(); } private void HostedControlGotFocus(object sender, EventArgs e) { SetMenuHotSubItem(); } private void SetMenuHotSubItem() { if (this.IsOnMenu) { MenuPanel panel = this.ContainerControl as MenuPanel; if (panel != null && panel.HotSubItem != this) panel.HotSubItem = this; } } private void HostedControlEnter(object sender, EventArgs e) { SetMenuHotSubItem(); } /// /// Overridden. Draws the item. /// /// Target Graphics object. public override void Paint(ItemPaintArgs pa) { if(this.SuspendLayout) return; System.Drawing.Graphics g = pa.Graphics; if (m_Control != null && m_Control.Visible != this.Displayed && !m_Control.Visible) CustomizeChanged(); // Determine based on customize status Rectangle r = this.DisplayRectangle; Size objImageSize = GetMaxImageSize(); bool bOnMenu = this.IsOnMenu; if (bOnMenu && this.Parent is ItemContainer) bOnMenu = false; if (this.Orientation == eOrientation.Horizontal) { if (bOnMenu && !this.Stretch) { objImageSize.Width += 7; r.Width -= objImageSize.Width; r.X += objImageSize.Width; if (this.IsOnCustomizeMenu) objImageSize.Width += objImageSize.Height + 8; // Draw side bar Rectangle sideRect = new Rectangle(m_Rect.Left, m_Rect.Top, objImageSize.Width, m_Rect.Height); if (this.MenuVisibility == eMenuVisibility.VisibleIfRecentlyUsed && !this.RecentlyUsed) { if (!pa.Colors.MenuUnusedSide2.IsEmpty) { System.Drawing.Drawing2D.LinearGradientBrush gradient = BarFunctions.CreateLinearGradientBrush(sideRect, pa.Colors.MenuUnusedSide, pa.Colors.MenuUnusedSide2, pa.Colors.MenuUnusedSideGradientAngle); g.FillRectangle(gradient, sideRect); gradient.Dispose(); } else g.FillRectangle(new SolidBrush(pa.Colors.MenuUnusedSide), sideRect); } else { if (!pa.Colors.MenuSide2.IsEmpty) { System.Drawing.Drawing2D.LinearGradientBrush gradient = BarFunctions.CreateLinearGradientBrush(sideRect, pa.Colors.MenuSide, pa.Colors.MenuSide2, pa.Colors.MenuSideGradientAngle); g.FillRectangle(gradient, sideRect); gradient.Dispose(); } else g.FillRectangle(new SolidBrush(pa.Colors.MenuSide), sideRect); } if (BarFunctions.IsOffice2007Style(EffectiveStyle) && GlobalManager.Renderer is Office2007Renderer) { Office2007MenuColorTable mt = ((Office2007Renderer)GlobalManager.Renderer).ColorTable.Menu; if (mt != null && !mt.SideBorder.IsEmpty) { if (pa.RightToLeft) DisplayHelp.DrawGradientLine(g, sideRect.X + 1, sideRect.Y, sideRect.X + 1, sideRect.Bottom - 1, mt.SideBorder, 1); else DisplayHelp.DrawGradientLine(g, sideRect.Right - 2, sideRect.Y, sideRect.Right - 2, sideRect.Bottom - 1, mt.SideBorder, 1); } if (mt != null && !mt.SideBorderLight.IsEmpty) { if (pa.RightToLeft) DisplayHelp.DrawGradientLine(g, sideRect.X, sideRect.Y, sideRect.X, sideRect.Bottom - 1, mt.SideBorder, 1); else DisplayHelp.DrawGradientLine(g, sideRect.Right - 1, sideRect.Y, sideRect.Right - 1, sideRect.Bottom - 1, mt.SideBorderLight, 1); } } } if(this.IsOnCustomizeMenu) { if (EffectiveStyle != eDotNetBarStyle.Office2000) { r.X+=(objImageSize.Height+8); r.Width-=(objImageSize.Height+8); } else { r.X+=(objImageSize.Height+4); r.Width-=(objImageSize.Height+4); } } if (bOnMenu && EffectiveStyle != eDotNetBarStyle.Office2000) { //g.FillRectangle(new SolidBrush(pa.Colors.MenuBackground),r); } //else if(this.Style==eDotNetBarStyle.OfficeXP && !this.IsOnMenuBar) // g.FillRectangle(new SolidBrush(ColorFunctions.ToolMenuFocusBackColor(g)),this.DisplayRectangle); //else // g.FillRectangle(SystemBrushes.Control,this.DisplayRectangle); // Draw text if needed if (m_Control == null || this.GetDesignMode() || this.IsOnCustomizeMenu) { string text=m_Text; if(text=="") text="Container"; eTextFormat objStringFormat=GetStringFormat(); Font objFont=this.GetFont(); Rectangle rText=new Rectangle(r.X+8,r.Y,r.Width,r.Height); if (EffectiveStyle == eDotNetBarStyle.Office2000) { TextDrawing.DrawString(g, text, objFont, SystemColors.ControlText, rText, objStringFormat); } else { TextDrawing.DrawString(g, text, objFont, SystemColors.ControlText, rText, objStringFormat); } Size textSize = TextDrawing.MeasureString(g, text, objFont, 0, objStringFormat); r.X += (int)textSize.Width + 8; r.Width -= ((int)textSize.Width + 8); } else if (m_Control != null) { r.Inflate(-2, -2); if (m_AllowItemResize) { m_Control.Width = r.Width; } Point loc = r.Location; loc.Offset((r.Width - m_Control.Width) / 2, (r.Height - m_Control.Height) / 2); ScrollableControl scc = pa.ContainerControl as ScrollableControl; if (scc != null && scc.AutoScroll /*&& !(scc is ItemPanel)*/) loc.Offset(scc.AutoScrollPosition.X, scc.AutoScrollPosition.Y); if (m_Control.Location != loc && (!(m_Control is Controls.ComboBoxEx && ContainerControl is RibbonBar) || IsOnPopup(this)) || _ControlLocationUpdatePending) { m_Control.Location = loc; _ControlLocationUpdatePending = false; } } if(this.IsOnCustomizeMenu && this.Visible) { // Draw check box if this item is visible Rectangle rBox=new Rectangle(m_Rect.Left,m_Rect.Top,m_Rect.Height,m_Rect.Height); if (EffectiveStyle != eDotNetBarStyle.Office2000) rBox.Inflate(-1,-1); BarFunctions.DrawMenuCheckBox(pa, rBox, EffectiveStyle, m_MouseOver); } } if (this.Focused && (this.GetDesignMode() || m_Control == null && this.DesignMode)) { r = this.DisplayRectangle; r.Inflate(-1, -1); DesignTime.DrawDesignTimeSelection(g, r, pa.Colors.ItemDesignTimeBorder); } } /// /// IBlock member implementation /// [Browsable(false), DevCoBrowsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)] public override System.Drawing.Rectangle Bounds { get { return base.Bounds; } set { if (base.Bounds != value) { bool topLocationChanged = base.Bounds.Top != value.Top; bool leftLocationChanged = base.Bounds.Left != value.Left; base.Bounds = value; if (topLocationChanged || leftLocationChanged) UpdateControlLocation(); } } } private bool _ControlLocationUpdatePending = false; private void UpdateControlLocation() { if (m_Control == null) return; if (this.IsLayoutPassInProgress) { _ControlLocationUpdatePending = true; return; } Rectangle r = this.DisplayRectangle; r.Inflate(-2, -2); m_Control.Location = r.Location; _ControlLocationUpdatePending = false; } /// /// Overridden. Recalculates the size of the item. /// public override void RecalcSize() { if(this.SuspendLayout) return; bool bOnMenu=this.IsOnMenu; if(m_Control==null && !this.DesignMode) InitControl(); // Default Height if(this.Parent!=null && this.Parent is ImageItem) m_Rect.Height=((ImageItem)this.Parent).SubItemsImageSize.Height+4; else m_Rect.Height=this.SubItemsImageSize.Height+4; if (EffectiveStyle == eDotNetBarStyle.OfficeXP || EffectiveStyle == eDotNetBarStyle.Office2003 || EffectiveStyle == eDotNetBarStyle.VS2005) { if(m_Control!=null && m_Rect.Height<(m_Control.Height+2)) m_Rect.Height=m_Control.Height+2; } else { if(m_Control!=null && m_Rect.Height<(m_Control.Height+2)) m_Rect.Height=m_Control.Height+2; } // Default width if(m_Control!=null) { if (this.Stretch) m_Rect.Width = 32; else { m_Rect.Width = m_Control.Width + 4; } } else m_Rect.Width=64+4; // Calculate Item Height if(m_Control==null) { string text=m_Text; if(text=="") text="Container"; System.Windows.Forms.Control objCtrl=this.ContainerControl as System.Windows.Forms.Control; if(objCtrl!=null && IsHandleValid(objCtrl)) { Graphics g=BarFunctions.CreateGraphics(objCtrl); try { Size textSize = TextDrawing.MeasureString(g, text, GetFont(), 0, GetStringFormat()); if (textSize.Height > this.SubItemsImageSize.Height && textSize.Height > m_Rect.Height) m_Rect.Height = (int)textSize.Height + 4; m_Rect.Width = (int)textSize.Width + 8; } finally { g.Dispose(); } } } Size objImageSize=GetMaxImageSize(); if (this.IsOnMenu && EffectiveStyle != eDotNetBarStyle.Office2000 && !this.Stretch && !(this.Parent is ItemContainer)) { // THis is side bar that will need to be drawn for DotNet style m_Rect.Width+=(objImageSize.Width+7); } if(this.IsOnCustomizeMenu) m_Rect.Width+=(objImageSize.Height+2); // Always call base implementation to reset resize flag base.RecalcSize(); } /// /// Called when size of the item is changed externally. /// protected override void OnExternalSizeChange() { base.OnExternalSizeChange(); if(m_AllowItemResize) NeedRecalcSize=true; } protected internal override void OnContainerChanged(object objOldContainer) { base.OnContainerChanged(objOldContainer); if(m_Control!=null) { System.Windows.Forms.Control objCtrl=this.ContainerControl as System.Windows.Forms.Control; if(m_Control.Parent!=null && objCtrl!=m_Control.Parent) m_Control.Parent.Controls.Remove(m_Control); if(objCtrl!=null && m_Control.Parent==null) { objCtrl.Controls.Add(m_Control); m_Control.Refresh(); } } } protected internal override void OnVisibleChanged(bool newValue) { if(m_Control!=null && !newValue) m_Control.Visible=newValue; base.OnVisibleChanged(newValue); } protected override void OnDisplayedChanged() { if (!this.Displayed && m_Control != null && !(this.IsOnCustomizeMenu || this.IsOnCustomizeDialog || this.GetDesignMode())) { m_Control.Visible=this.Displayed; } } protected override void OnIsOnCustomizeDialogChanged() { base.OnIsOnCustomizeDialogChanged(); CustomizeChanged(); } protected override void OnDesignModeChanged() { base.OnDesignModeChanged(); CustomizeChanged(); } protected override void OnIsOnCustomizeMenuChanged() { base.OnIsOnCustomizeMenuChanged(); CustomizeChanged(); } private bool m_CustomizeChangedExecuting = false; private void CustomizeChanged() { if(m_Control!=null) { if (m_CustomizeChangedExecuting) return; m_CustomizeChangedExecuting = true; try { if (this.IsOnCustomizeMenu || this.IsOnCustomizeDialog || this.GetDesignMode()) { m_Control.Visible = false; } else { m_Control.Visible = this.Displayed; } } finally { m_CustomizeChangedExecuting = false; } } } private Size GetMaxImageSize() { if(m_Parent!=null) { ImageItem objParentImageItem=m_Parent as ImageItem; if(objParentImageItem!=null) return objParentImageItem.SubItemsImageSize; else return this.ImageSize; } else return this.ImageSize; } private eTextFormat GetStringFormat() { eTextFormat format = eTextFormat.Default; format |= eTextFormat.SingleLine; format |= eTextFormat.EndEllipsis; format |= eTextFormat.VerticalCenter; return format; //StringFormat sfmt=BarFunctions.CreateStringFormat(); //new StringFormat(StringFormat.GenericDefault); //sfmt.HotkeyPrefix=System.Drawing.Text.HotkeyPrefix.Show; ////sfmt.FormatFlags=sfmt.FormatFlags & ~(sfmt.FormatFlags & StringFormatFlags.DisableKerning); //sfmt.FormatFlags=sfmt.FormatFlags | StringFormatFlags.NoWrap; //sfmt.Trimming=StringTrimming.EllipsisCharacter; //sfmt.Alignment=System.Drawing.StringAlignment.Near; //sfmt.LineAlignment=System.Drawing.StringAlignment.Center; //return sfmt; } /// /// Returns the Font object to be used for drawing the item text. /// /// Font object. protected virtual Font GetFont() { System.Windows.Forms.Control objCtrl=this.ContainerControl as System.Windows.Forms.Control; if(objCtrl!=null) return (Font)objCtrl.Font; return SystemFonts.DefaultFont; } protected internal override bool IsAnyOnHandle(IntPtr iHandle) { bool bRet=base.IsAnyOnHandle(iHandle); if(!bRet && m_Control!=null && m_Control.Handle==iHandle) bRet=true; return bRet; } protected override void OnEnabledChanged() { base.OnEnabledChanged(); if(m_Control!=null) m_Control.Enabled=this.Enabled; } [System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] public override void InternalMouseEnter() { base.InternalMouseEnter(); if(!m_MouseOver) { m_MouseOver=true; if(this.IsOnCustomizeMenu && this.Visible) this.Refresh(); } } [System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] public override void InternalMouseLeave() { base.InternalMouseLeave(); if(m_MouseOver) { m_MouseOver=false; if (this.IsOnCustomizeMenu && this.Visible) this.Refresh(); } } /// /// Specifies whether contained control can be automatically resized to fill the item container. /// [System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.Category("Behavior"),System.ComponentModel.Description("Specifies whether contained control can be automatically resized to fill the item container.")] public bool AllowItemResize { get {return m_AllowItemResize;} set {m_AllowItemResize=value;} } [EditorBrowsable(EditorBrowsableState.Never)] public override void OnGotFocus() { base.OnGotFocus(); if(m_Control==null) return; if (m_Control.Focused || this.IsOnCustomizeMenu || this.IsOnCustomizeDialog || this.GetDesignMode()) return; m_Control.Focus(); } [System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] public override bool IsWindowed { get {return true;} } private bool GetDesignMode() { if (this.ContainerControl is IBarDesignerServices && ((IBarDesignerServices)this.ContainerControl).Designer != null) return false; return base.DesignMode; } } public class ControlContainerSerializationEventArgs : EventArgs { private readonly System.Xml.XmlElement xmlstore; public ControlContainerSerializationEventArgs(System.Xml.XmlElement xmlstorage) { this.xmlstore=xmlstorage; } public System.Xml.XmlElement XmlStorage { get{return this.xmlstore;} } } }