3671 lines
130 KiB
C#

using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing.Drawing2D;
using DevComponents.DotNetBar.Rendering;
using System.Drawing.Text;
using System.Collections.Generic;
namespace DevComponents.DotNetBar
{
/// <summary>
/// Summary description for PopupWindow.
/// </summary>
[System.ComponentModel.ToolboxItem(false),System.ComponentModel.DesignTimeVisible(false)]
public class MenuPanel : Control, IDesignTimeProvider, IAccessibilitySupport, IKeyTipsControl, IKeyTipsRenderer
{
#region Private Variables
private struct ExpandButtonData
{
public ExpandButtonData(bool personalizedallvisible,bool showexpandbutton,Rectangle rExpandButton,bool mouseover)
{
this.PersonalizedAllVisible=personalizedallvisible;
this.ShowExpandButton=showexpandbutton;
this.Rect=rExpandButton;
this.MouseOver=mouseover;
}
public bool PersonalizedAllVisible;
public bool ShowExpandButton;
public Rectangle Rect;
public bool MouseOver;
}
const int WM_MOUSEACTIVATE = 0x21;
const int MA_NOACTIVATE = 3;
const int MA_NOACTIVATEANDEAT = 4;
private const int DEFAULT_SIDE_WIDTH=16;
private const int GROUP_SPACINGDOTNET=3;
private const int GROUP_SPACINGOFFICE=9;
protected BaseItem m_ParentItem;
protected BaseItem m_HotSubItem;
protected Point m_ParentItemScreenPos;
private bool m_Hover;
private bool m_Scroll;
private bool m_TopScroll;
private bool m_BottomScroll;
private int m_ScrollTopPosition;
private int m_TopScrollHeight, m_BottomScrollHeight;
private Rectangle m_ClientRect;
private SideBarImage m_SideBarImage;
private Rectangle m_SideRect;
private object m_Owner;
private bool m_IsCustomizeMenu; // This setting is used internaly for menu that is shown as result of clicking on Add or Remove Button to customize the Bar
private System.Drawing.Point m_MouseDownPt;
private ePersonalizedMenus m_PersonalizedMenus=ePersonalizedMenus.Disabled;
const int DEFAULT_EXPAND_BUTTON_HEIGHT=14;
const int OFFICE2003_EXPAND_BUTTON_HEIGHT=18;
private int EXPAND_BUTTON_HEIGHT=DEFAULT_EXPAND_BUTTON_HEIGHT;
private ExpandButtonData m_ExpandButton=new ExpandButtonData(false,false,Rectangle.Empty,false);
private System.Windows.Forms.Timer m_ScrollTimer=null;
private ePopupAnimation m_PopupAnimation=ePopupAnimation.ManagerControlled;
private PopupShadow m_DropShadow=null;
private ColorScheme m_ColorScheme=null;
// Used to eat the mouse move messages when user is using the keyboard to browse through the
// top level menus. The problem was that on each repaint the mouse move was fired even though the
// mouse did not move at all. So if mouse was over an menu item it was not possible to switch to the
// new menu item becouse mouse was "holding" the focus.
private bool m_IgnoreDuplicateMouseMove=false;
private System.Windows.Forms.MouseEventArgs m_LastMouseMoveEvent=null;
internal bool m_AccessibleObjectCreated=false;
private bool m_PopupMenu=true;
private bool m_ShowToolTips=true;
private BaseItem m_DelayedCollapseItem=null;
private bool m_LastExpandedOnHover=true; // was false
private bool m_AntiAlias=false;
private int m_CornerSize = 3;
private BaseItem m_DoDefaultActionItem = null;
internal bool UseWholeScreenForSizeChecking = false;
#endregion
public MenuPanel():base()
{
m_ParentItem=null;
//m_OldContainer=null;
m_HotSubItem=null;
m_Hover=false;
m_Scroll=false;
m_TopScroll=false;
m_BottomScroll=false;
m_ScrollTopPosition=0;
m_TopScrollHeight=0;
m_BottomScrollHeight=0;
m_ClientRect=new Rectangle();
m_SideRect=new Rectangle();
m_SideBarImage=new SideBarImage();
m_IsCustomizeMenu=false;
m_Owner=null;
this.Font=System.Windows.Forms.SystemInformation.MenuFont;//.Clone() as Font;
this.SetStyle(ControlStyles.Selectable,false);
this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
this.SetStyle(ControlStyles.UserPaint,true);
this.SetStyle(ControlStyles.Opaque,true);
this.SetStyle(ControlStyles.ResizeRedraw,true);
this.SetStyle(DisplayHelp.DoubleBufferFlag,true);
this.IsAccessible=true;
this.AccessibleRole=AccessibleRole.MenuPopup;
}
protected override void Dispose(bool disposing)
{
if(this.Parent!=null && this.Parent is PopupContainer)
{
Control parent=this.Parent;
this.Parent.Controls.Remove(this);
parent.Dispose();
parent=null;
}
if(m_AccessibleObjectCreated)
{
PopupMenuAccessibleObject acc=this.AccessibilityObject as PopupMenuAccessibleObject;
if(acc!=null)
acc.GenerateEvent(AccessibleEvents.Destroy);
}
if(m_DropShadow!=null)
{
m_DropShadow.Hide();
m_DropShadow.Dispose();
m_DropShadow=null;
}
this.Font = null;
RestoreContainer();
m_ParentItem=null;
base.Dispose(disposing);
}
protected override void WndProc(ref Message m)
{
if(m.Msg==WM_MOUSEACTIVATE)
{
m.Result=new System.IntPtr(MA_NOACTIVATE);
return;
}
else if (m.Msg == NativeFunctions.WM_USER + 107)
{
if (m_DoDefaultActionItem != null)
{
m_DoDefaultActionItem.DoAccesibleDefaultAction();
m_DoDefaultActionItem = null;
}
}
base.WndProc(ref m);
}
private Rendering.BaseRenderer GetRenderer()
{
Rendering.BaseRenderer r = Rendering.GlobalManager.Renderer;
if (m_ParentItem != null && m_ParentItem.GetContainerControl(false) is IRenderingSupport)
{
Rendering.BaseRenderer renderer = ((IRenderingSupport)m_ParentItem.GetContainerControl(false)).GetRenderer();
if (renderer != null)
r = renderer;
}
return r;
}
#region KeyTips Support
private bool m_ShowKeyTips = false;
private string m_KeyTipsKeysStack = "";
private Font m_KeyTipsFont = null;
private KeyTipsCanvasControl m_KeyTipsCanvas = null;
/// <summary>
/// Gets or sets whether Key Tips (accelerator keys) for items are displayed on top of them.
/// </summary>
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public virtual bool ShowKeyTips
{
get { return m_ShowKeyTips; }
set
{
if (m_ShowKeyTips != value)
{
m_ShowKeyTips = value;
this.OnShowKeyTipsChanged();
}
}
}
string IKeyTipsControl.KeyTipsKeysStack
{
get { return m_KeyTipsKeysStack; }
set
{
m_KeyTipsKeysStack = value;
if (m_KeyTipsCanvas != null)
{
this.Refresh();
//m_KeyTipsCanvas.Update();
}
}
}
/// <summary>
/// Gets or sets the font that is used to display Key Tips (accelerator keys) when they are displayed. Default value is null which means
/// that control Font is used for Key Tips display.
/// </summary>
[Browsable(true), DefaultValue(null), Category("Appearance"), Description("Indicates font that is used to display Key Tips (accelerator keys) when they are displayed.")]
public virtual Font KeyTipsFont
{
get { return m_KeyTipsFont; }
set { m_KeyTipsFont = value; }
}
protected virtual void OnShowKeyTipsChanged()
{
m_KeyTipsKeysStack = "";
if (this.ShowKeyTips)
CreateKeyTipCanvas();
else
DestroyKeyTipCanvas();
}
protected virtual void CreateKeyTipCanvas()
{
if (m_KeyTipsCanvas != null)
{
m_KeyTipsCanvas.BringToFront();
return;
}
m_KeyTipsCanvas = new KeyTipsCanvasControl(this);
m_KeyTipsCanvas.Bounds = new Rectangle(0, 0, this.Width, this.Height);
m_KeyTipsCanvas.Visible = true;
this.Controls.Add(m_KeyTipsCanvas);
m_KeyTipsCanvas.BringToFront();
}
protected virtual void DestroyKeyTipCanvas()
{
if (m_KeyTipsCanvas == null)
return;
m_KeyTipsCanvas.Visible = false;
this.Controls.Remove(m_KeyTipsCanvas);
m_KeyTipsCanvas.Dispose();
m_KeyTipsCanvas = null;
}
void IKeyTipsRenderer.PaintKeyTips(Graphics g)
{
this.PaintKeyTips(g);
}
protected virtual void PaintKeyTips(Graphics g)
{
if (!m_ShowKeyTips || m_ParentItem == null)
return;
KeyTipsRendererEventArgs e = new KeyTipsRendererEventArgs(g, Rectangle.Empty, "", GetKeyTipFont(), null);
Rendering.BaseRenderer renderer = GetRenderer();
PaintContainerKeyTips(m_ParentItem, renderer, e);
}
protected virtual Font GetKeyTipFont()
{
Font font = this.Font;
if (m_KeyTipsFont != null)
font = m_KeyTipsFont;
return font;
}
internal virtual void PaintContainerKeyTips(BaseItem container, Rendering.BaseRenderer renderer, KeyTipsRendererEventArgs e)
{
foreach (BaseItem item in container.SubItems)
{
if (!item.Visible || !item.Displayed)
continue;
if (item.IsContainer)
PaintContainerKeyTips(item, renderer, e);
if (item.AccessKey == Char.MinValue && item.KeyTips == "" || m_KeyTipsKeysStack != "" && !item.KeyTips.StartsWith(m_KeyTipsKeysStack)
|| item.KeyTips == "" && m_KeyTipsKeysStack != "")
continue;
if (item.KeyTips != "")
e.KeyTip = item.KeyTips;
else
e.KeyTip = item.AccessKey.ToString().ToUpper();
e.Bounds = GetKeyTipRectangle(e.Graphics, item, e.Font, e.KeyTip);
e.ReferenceObject = item;
renderer.DrawKeyTips(e);
}
}
protected virtual Rectangle GetKeyTipRectangle(Graphics g, BaseItem item, Font font, string keyTip)
{
Size padding = KeyTipsPainter.KeyTipsPadding;
Size size = TextDrawing.MeasureString(g, keyTip, font);
size.Width += padding.Width;
size.Height += padding.Height;
Rectangle ib = item.DisplayRectangle;
Rectangle r = new Rectangle(ib.X + 16, ib.Bottom - size.Height, size.Width, size.Height);
return r;
}
public virtual bool ProcessMnemonicEx(char charCode)
{
if (ProcessContainerAccessKey(m_ParentItem, charCode))
return true;
return false;
}
#endregion
/// <summary>
/// Gets or sets the item default accessibility action will be performed on.
/// </summary>
BaseItem IAccessibilitySupport.DoDefaultActionItem
{
get { return m_DoDefaultActionItem; }
set { m_DoDefaultActionItem = value; }
}
[DefaultValue(true), Browsable(true), DevCoBrowsable(true)]
public bool PopupMenu
{
get {return m_PopupMenu;}
set {m_PopupMenu=value;}
}
// Closes the popup menu.
public void Close()
{
if (m_AccessibleObjectCreated)
{
MenuPanel.PopupMenuAccessibleObject acc = this.AccessibilityObject as PopupMenuAccessibleObject;
if (acc != null)
{
if (m_ParentItem != null && m_ParentItem.IsOnMenuBar)
acc.GenerateEvent(AccessibleEvents.SystemMenuEnd);
acc.GenerateEvent(AccessibleEvents.SystemMenuPopupEnd);
}
}
if (m_ParentItem != null)
{
Control c = m_ParentItem.ContainerControl as Control;
if (c != null)
c.MouseWheel -= ParentControlMouseWheel;
}
SetFocusItem(null);
Hide();
}
protected override AccessibleObject CreateAccessibilityInstance()
{
m_AccessibleObjectCreated=true;
return new PopupMenuAccessibleObject(this);
}
private void SetupAccessibility()
{
if(m_ParentItem!=null && m_ParentItem.Text!="")
this.AccessibleName=m_ParentItem.Text;
else
this.AccessibleName="DotNetBar Popup Menu";
this.AccessibleDescription=""; //this.AccessibleName+" ("+this.Name+")";
this.AccessibleRole=AccessibleRole.MenuPopup;
}
internal ItemPaintArgs GetItemPaintArgs(Graphics g)
{
ItemPaintArgs pa;
if (m_ColorScheme == null)
pa = new ItemPaintArgs(m_Owner as IOwner, this, g, new ColorScheme(g));
else
pa = new ItemPaintArgs(m_Owner as IOwner, this, g, m_ColorScheme);
pa.Renderer = GetRenderer();
if (m_ParentItem.DesignMode)
{
ISite site = this.GetSite();
if (site != null && site.DesignMode)
pa.DesignerSelection = true;
}
return pa;
}
protected override void OnPaint(PaintEventArgs e)
{
if(m_ParentItem!=null)
{
ItemPaintArgs pa = GetItemPaintArgs(e.Graphics);
pa.PaintEventArgs = e;
pa.ClipRectangle = e.ClipRectangle;
SmoothingMode sm = e.Graphics.SmoothingMode;
TextRenderingHint th = e.Graphics.TextRenderingHint;
if(m_AntiAlias)
{
e.Graphics.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
e.Graphics.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint;
}
if (m_ParentItem.EffectiveStyle == eDotNetBarStyle.Office2000)
PaintOffice(pa);
else
PaintDotNet(pa);
if (m_ParentItem is ApplicationButton)
{
((ApplicationButton)m_ParentItem).OnMenuPaint(pa);
}
else if (m_ParentItem is DevComponents.DotNetBar.Metro.MetroAppButton)
{
((DevComponents.DotNetBar.Metro.MetroAppButton)m_ParentItem).OnMenuPaint(pa);
}
e.Graphics.SmoothingMode = sm;
e.Graphics.TextRenderingHint = th;
}
}
#region InternalMenuColors
private class InternalMenuColors
{
public Rendering.LinearGradientColorTable Background = new Rendering.LinearGradientColorTable();
public Rendering.LinearGradientColorTable Side = new Rendering.LinearGradientColorTable();
public Rendering.LinearGradientColorTable SideUnused = new Rendering.LinearGradientColorTable();
public Rendering.LinearGradientColorTable Border = new Rendering.LinearGradientColorTable();
public Rendering.LinearGradientColorTable SideBorder = new Rendering.LinearGradientColorTable();
public Rendering.LinearGradientColorTable SideBorderLight = new Rendering.LinearGradientColorTable();
}
private InternalMenuColors GetMenuColors(ItemPaintArgs pa)
{
InternalMenuColors colors = new InternalMenuColors();
if (m_ParentItem != null && BarFunctions.IsOffice2007Style(m_ParentItem.EffectiveStyle) && pa.Renderer is Rendering.Office2007Renderer)
{
Rendering.Office2007MenuColorTable ct = ((Rendering.Office2007Renderer)pa.Renderer).ColorTable.Menu;
colors.Background = ct.Background;
colors.Border = ct.Border;
colors.Side = ct.Side;
colors.SideBorder = ct.SideBorder;
colors.SideBorderLight = ct.SideBorderLight;
colors.SideUnused = ct.SideUnused;
}
else
{
colors.Background.Start = pa.Colors.MenuBackground;
colors.Background.End = pa.Colors.MenuBackground2;
colors.Background.GradientAngle = pa.Colors.MenuBackgroundGradientAngle;
colors.Side.Start = pa.Colors.MenuSide;
colors.Side.End = pa.Colors.MenuSide2;
colors.Side.GradientAngle = pa.Colors.MenuSideGradientAngle;
colors.SideUnused.Start = pa.Colors.MenuUnusedSide;
colors.SideUnused.End = pa.Colors.MenuUnusedSide2;
colors.SideUnused.GradientAngle = pa.Colors.MenuUnusedSideGradientAngle;
colors.Border.Start = pa.Colors.MenuBorder;
colors.SideBorder.Start = pa.Colors.ItemSeparator;
colors.SideBorderLight.Start = pa.Colors.ItemSeparatorShade;
}
return colors;
}
#endregion
private bool IsContainerMenu
{
get
{
if (m_ParentItem != null && m_ParentItem.SubItems.Count == 1 && m_ParentItem.SubItems[0] is ItemContainer)
return true;
return false;
}
}
protected void PaintDotNet(ItemPaintArgs pa)
{
Graphics g = pa.Graphics;
if (this.DisplayShadow && !this.AlphaShadow)
SetupRegion();
InternalMenuColors menuColors = this.GetMenuColors(pa);
DisplayHelp.FillRectangle(g, this.ClientRectangle, menuColors.Background);
PaintSideBar(pa);
//Pen p=new Pen(pa.Colors.MenuBorder,1);
if (m_ParentItem != null)
{
Rectangle borderRect = this.ClientRectangle;
if (this.DisplayShadow && !this.AlphaShadow)
borderRect = new Rectangle(0, 0, this.ClientSize.Width - 2, this.ClientSize.Height - 2);
eDotNetBarStyle effectiveStyle = m_ParentItem.EffectiveStyle;
if (BarFunctions.IsOffice2007Style(effectiveStyle) && (!StyleManager.IsMetro(effectiveStyle) || StyleManager.IsVisualStudio2012(StyleManager.Style)))
{
if (this.Region != null)
{
DisplayHelp.DrawRoundedRectangle(g, menuColors.Border.Start, borderRect, m_CornerSize);
Rectangle borderInset = borderRect;
borderInset.Inflate(-1, -1);
Color c = ControlPaint.LightLight(menuColors.Background.Start);
if (IsContainerMenu)
{
c = Color.Empty;
GraphicsPath path = DisplayHelp.GetRoundedRectanglePath(borderInset, m_CornerSize);
Region reg = new Region(path);
path.Widen(SystemPens.Control);
reg.Union(path);
path.Dispose();
path = null;
g.Clip = reg;
}
if (!c.IsEmpty)
{
using (Pen pen = new Pen(c))
DisplayHelp.DrawRoundedRectangle(g, pen, borderInset, m_CornerSize);
}
}
else
{
DisplayHelp.DrawRectangle(g, menuColors.Border.Start, borderRect);
}
}
else
DisplayHelp.DrawGradientRectangle(g, borderRect, menuColors.Border, 1);
// Shadow
if (this.DisplayShadow && !this.AlphaShadow && m_ParentItem != null && !BarFunctions.IsOffice2007Style(effectiveStyle))
{
using (Pen p = new Pen(SystemColors.ControlDark, 2))
{
Point[] pt = new Point[3];
pt[0].X = 2;
pt[0].Y = this.ClientSize.Height - 1;
pt[1].X = this.ClientSize.Width - 1;
pt[1].Y = this.ClientSize.Height - 1;
pt[2].X = this.ClientSize.Width - 1;
pt[2].Y = 2;
g.DrawLines(p, pt);
}
}
if ((!StyleManager.IsMetro(effectiveStyle) || StyleManager.IsVisualStudio2012(StyleManager.Style)) && ((!BarFunctions.IsOffice2007Style(effectiveStyle) || effectiveStyle == eDotNetBarStyle.Office2010 || effectiveStyle == eDotNetBarStyle.Metro) && m_ParentItem is ButtonItem && m_ParentItem.Displayed && m_ParentItem.Visible && m_ParentItem.Orientation == eOrientation.Horizontal && !(m_ParentItem.ContainerControl is ContextMenuBar)))
{
// Determine where to draw the line based on parent position
if (m_PopupMenu && this.Parent != null && m_ParentItemScreenPos.Y < this.Parent.Location.Y)
{
Point p1 = new Point((m_ParentItemScreenPos.X - this.Parent.Location.X) + 1, 0);
Point p2 = new Point(p1.X + m_ParentItem.WidthInternal - (pa.Colors.ItemExpandedShadow.IsEmpty ? 3 : 5), 0);
using (Pen pen = new Pen(pa.Colors.ItemExpandedBackground, 1))
g.DrawLine(pen, p1, p2);
}
}
// If menu scrolls paint side bars
if (m_Scroll)
{
BaseItem objItem = m_ParentItem.SubItems[0];
if (m_TopScroll)
{
ImageItem objImageItem = m_ParentItem as ImageItem;
if (objImageItem != null)
{
Rectangle sideRect = new Rectangle(m_ClientRect.Left, m_ClientRect.Top, objImageItem.SubItemsImageSize.Width + 7, m_TopScrollHeight);
DisplayHelp.FillRectangle(g, sideRect, menuColors.Side);
if (BarFunctions.IsOffice2007Style(effectiveStyle))
PaintMenuItemSide(pa, sideRect, menuColors);
}
else
{
Rectangle sideRect = new Rectangle(m_ClientRect.Left, m_ClientRect.Top, DEFAULT_SIDE_WIDTH + 7, m_TopScrollHeight);
DisplayHelp.FillRectangle(g, sideRect, menuColors.Side);
if (BarFunctions.IsOffice2007Style(effectiveStyle))
PaintMenuItemSide(pa, sideRect, menuColors);
}
}
if (m_BottomScroll)
{
ImageItem objImageItem = m_ParentItem as ImageItem;
if (objImageItem != null)
{
Rectangle sideRect = new Rectangle(m_ClientRect.Left, m_ClientRect.Bottom - m_BottomScrollHeight - 1, objImageItem.SubItemsImageSize.Width + 7, m_BottomScrollHeight);
DisplayHelp.FillRectangle(g, sideRect, menuColors.Side);
if (BarFunctions.IsOffice2007Style(effectiveStyle))
PaintMenuItemSide(pa, sideRect, menuColors);
}
else
{
Rectangle sideRect = new Rectangle(m_ClientRect.Left, m_ClientRect.Bottom - m_BottomScrollHeight - 1, DEFAULT_SIDE_WIDTH + 7, m_BottomScrollHeight);
DisplayHelp.FillRectangle(g, sideRect, menuColors.Side);
if (BarFunctions.IsOffice2007Style(effectiveStyle))
PaintMenuItemSide(pa, sideRect, menuColors);
}
}
objItem = null;
}
PaintItems(pa, menuColors);
}
else
DisplayHelp.DrawGradientRectangle(g, this.ClientRectangle, menuColors.Border, 1);
}
protected void PaintOffice(ItemPaintArgs pa)
{
using(SolidBrush brush=new SolidBrush(SystemColors.Control))
pa.Graphics.FillRectangle(brush,this.DisplayRectangle);
//pa.Graphics.Clear(SystemColors.Control);
PaintSideBar(pa);
System.Windows.Forms.ControlPaint.DrawBorder3D(pa.Graphics,0,0,this.ClientSize.Width,this.ClientSize.Height,System.Windows.Forms.Border3DStyle.Raised);
if(m_ParentItem!=null)
PaintItems(pa, GetMenuColors(pa));
}
private bool DoPaintSide(BaseItem item)
{
if (item is LabelItem || item is ItemContainer)
return false;
return true;
}
private void PaintItems(ItemPaintArgs pa, InternalMenuColors menuColors)
{
Graphics g=pa.Graphics;
bool rightToLeft = (this.RightToLeft == RightToLeft.Yes);
// Draw all contained items
if(m_ParentItem!=null && m_ParentItem!=null)
{
// Special case handling when menus exceed the size of window
Point[] p;
Rectangle clipRect=new Rectangle((int)g.ClipBounds.X,(int)g.ClipBounds.Y,(int)g.ClipBounds.Width,(int)g.ClipBounds.Height);
if(m_Scroll)
{
if(m_TopScroll)
{
p=new Point[3];
p[0].X=m_ClientRect.Left+(m_ClientRect.Width-8)/2;
p[0].Y=m_ClientRect.Top+8;
p[1].X=p[0].X+8;
p[1].Y=p[0].Y;
p[2].X=p[0].X+4;
p[2].Y=p[0].Y-5;
g.FillPolygon(SystemBrushes.ControlText,p);
}
BaseItem objTmp;
ImageItem objParentImageItem=m_ParentItem as ImageItem;
int iSideWidth=DEFAULT_SIDE_WIDTH;
if(objParentImageItem!=null)
iSideWidth=objParentImageItem.SubItemsImageSize.Width;
objParentImageItem=null;
bool previousContainerItem = false;
for(int i=m_ScrollTopPosition;i<m_ParentItem.SubItems.Count;i++)
{
objTmp=m_ParentItem.SubItems[i];
if(!clipRect.IntersectsWith(objTmp.DisplayRectangle))
continue;
if(objTmp.Visible || m_IsCustomizeMenu)
{
if(objTmp.Displayed)
{
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.Default;
if(objTmp.BeginGroup && objTmp.TopInternal>ClientMarginTop) // Exclude first element
{
if (objTmp.EffectiveStyle == eDotNetBarStyle.Office2000)
{
if(m_IsCustomizeMenu)
System.Windows.Forms.ControlPaint.DrawBorder3D(g,objTmp.HeightInternal+Dpi.Height2+objTmp.LeftInternal+Dpi.Width13,objTmp.TopInternal-Dpi.Height5,objTmp.WidthInternal-Dpi.Width26-objTmp.HeightInternal-Dpi.Height2,Dpi.Height2,System.Windows.Forms.Border3DStyle.Etched,System.Windows.Forms.Border3DSide.Top);
else
System.Windows.Forms.ControlPaint.DrawBorder3D(g, objTmp.LeftInternal + Dpi.Width13, objTmp.TopInternal - Dpi.Height5, objTmp.WidthInternal - Dpi.Width26, Dpi.Width2, System.Windows.Forms.Border3DStyle.Etched, System.Windows.Forms.Border3DSide.Top);
}
else
{
if(m_IsCustomizeMenu)
{
Rectangle sideRect = new Rectangle(objTmp.LeftInternal, objTmp.TopInternal - Dpi.Height3, objTmp.HeightInternal + Dpi.Height2 + iSideWidth + Dpi.Width7, Dpi.Height3);
sideRect.Inflate(0, Dpi.Height1);
DisplayHelp.FillRectangle(g, sideRect, menuColors.Side.Start, menuColors.Side.End, menuColors.Side.GradientAngle);
if (BarFunctions.IsOffice2007Style(objTmp.EffectiveStyle))
PaintMenuItemSide(pa, sideRect, menuColors);
DisplayHelp.DrawLine(g, objTmp.LeftInternal + iSideWidth + Dpi.Width8 + Dpi.Width7 + objTmp.HeightInternal + Dpi.Width2, objTmp.TopInternal - Dpi.Height2, objTmp.DisplayRectangle.Right - Dpi.Width1, objTmp.TopInternal - Dpi.Height2,
menuColors.SideBorder.Start, Dpi.Width1);
if (BarFunctions.IsOffice2007Style(objTmp.EffectiveStyle))
DisplayHelp.DrawLine(g, objTmp.LeftInternal + iSideWidth + Dpi.Width8 + Dpi.Width7 + objTmp.HeightInternal + Dpi.Width2, objTmp.TopInternal - Dpi.Height1, objTmp.DisplayRectangle.Right - Dpi.Width1, objTmp.TopInternal - Dpi.Height1, menuColors.SideBorderLight.Start, Dpi.Width1);
}
else
{
bool paintSide = DoPaintSide(objTmp);
bool itemOnlySeparator = paintSide;
if(paintSide)
{
Rectangle sideRect = new Rectangle(objTmp.LeftInternal, objTmp.TopInternal - Dpi.Width3, iSideWidth + Dpi.Width7, Dpi.Height3);
sideRect.Inflate(0, Dpi.Height1);
// Paint side bar
if (objTmp is IPersonalizedMenuItem && ((IPersonalizedMenuItem)objTmp).MenuVisibility == eMenuVisibility.VisibleIfRecentlyUsed && !((IPersonalizedMenuItem)objTmp).RecentlyUsed)
DisplayHelp.FillRectangle(g, sideRect, menuColors.SideUnused);
else
DisplayHelp.FillRectangle(g, sideRect, menuColors.Side);
if (BarFunctions.IsOffice2007Style(objTmp.EffectiveStyle))
PaintMenuItemSide(pa, sideRect, menuColors);
}
if (itemOnlySeparator && previousContainerItem)
itemOnlySeparator = false;
DisplayHelp.DrawLine(g, objTmp.LeftInternal + (itemOnlySeparator ? (iSideWidth + Dpi.Width8 + Dpi.Width7) : 0), objTmp.TopInternal - Dpi.Height2, objTmp.DisplayRectangle.Right - Dpi.Width1, objTmp.TopInternal - Dpi.Height2, menuColors.SideBorder.Start, Dpi.Width1);
if (BarFunctions.IsOffice2007Style(objTmp.EffectiveStyle))
DisplayHelp.DrawLine(g, objTmp.LeftInternal + (itemOnlySeparator ? (iSideWidth + Dpi.Width8 + Dpi.Width7) : 0), objTmp.TopInternal - Dpi.Height1, objTmp.DisplayRectangle.Right - Dpi.Width1, objTmp.TopInternal - Dpi.Height1, menuColors.SideBorderLight.Start, Dpi.Width1);
}
}
}
g.SmoothingMode = sm;
objTmp.Paint(pa);
previousContainerItem = (objTmp.IsContainer);
}
}
}
if(m_BottomScroll)
{
// Draw down button
p=new Point[3];
p[0].X=m_ClientRect.Left+(m_ClientRect.Width-8)/2;
p[0].Y=m_ClientRect.Bottom-8;
p[1].X=p[0].X+8;
p[1].Y=p[0].Y;
p[2].X=p[0].X+4;
p[2].Y=p[0].Y+4;
g.FillPolygon(SystemBrushes.ControlText,p);
}
}
else
{
// This is very simple...
ImageItem objParentImageItem=m_ParentItem as ImageItem;
int iSideBarWidth=Dpi.Width(DEFAULT_SIDE_WIDTH);
if(objParentImageItem!=null)
iSideBarWidth=objParentImageItem.SubItemsImageSize.Width;
objParentImageItem=null;
bool bFirst=true;
bool previousContainerItem = false;
foreach(BaseItem objTmp in m_ParentItem.SubItems)
{
if(!clipRect.IntersectsWith(objTmp.DisplayRectangle))
continue;
if(objTmp.Visible && objTmp.Displayed || m_IsCustomizeMenu)
{
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.Default;
if(objTmp.BeginGroup && !bFirst)
{
if (objTmp.EffectiveStyle == eDotNetBarStyle.Office2000)
{
if(m_IsCustomizeMenu)
System.Windows.Forms.ControlPaint.DrawBorder3D(g,objTmp.HeightInternal+2+objTmp.LeftInternal+13,objTmp.TopInternal-5,objTmp.WidthInternal-26-objTmp.HeightInternal-2,2,System.Windows.Forms.Border3DStyle.Etched,System.Windows.Forms.Border3DSide.Top);
else
System.Windows.Forms.ControlPaint.DrawBorder3D(g,objTmp.LeftInternal+13,objTmp.TopInternal-5,objTmp.WidthInternal-26,2,System.Windows.Forms.Border3DStyle.Etched,System.Windows.Forms.Border3DSide.Top);
}
else
{
if(m_IsCustomizeMenu)
{
Rectangle sideBar = new Rectangle(objTmp.LeftInternal, objTmp.TopInternal - 3, objTmp.HeightInternal + 2 + iSideBarWidth + 7, 3);
sideBar.Inflate(0, 1);
if (rightToLeft)
{
sideBar.Width = iSideBarWidth + 7;
sideBar.X = objTmp.DisplayRectangle.Right - sideBar.Width;
}
// Paint side bar
DisplayHelp.FillRectangle(g, sideBar, menuColors.Side);
if (BarFunctions.IsOffice2007Style(objTmp.EffectiveStyle))
PaintMenuItemSide(pa, sideBar, menuColors);
if (rightToLeft)
{
DisplayHelp.DrawLine(g, objTmp.LeftInternal + 1, objTmp.TopInternal - 2, objTmp.DisplayRectangle.Right - (iSideBarWidth + 8 + 7 + objTmp.HeightInternal + 2 + 1), objTmp.TopInternal - 2, menuColors.SideBorder.Start, 1);
if (BarFunctions.IsOffice2007Style(objTmp.EffectiveStyle))
DisplayHelp.DrawLine(g, objTmp.LeftInternal + 1, objTmp.TopInternal - 1, objTmp.DisplayRectangle.Right - (iSideBarWidth + 8 + 7 + objTmp.HeightInternal + 2 + 1), objTmp.TopInternal - 1, menuColors.SideBorderLight.Start,1);
}
else
{
DisplayHelp.DrawLine(g, objTmp.LeftInternal + iSideBarWidth + 8 + 7 + objTmp.HeightInternal + 2, objTmp.TopInternal - 2, objTmp.DisplayRectangle.Right - 1, objTmp.TopInternal - 2, menuColors.SideBorder.Start, 1);
if (BarFunctions.IsOffice2007Style(objTmp.EffectiveStyle))
DisplayHelp.DrawLine(g, objTmp.LeftInternal + iSideBarWidth + 8 + 7 + objTmp.HeightInternal + 2, objTmp.TopInternal - 1, objTmp.DisplayRectangle.Right - 1, objTmp.TopInternal - 1, menuColors.SideBorderLight.Start, 1);
}
}
else
{
Rectangle sideBar = new Rectangle(objTmp.LeftInternal, objTmp.TopInternal - Dpi.Height2, iSideBarWidth + Dpi.Width7, Dpi.Height3);
sideBar.Inflate(0, Dpi.Height2);
if (rightToLeft)
sideBar.X = objTmp.DisplayRectangle.Right - sideBar.Width - Dpi.Width1;
bool paintSide = DoPaintSide(objTmp);
bool itemOnlySeparator = paintSide;
if (itemOnlySeparator && previousContainerItem)
{
paintSide = false;
itemOnlySeparator = false;
}
if (paintSide)
{
// Paint side bar
if (objTmp is IPersonalizedMenuItem && ((IPersonalizedMenuItem)objTmp).MenuVisibility == eMenuVisibility.VisibleIfRecentlyUsed && !((IPersonalizedMenuItem)objTmp).RecentlyUsed)
{
DisplayHelp.FillRectangle(g, sideBar, menuColors.SideUnused);
}
else
{
DisplayHelp.FillRectangle(g, sideBar, menuColors.Side);
}
if (BarFunctions.IsOffice2007Style(objTmp.EffectiveStyle))
PaintMenuItemSide(pa, sideBar, menuColors);
}
if (rightToLeft)
{
DisplayHelp.DrawLine(g, objTmp.LeftInternal + Dpi.Width1, objTmp.TopInternal - Dpi.Height2, objTmp.DisplayRectangle.Right - (itemOnlySeparator ? (iSideBarWidth + Dpi.Width8 + Dpi.Width7 + Dpi.Width1) : 0), objTmp.TopInternal - Dpi.Height2, menuColors.SideBorder.Start, Dpi.Width1);
if (BarFunctions.IsOffice2007Style(objTmp.EffectiveStyle))
DisplayHelp.DrawLine(g, objTmp.LeftInternal + Dpi.Width1, objTmp.TopInternal - Dpi.Height1, objTmp.DisplayRectangle.Right - (itemOnlySeparator ? (iSideBarWidth + Dpi.Width8 + Dpi.Width7 + Dpi.Width1) : 0), objTmp.TopInternal - Dpi.Height1, menuColors.SideBorderLight.Start, Dpi.Width1);
}
else
{
DisplayHelp.DrawLine(g, objTmp.LeftInternal + (itemOnlySeparator ? (iSideBarWidth + Dpi.Width8 + Dpi.Width7) : 0), objTmp.TopInternal - Dpi.Height2, objTmp.DisplayRectangle.Right - Dpi.Width1, objTmp.TopInternal - Dpi.Height2, pa.Colors.ItemSeparator, Dpi.Width1);
if (BarFunctions.IsOffice2007Style(objTmp.EffectiveStyle) && !pa.Colors.ItemSeparatorShade.IsEmpty)
DisplayHelp.DrawLine(g, objTmp.LeftInternal + (itemOnlySeparator ? (iSideBarWidth + Dpi.Width8 + Dpi.Width7) : 0), objTmp.TopInternal - Dpi.Height1, objTmp.DisplayRectangle.Right - Dpi.Width1, objTmp.TopInternal - Dpi.Height1, pa.Colors.ItemSeparatorShade, Dpi.Width1);
}
}
}
}
g.SmoothingMode = sm;
bFirst=false;
objTmp.Paint(pa);
objTmp.Displayed=true;
previousContainerItem = objTmp.IsContainer;
}
}
}
PaintExpandButton(pa, menuColors);
}
}
private void PaintMenuItemSide(ItemPaintArgs pa, Rectangle sideRect, InternalMenuColors menuColors)
{
if (pa.Owner is DotNetBarManager) // Do not paint side lines for DotNetBarManager owned items...
return;
Graphics g = pa.Graphics;
if (pa.RightToLeft)
{
Point p = new Point(sideRect.X, sideRect.Y);
DisplayHelp.DrawLine(g, p.X, p.Y, p.X, p.Y + sideRect.Height, menuColors.SideBorderLight.Start, 1);
p.X++;
DisplayHelp.DrawLine(g, p.X, p.Y, p.X, p.Y + sideRect.Height, menuColors.SideBorder.Start, 1);
}
else
{
Point p = new Point(sideRect.Right - 2, sideRect.Y);
DisplayHelp.DrawLine(g, p.X, p.Y, p.X, p.Y + sideRect.Height, menuColors.SideBorder.Start, 1);
p.X++;
DisplayHelp.DrawLine(g, p.X, p.Y, p.X, p.Y + sideRect.Height, menuColors.SideBorderLight.Start, 1);
}
}
private void RefreshExpandButton()
{
Graphics g=this.CreateGraphics();
try
{
ItemPaintArgs pa;
if (m_ColorScheme == null)
pa = new ItemPaintArgs(m_Owner as IOwner, this, g, new ColorScheme(g));
else
pa = new ItemPaintArgs(m_Owner as IOwner, this, g, m_ColorScheme);
PaintExpandButton(pa, GetMenuColors(pa));
}
finally
{
g.Dispose();
}
}
private bool IsGradientStyle
{
get
{
if (m_ParentItem != null)
{
return m_ParentItem.EffectiveStyle == eDotNetBarStyle.OfficeXP || m_ParentItem.EffectiveStyle == eDotNetBarStyle.Office2003 || m_ParentItem.EffectiveStyle == eDotNetBarStyle.VS2005 || BarFunctions.IsOffice2007Style(m_ParentItem.EffectiveStyle);
}
return true;
}
}
private void PaintExpandButton(ItemPaintArgs pa, InternalMenuColors menuColors)
{
if(!m_ExpandButton.ShowExpandButton || m_ParentItem==null)
return;
Graphics g=pa.Graphics;
ImageItem objParentImageItem=m_ParentItem as ImageItem;
int iSideWidth=DEFAULT_SIDE_WIDTH;
if(objParentImageItem!=null && objParentImageItem.SubItemsImageSize.Width>iSideWidth)
iSideWidth=objParentImageItem.SubItemsImageSize.Width;
iSideWidth+=7;
objParentImageItem=null;
if (IsGradientStyle)
{
if(m_ExpandButton.MouseOver)
{
Rectangle r = m_ExpandButton.Rect;
DisplayHelp.FillRectangle(g, r, pa.Colors.MenuBackground, Color.Empty);
r.Inflate(-1,0);
if(Control.MouseButtons==MouseButtons.Left)
{
DisplayHelp.FillRectangle(g, r, pa.Colors.ItemPressedBackground, pa.Colors.ItemPressedBackground2, pa.Colors.ItemPressedBackgroundGradientAngle);
}
else
{
DisplayHelp.FillRectangle(g, r, pa.Colors.ItemHotBackground, pa.Colors.ItemHotBackground2, pa.Colors.ItemHotBackgroundGradientAngle);
}
NativeFunctions.DrawRectangle(g,SystemPens.Highlight,r);
}
else
{
Rectangle r=new Rectangle(m_ExpandButton.Rect.Left+iSideWidth,m_ExpandButton.Rect.Top,m_ExpandButton.Rect.Width-iSideWidth,m_ExpandButton.Rect.Height);
DisplayHelp.FillRectangle(g, r, pa.Colors.MenuBackground, Color.Empty);
Rectangle sideRect = new Rectangle(m_ExpandButton.Rect.Left, m_ExpandButton.Rect.Top, iSideWidth, m_ExpandButton.Rect.Height);
DisplayHelp.FillRectangle(g, sideRect, pa.Colors.MenuSide, pa.Colors.MenuSide2, pa.Colors.MenuSideGradientAngle);
if (m_ParentItem != null && BarFunctions.IsOffice2007Style(m_ParentItem.EffectiveStyle))
PaintMenuItemSide(pa, sideRect, menuColors);
}
if (m_ParentItem.EffectiveStyle == eDotNetBarStyle.Office2003 || m_ParentItem.EffectiveStyle == eDotNetBarStyle.VS2005 || BarFunctions.IsOffice2007Style(m_ParentItem.EffectiveStyle))
{
System.Drawing.Drawing2D.GraphicsPath path=new System.Drawing.Drawing2D.GraphicsPath();
Point pTopLeft=new Point(m_ExpandButton.Rect.X+(m_ExpandButton.Rect.Width-16)/2,m_ExpandButton.Rect.Y+(m_ExpandButton.Rect.Height-16)/2);
path.AddEllipse(pTopLeft.X,pTopLeft.Y,16,16);
System.Drawing.Drawing2D.PathGradientBrush gb=new System.Drawing.Drawing2D.PathGradientBrush(path);
gb.CenterColor=pa.Colors.MenuSide;
gb.SurroundColors=new Color[]{pa.Colors.MenuSide2};
gb.CenterPoint=new Point(pTopLeft.X+3,pTopLeft.Y+3);
System.Drawing.Drawing2D.SmoothingMode sm=g.SmoothingMode;
g.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.FillEllipse(gb,pTopLeft.X,pTopLeft.Y,16,16);
g.SmoothingMode=sm;
}
}
else if (m_ParentItem.EffectiveStyle == eDotNetBarStyle.Office2000)
{
if(m_ExpandButton.MouseOver)
{
//g.FillRectangle(new SolidBrush(g.GetNearestColor(ControlPaint.Light(SystemColors.Control))),m_ExpandButton.Rect);
g.FillRectangle(new SolidBrush(ColorFunctions.RecentlyUsedOfficeBackColor()),m_ExpandButton.Rect);
if(Control.MouseButtons==MouseButtons.Left)
ControlPaint.DrawBorder(g,m_ExpandButton.Rect,SystemColors.Control,ButtonBorderStyle.Inset);
else
ControlPaint.DrawBorder3D(g,m_ExpandButton.Rect,Border3DStyle.RaisedInner,(Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom));
//NativeFunctions.DrawRectangle(g,SystemPens.Highlight,m_ExpandButton.Rect);
}
else
{
g.FillRectangle(SystemBrushes.Control,m_ExpandButton.Rect);
}
}
Point[] p=new Point[3];
p[0].X=m_ExpandButton.Rect.Left+(m_ExpandButton.Rect.Width-4)/2;
if (m_ParentItem.EffectiveStyle == eDotNetBarStyle.Office2003 || m_ParentItem.EffectiveStyle == eDotNetBarStyle.VS2005 || BarFunctions.IsOffice2007Style(m_ParentItem.EffectiveStyle))
p[0].Y=m_ExpandButton.Rect.Top+(m_ExpandButton.Rect.Height-7)/2;
else
p[0].Y=m_ExpandButton.Rect.Top+3;
p[1].X=p[0].X+2;
p[1].Y=p[0].Y+2;
p[2].X=p[0].X+4;
p[2].Y=p[0].Y;
g.DrawLines(SystemPens.ControlText,p);
p[0].Y+=1;
p[1].Y+=1;
p[2].Y+=1;
g.DrawLines(SystemPens.ControlText,p);
p[0].Y+=3;
p[1].Y+=3;
p[2].Y+=3;
g.DrawLines(SystemPens.ControlText,p);
p[0].Y+=1;
p[1].Y+=1;
p[2].Y+=1;
g.DrawLines(SystemPens.ControlText,p);
}
private void PaintSideBar(ItemPaintArgs pa)
{
Graphics g=pa.Graphics;
if(m_SideBarImage.Picture==null)
return;
if(!m_SideBarImage.GradientColor1.IsEmpty && !m_SideBarImage.GradientColor2.IsEmpty)
{
PointF[] p=new PointF[2];
p[0].X=m_SideRect.Left;
p[0].Y=m_SideRect.Top;
p[1].X=m_SideRect.Left;
p[1].Y=m_SideRect.Bottom;
System.Drawing.Drawing2D.LinearGradientBrush lgb=BarFunctions.CreateLinearGradientBrush(m_SideRect,m_SideBarImage.GradientColor1,m_SideBarImage.GradientColor2,m_SideBarImage.GradientAngle);
g.FillRectangle(lgb,m_SideRect);
}
else if(!m_SideBarImage.BackColor.Equals(Color.Empty))
g.FillRectangle(new SolidBrush(m_SideBarImage.BackColor),m_SideRect);
if(m_SideBarImage.StretchPicture)
{
g.DrawImage(m_SideBarImage.Picture,m_SideRect);
}
else
{
if(m_SideBarImage.Alignment==eAlignment.Top)
g.DrawImage(m_SideBarImage.Picture,m_SideRect.X,m_SideRect.Top,m_SideRect.Width,m_SideBarImage.Picture.Height);
else if(m_SideBarImage.Alignment==eAlignment.Bottom)
g.DrawImage(m_SideBarImage.Picture,m_SideRect.Left,m_SideRect.Bottom-m_SideBarImage.Picture.Height,m_SideBarImage.Picture.Width,m_SideBarImage.Picture.Height);
else
g.DrawImage(m_SideBarImage.Picture,m_SideRect.Left,m_SideRect.Top+(m_SideRect.Height-m_SideBarImage.Picture.Height)/2,m_SideBarImage.Picture.Width,m_SideBarImage.Picture.Height);
}
}
public BaseItem ParentItem
{
get
{
return m_ParentItem;
}
set
{
RestoreContainer();
m_ParentItem=value;
if(m_ParentItem==null || m_ParentItem.SubItems.Count==0)
return;
if (m_ParentItem.EffectiveStyle == eDotNetBarStyle.Office2003 || m_ParentItem.EffectiveStyle == eDotNetBarStyle.VS2005 || BarFunctions.IsOffice2007Style(m_ParentItem.EffectiveStyle))
EXPAND_BUTTON_HEIGHT=OFFICE2003_EXPAND_BUTTON_HEIGHT;
else
EXPAND_BUTTON_HEIGHT=DEFAULT_EXPAND_BUTTON_HEIGHT;
// Force ContainerChanged event so the items like MdiWindowListItem do not modify collection when we loop through it
if(m_ParentItem.SubItems.Count>0)
m_ParentItem.SubItems[0].ContainerControl=this;
for(int i=1;i<m_ParentItem.SubItems.Count;i++)
m_ParentItem.SubItems[i].ContainerControl=this;
// Get the parent's screen position
System.Windows.Forms.Control objCtrl=m_ParentItem.ContainerControl as System.Windows.Forms.Control;
if (objCtrl != null)
objCtrl.MouseWheel += ParentControlMouseWheel;
if(m_ParentItem.Displayed)
{
if(BaseItem.IsHandleValid(objCtrl))
{
m_ParentItemScreenPos=objCtrl.PointToScreen(new Point(m_ParentItem.LeftInternal,m_ParentItem.TopInternal));
objCtrl=null;
}
}
if(objCtrl is ItemControl)
m_AntiAlias=((ItemControl)objCtrl).AntiAlias;
}
}
void ParentControlMouseWheel(object sender, MouseEventArgs e)
{
if (m_Scroll)
{
if (e.Delta > 0)
{
if (m_TopScroll)
ScrollItemsUp();
}
else
{
if (m_BottomScroll)
ScrollItemsDown();
}
}
}
private void SetupRegion()
{
if(m_ParentItem!=null)
{
Rectangle r=new Rectangle(0,0,this.Width,this.Height);
System.Drawing.Region rgn=new System.Drawing.Region(r);
r.X=this.Width-2;
r.Y=0;
r.Width=2;
r.Height=2;
rgn.Xor(r);
//rgn.Exclude(r);
r.X=0;
r.Y=this.Height-2;
r.Width=2;
r.Height=2;
rgn.Xor(r);
this.Region=rgn;
}
}
public void RecalcLayout()
{
this.RecalcSize();
this.Invalidate(true);
}
public void RecalcSize()
{
if(m_ParentItem!=null)
{
m_ParentItem.IsRightToLeft = (this.RightToLeft == RightToLeft.Yes);
if (m_ParentItem.EffectiveStyle == eDotNetBarStyle.Office2000)
RecalcSizeOffice();
else
RecalcSizeDotNet();
if(this.Visible && m_PopupMenu && this.Parent!=null && this.Parent is PopupContainer)
{
ScreenInformation objScreen=BarFunctions.ScreenFromControl(this.Parent);
if(objScreen!=null)
{
Rectangle screenArea = objScreen.WorkingArea;
if (UseWholeScreenForSizeChecking)
screenArea = objScreen.Bounds;
if(this.Parent.Location.Y+this.Size.Height>screenArea.Bottom)
{
// Reduce the size
m_ClientRect.Height=m_ClientRect.Height-(this.Parent.Location.Y+this.Size.Height-screenArea.Bottom);
this.Height = this.Height - (this.Parent.Location.Y + this.Size.Height - screenArea.Bottom);
if (!m_Scroll)
{
m_Scroll = true;
m_ScrollTopPosition = 0;
}
RepositionItems();
}
else
m_Scroll=false;
}
}
}
if (this.Visible)
{
if (m_ParentItem != null && BarFunctions.IsOffice2007Style(m_ParentItem.EffectiveStyle) && IsRoundRegion)
{
if(this.Parent!=null)
SetRoundRegion(this.Parent);
SetRoundRegion(this);
}
this.Refresh();
}
}
protected override void OnResize(EventArgs e)
{
if(this.Parent is PopupContainer)
{
this.Parent.Size=this.Size;
}
base.OnResize(e);
}
private void RecalcSizeDotNet()
{
m_ExpandButton.ShowExpandButton=false;
if(m_ParentItem==null || m_ParentItem.SubItems.Count==0)
{
this.Height=24;
this.Width=m_ParentItem.WidthInternal+16;
//SetupRegion(); Very bad from AnimateWindow on W2K when control is not shown
return;
}
int iMaxWidth=0, iTop=ClientMarginTop, iLeft=ClientMarginLeft;
int iMaxHeight=0;
bool bAdjustHeight=false;
bool rightToLeft = (this.RightToLeft == RightToLeft.Yes);
// Take in account the side bar picture
if(m_SideBarImage.Picture!=null)
iLeft+=m_SideBarImage.Picture.Width;
foreach(BaseItem objItem in m_ParentItem.SubItems)
{
objItem.RecalcSize();
if(objItem.Visible || m_IsCustomizeMenu)
{
if(!m_ParentItem.DesignMode && m_PersonalizedMenus!=ePersonalizedMenus.Disabled && !m_ExpandButton.PersonalizedAllVisible && !m_IsCustomizeMenu)
{
IPersonalizedMenuItem ipm=objItem as IPersonalizedMenuItem;
if(ipm!=null && ipm.MenuVisibility==eMenuVisibility.VisibleIfRecentlyUsed && !ipm.RecentlyUsed)
{
objItem.Displayed=false;
m_ExpandButton.ShowExpandButton=true;
continue;
}
}
if(objItem.HeightInternal!=iMaxHeight && objItem is ImageItem)
{
if(iMaxHeight>0)
bAdjustHeight=true;
if(objItem.HeightInternal>iMaxHeight)
iMaxHeight=objItem.HeightInternal;
}
if(objItem.BeginGroup && iTop>ClientMarginTop)
iTop+=Dpi.Height(GROUP_SPACINGDOTNET);
objItem.TopInternal=iTop;
objItem.LeftInternal=iLeft;
iTop+=objItem.HeightInternal;
if(objItem.WidthInternal>iMaxWidth)
iMaxWidth=objItem.WidthInternal;
objItem.Displayed=true;
}
else
objItem.Displayed=false;
}
if(iMaxWidth==0)
iMaxWidth=120;
if(bAdjustHeight)
{
iTop=ClientMarginTop;
foreach(BaseItem objItem in m_ParentItem.SubItems)
{
objItem.WidthInternal=iMaxWidth;
if(objItem.Displayed)
{
if(objItem.BeginGroup && iTop>ClientMarginTop)
iTop+=Dpi.Height(GROUP_SPACINGDOTNET);
objItem.TopInternal=iTop;
iTop+=objItem.HeightInternal;
}
//if (objItem.IsContainer && rightToLeft)
// objItem.RecalcSize();
}
}
else
{
// Set each item width to max width
foreach (BaseItem objItem in m_ParentItem.SubItems)
{
objItem.WidthInternal = iMaxWidth;
//if (objItem.IsContainer && rightToLeft)
// objItem.RecalcSize();
}
}
if(m_ExpandButton.ShowExpandButton)
{
m_ExpandButton.Rect=new Rectangle(iLeft,iTop,iMaxWidth,EXPAND_BUTTON_HEIGHT);
iTop+=EXPAND_BUTTON_HEIGHT;
}
m_ClientRect=new Rectangle(iLeft,ClientMarginTop,iMaxWidth,iTop-ClientMarginTop);
if(m_SideBarImage.Picture!=null)
m_SideRect=new Rectangle(iLeft-m_SideBarImage.Picture.Width,ClientMarginTop,m_SideBarImage.Picture.Width,iTop-ClientMarginTop);
this.Size=new Size(iLeft+iMaxWidth+ClientMarginRight,iTop+ClientMarginBottom);
if(this.Height==92)
this.Height=92;
//SetupRegion(); Very bad for AnimateWindow on W2K when control is not shown
}
private void RecalcSizeOffice()
{
m_ExpandButton.ShowExpandButton=false;
if(m_ParentItem==null || m_ParentItem.SubItems.Count==0)
{
this.Height=24;
this.Width=m_ParentItem.WidthInternal+16;
return;
}
int iMaxWidth=0, iTop=ClientMarginTop, iLeft=ClientMarginLeft;
int iMaxHeight=0;
bool bAdjustHeight=false;
// Take in account the side bar picture
if(m_SideBarImage.Picture!=null)
iLeft+=m_SideBarImage.Picture.Width;
foreach(BaseItem objItem in m_ParentItem.SubItems)
{
objItem.RecalcSize();
if(objItem.Visible || m_IsCustomizeMenu)
{
if(!m_ParentItem.DesignMode && m_PersonalizedMenus!=ePersonalizedMenus.Disabled && !m_ExpandButton.PersonalizedAllVisible && !m_IsCustomizeMenu)
{
IPersonalizedMenuItem ipm=objItem as IPersonalizedMenuItem;
if(ipm!=null && ipm.MenuVisibility==eMenuVisibility.VisibleIfRecentlyUsed && !ipm.RecentlyUsed)
{
objItem.Displayed=false;
m_ExpandButton.ShowExpandButton=true;
continue;
}
}
if(objItem.HeightInternal!=iMaxHeight && objItem is ImageItem)
{
if(iMaxHeight>0)
bAdjustHeight=true;
if(objItem.HeightInternal>iMaxHeight)
iMaxHeight=objItem.HeightInternal;
}
if(objItem.BeginGroup && iTop>ClientMarginTop)
iTop+=GROUP_SPACINGOFFICE;
objItem.TopInternal=iTop;
objItem.LeftInternal=iLeft;
iTop+=objItem.HeightInternal;
if(objItem.WidthInternal>iMaxWidth)
iMaxWidth=objItem.WidthInternal;
objItem.Displayed=true;
}
else
objItem.Displayed=false;
}
if(iMaxWidth==0)
iMaxWidth=120;
if(bAdjustHeight)
{
iTop=3;
foreach(BaseItem objItem in m_ParentItem.SubItems)
{
//if (objItem is ImageItem)
// objItem.HeightInternal = iMaxHeight;
objItem.WidthInternal=iMaxWidth;
if(objItem.Displayed)
{
if(objItem.BeginGroup && iTop>ClientMarginTop)
iTop+=GROUP_SPACINGOFFICE;
objItem.TopInternal=iTop;
//iTop+=iMaxHeight;
iTop+=objItem.HeightInternal;
}
}
}
else
{
// Set each item width to max width
foreach(BaseItem objItem in m_ParentItem.SubItems)
objItem.WidthInternal=iMaxWidth;
}
if(m_ExpandButton.ShowExpandButton)
{
m_ExpandButton.Rect=new Rectangle(iLeft,iTop,iMaxWidth,EXPAND_BUTTON_HEIGHT);
iTop+=EXPAND_BUTTON_HEIGHT;
}
m_ClientRect=new Rectangle(iLeft,ClientMarginTop,iMaxWidth,iTop-ClientMarginTop);
if(m_SideBarImage.Picture!=null)
m_SideRect=new Rectangle(iLeft-m_SideBarImage.Picture.Width,ClientMarginTop,m_SideBarImage.Picture.Width,iTop);
this.Size=new Size(iLeft+iMaxWidth+ClientMarginRight,iTop+ClientMarginBottom);
}
private void RestoreContainer()
{
if(m_ParentItem!=null && m_ParentItem.SubItems.Count!=0)
{
foreach(BaseItem objItem in m_ParentItem.SubItems)
{
objItem.ContainerControl=null;
}
int iLastIndex=0;
while(m_ParentItem!=null && iLastIndex<m_ParentItem.SubItems.Count)
{
m_ParentItem.SubItems[iLastIndex].Expanded=false;
iLastIndex++;
}
iLastIndex=0;
while(m_ParentItem!=null && iLastIndex<m_ParentItem.SubItems.Count)
{
m_ParentItem.SubItems[iLastIndex].Displayed=false;
iLastIndex++;
}
}
}
private BaseItem ExpandedItem()
{
if(m_ParentItem!=null && m_ParentItem.SubItems.Count>0)
{
foreach(BaseItem objSub in m_ParentItem.SubItems)
{
if (objSub.Expanded && objSub is PopupItem)
return objSub;
if (objSub.IsContainer)
{
BaseItem exp = objSub.ExpandedItem();
if (exp is PopupItem)
return exp;
}
}
}
return null;
}
protected internal BaseItem FocusedItem()
{
if(m_ParentItem!=null && m_ParentItem.SubItems.Count>0)
{
foreach (BaseItem objSub in m_ParentItem.SubItems)
{
if (objSub.Focused)
{
return objSub;
}
else if (objSub.IsContainer)
{
BaseItem focused = objSub.FocusedItem();
if (focused != null)
return focused;
}
}
}
return null;
}
internal void SetFocusItem(BaseItem objFocus)
{
if(m_ParentItem==null || m_ParentItem.Parent!=null)
return;
BaseItem objItem=FocusedItem();
if(objItem==objFocus)
return;
if(objItem!=null)
objItem.OnLostFocus();
if(objFocus!=null)
objFocus.OnGotFocus();
}
internal void InternalMouseMove(MouseEventArgs e)
{
this.OnMouseMove(e);
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if(m_IgnoreDuplicateMouseMove)
{
if(m_LastMouseMoveEvent==null)
{
m_LastMouseMoveEvent=new System.Windows.Forms.MouseEventArgs(e.Button,e.Clicks,e.X,e.Y,e.Delta);
return;
}
if(m_LastMouseMoveEvent.X!=e.X || m_LastMouseMoveEvent.Y!=e.Y ||
m_LastMouseMoveEvent.Button!=e.Button)
{
m_IgnoreDuplicateMouseMove=false;
m_LastMouseMoveEvent=null;
}
else
return;
}
// Don't forward event if some other item has focus. This is the case for example for
// Text box items or any other item that can receive focus...
//if(!m_ParentItem.DesignMode && m_Owner!=null && m_Owner.GetFocusItem()!=null && m_ParentItem.ContainerControl!=null || this.FocusedItem()!=null && !m_ParentItem.DesignMode)
// return;
if (m_ParentItem != null && m_ParentItem.DesignMode && e.Button == System.Windows.Forms.MouseButtons.Left && (Math.Abs(e.X - m_MouseDownPt.X) >= 2 || Math.Abs(e.Y - m_MouseDownPt.Y) >= 2 || m_DragDropInProgress))
{
BaseItem objFocus=this.FocusedItem();
IOwner owner=m_Owner as IOwner;
ISite site = this.GetSite();
if (site != null && objFocus!=null)
{
DesignTimeMouseMove(e);
}
else
{
if (objFocus != null && owner != null && objFocus.CanCustomize)
owner.StartItemDrag(objFocus);
}
}
if(m_ParentItem==null || m_ParentItem.SubItems.Count==0 || m_ParentItem.DesignMode)
return;
//if (e.Button != MouseButtons.None && m_HotSubItem != null)
//{
// m_HotSubItem.InternalMouseMove(e);
// return;
//}
BaseItem objNew=ItemAtLocation(e.X,e.Y);
BaseItem objExpanded=ExpandedItem();
if(objExpanded!=null && objExpanded is PopupItem)
{
Control ctrlExpanded=((PopupItem)objExpanded).PopupControl;
if(ctrlExpanded!=null)
{
Point pClient=ctrlExpanded.PointToClient(this.PointToScreen(new Point(e.X,e.Y)));
if(ctrlExpanded.ClientRectangle.Contains(pClient))
{
if(ctrlExpanded is MenuPanel)
{
((MenuPanel)ctrlExpanded).InternalMouseMove(new MouseEventArgs(e.Button,e.Clicks,pClient.X,pClient.Y,e.Delta));
return;
}
}
}
}
if (objExpanded != null && objNew != objExpanded)
{
if (objExpanded is PopupItem && ((PopupItem)objExpanded).PopupType != ePopupType.Menu ||
objExpanded != null && m_ParentItem != null && m_ParentItem.SubItems.Count > 0 && m_ParentItem.SubItems[0] is ItemContainer && !(m_ParentItem is ApplicationButton || m_ParentItem is DevComponents.DotNetBar.Metro.MetroAppButton))
{
objExpanded.Expanded = false;
}
else
CollapseItemDelayed(objExpanded);
}
if(m_ExpandButton.ShowExpandButton)
{
if(objNew==null && m_ExpandButton.Rect.Contains(e.X,e.Y) && !m_ExpandButton.MouseOver)
{
m_ExpandButton.MouseOver=true;
RefreshExpandButton();
}
else if(objNew!=null && m_ExpandButton.MouseOver)
{
m_ExpandButton.MouseOver=false;
RefreshExpandButton();
}
}
if (objNew == null && m_HotSubItem is GalleryContainer)
{
GalleryContainer gc = m_HotSubItem as GalleryContainer;
if (!gc.SystemGallery && gc.PopupUsesStandardScrollbars && gc.ScrollBarControl != null && gc.ScrollBarControl.IsMouseDown && e.Button == MouseButtons.Left)
objNew = m_HotSubItem;
}
if(objNew!=m_HotSubItem)
{
if(m_HotSubItem!=null)
{
// Don't leave the hot item if it is exanded and mouse is inside the side bar picture, if we have side bar picture
//if(m_HotSubItem.Expanded && !m_SideRect.IsEmpty && m_SideRect.Contains(e.X,e.Y))
// return;
m_HotSubItem.InternalMouseLeave();
// We need to reset hover thing since it is fired only first time mouse hovers inside the window and we need it for each of our items
if(m_Hover)
{
ResetHover();
m_Hover=false;
}
}
if (objNew != null)
{
objNew.InternalMouseEnter();
objNew.InternalMouseMove(e);
m_HotSubItem = objNew;
}
else
{
m_HotSubItem = null;
}
}
else if(m_HotSubItem!=null)
{
m_HotSubItem.InternalMouseMove(e);
}
// Gallery scrollbar support
if (this.Capture && !this.DisplayRectangle.Contains(e.X, e.Y) && m_ParentItem!=null &&
m_ParentItem.SubItems.Count>0 && m_ParentItem.SubItems[0] is GalleryContainer)
{
if (m_ParentItem.SubItems[0].Visible && m_ParentItem.SubItems[0].Displayed)
m_ParentItem.SubItems[0].InternalMouseMove(e);
}
}
#region Design Time Drag & Drop
private bool m_DragDropInProgress = false;
private int m_InsertPosition=-1;
private bool m_InsertBefore=false;
private IDesignTimeProvider m_DesignTimeProvider=null;
private BaseItem m_DragItem = null;
private IDesignTimeProvider m_DragDropDesignTimeProvider = null;
private ISite GetSite()
{
ISite site = null;
IOwner owner = this.Owner as IOwner;
Control c = null;
if (owner is Control)
{
c = owner as Control;
}
else if (m_ParentItem != null && m_ParentItem.ContainerControl is Control)
{
c = m_ParentItem.ContainerControl as Control;
}
if (c != null)
{
while (site == null && c != null)
{
if (c.Site != null && c.Site.DesignMode)
site = c.Site;
else
c = c.Parent;
}
}
if (site == null && m_ParentItem != null)
{
BaseItem item = m_ParentItem;
while (site == null && item != null)
{
if (item.Site != null && item.Site.DesignMode)
site = item.Site;
else
item = item.Parent;
}
}
return site;
}
private void DesignTimeMouseMove(MouseEventArgs e)
{
if (m_DragDropInProgress)
{
try
{
if (m_DesignTimeProvider != null)
{
m_DesignTimeProvider.DrawReversibleMarker(m_InsertPosition, m_InsertBefore);
m_DesignTimeProvider = null;
}
InsertPosition pos = m_DragDropDesignTimeProvider.GetInsertPosition(Control.MousePosition, m_DragItem);
if (pos != null)
{
if (pos.TargetProvider == null)
{
// Cursor is over drag item
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.No;
}
else
{
pos.TargetProvider.DrawReversibleMarker(pos.Position, pos.Before);
m_InsertPosition = pos.Position;
m_InsertBefore = pos.Before;
m_DesignTimeProvider = pos.TargetProvider;
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Hand;
}
}
else
{
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.No;
}
}
catch
{
m_DesignTimeProvider = null;
}
}
else
{
// Get top level design-time provider
BaseItem item = m_ParentItem;
while (item.Parent is IDesignTimeProvider)
item = item.Parent;
ISite site = GetSite();
if (site != null && item.ContainerControl!=null)
{
IDesignerHost dh = site.GetService(typeof(IDesignerHost)) as IDesignerHost;
if (dh != null)
{
Control c = item.ContainerControl as Control;
if (c is RibbonStrip && c.Site == null && c.Parent is RibbonControl)
c = c.Parent;
IBarItemDesigner designer = dh.GetDesigner(c) as IBarItemDesigner;
if (designer != null)
{
designer.StartExternalDrag(this.FocusedItem());
return;
}
}
}
m_DragDropDesignTimeProvider = (IDesignTimeProvider)item;
m_DragItem = this.FocusedItem();
m_DragDropInProgress = true;
this.Capture = true;
}
}
private void DesignTimeMouseUp(MouseEventArgs e)
{
ISite site = GetSite();
if (site == null)
return;
IComponentChangeService cc = site.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (m_DesignTimeProvider != null)
{
m_DesignTimeProvider.DrawReversibleMarker(m_InsertPosition, m_InsertBefore);
BaseItem objParent = m_DragItem.Parent;
if (objParent != null)
{
if (objParent == (BaseItem)m_DesignTimeProvider && m_InsertPosition > 0)
{
if (objParent.SubItems.IndexOf(m_DragItem) < m_InsertPosition)
m_InsertPosition--;
}
if (cc != null)
cc.OnComponentChanging(objParent, TypeDescriptor.GetProperties(objParent)["SubItems"]);
objParent.SubItems.Remove(m_DragItem);
if (cc != null)
cc.OnComponentChanged(objParent, TypeDescriptor.GetProperties(objParent)["SubItems"], null, null);
Control ctrl = objParent.ContainerControl as Control;
if (ctrl is Bar)
((Bar)ctrl).RecalcLayout();
else if (ctrl is MenuPanel)
((MenuPanel)ctrl).RecalcSize();
}
m_DesignTimeProvider.InsertItemAt(m_DragItem, m_InsertPosition, m_InsertBefore);
m_DesignTimeProvider = null;
}
m_DragDropDesignTimeProvider = null;
m_DragItem = null;
m_DragDropInProgress = false;
this.Capture = false;
}
private void DesignTimeMouseDown(MouseEventArgs e)
{
IOwner owner = this.Owner as IOwner;
BaseItem objNew = ItemAtLocation(e.X, e.Y);
// If parent of the item is GalleryContainer ensure that mouse is not over gallery scroll buttons
if (objNew != null && objNew.Parent is GalleryContainer)
{
GalleryContainer gc = objNew.Parent as GalleryContainer;
if (gc.ScrollHitTest(e.X, e.Y))
objNew = gc;
}
// Ignore system items
if (objNew != null && objNew.SystemItem)
objNew = null;
if (objNew == null)
{
if(e.Button == MouseButtons.Right)
{
ISite site = GetSite();
if (site != null)
{
ISelectionService selection = (ISelectionService)site.GetService(typeof(ISelectionService));
if (selection.PrimarySelection == m_ParentItem)
{
// Show context menu for parent item...
IMenuCommandService service1 = (IMenuCommandService)site.GetService(typeof(IMenuCommandService));
if (service1 != null)
{
service1.ShowContextMenu(new CommandID(new Guid("{74D21312-2AEE-11d1-8BFB-00A0C90F26F7}"), 0x500)/*System.Windows.Forms.Design.MenuCommands.SelectionMenu*/, Control.MousePosition.X, Control.MousePosition.Y);
}
}
}
}
return;
}
BaseItem objExpanded = ExpandedItem();
if (objExpanded != null && m_HotSubItem != objExpanded)
objExpanded.Expanded = false;
if (owner != null)
{
owner.SetFocusItem(objNew);
ISite site = GetSite();
if (site != null)
{
ISelectionService selection = (ISelectionService)site.GetService(typeof(ISelectionService));
if (selection != null)
{
ArrayList arr = new ArrayList(1);
arr.Add(objNew);
#if FRAMEWORK20
selection.SetSelectedComponents(arr, SelectionTypes.Primary);
#else
selection.SetSelectedComponents(arr,SelectionTypes.MouseDown);
#endif
}
if (e.Button == MouseButtons.Right)
{
IMenuCommandService service1 = (IMenuCommandService)site.GetService(typeof(IMenuCommandService));
if (service1 != null)
{
service1.ShowContextMenu(new CommandID(new Guid("{74D21312-2AEE-11d1-8BFB-00A0C90F26F7}"), 0x500)/*System.Windows.Forms.Design.MenuCommands.SelectionMenu*/, Control.MousePosition.X, Control.MousePosition.Y);
}
}
}
}
owner = null;
if (objNew != null)
objNew.InternalMouseDown(e);
}
#endregion
internal void SelectFirstItem()
{
if(m_ParentItem!=null)
{
BaseItem disp=null;
foreach(BaseItem item in m_ParentItem.SubItems)
{
if (item.Displayed && item.GetEnabled())
{
if (item is ItemContainer)
{
if (!((ItemContainer)item).SelectFirstItem())
continue;
}
disp=item;
break;
}
}
if(disp!=null && m_HotSubItem!=disp)
{
if(m_HotSubItem!=null)
{
// Don't leave the hot item if it is exanded and mouse is inside the side bar picture, if we have side bar picture
//if(m_HotSubItem.Expanded && !m_SideRect.IsEmpty && m_SideRect.Contains(e.X,e.Y))
// return;
m_HotSubItem.InternalMouseLeave();
// We need to reset hover thing since it is fired only first time mouse hovers inside the window and we need it for each of our items
if(m_Hover)
{
ResetHover();
m_Hover=false;
}
}
if(disp!=null)
{
if (!(disp is ItemContainer))
{
disp.InternalMouseEnter();
disp.InternalMouseMove(new MouseEventArgs(MouseButtons.None, 0, disp.LeftInternal + 1, disp.TopInternal + 1, 0));
}
m_HotSubItem=disp;
}
}
}
}
private void CollapseItemDelayed(BaseItem item)
{
ResetHover();
if(m_DelayedCollapseItem!=null && m_DelayedCollapseItem!=item)
{
m_DelayedCollapseItem.Expanded=false;
}
if(!m_LastExpandedOnHover)
{
item.Expanded=false;
m_DelayedCollapseItem=null;
m_LastExpandedOnHover=true; // was false
}
else
{
m_DelayedCollapseItem=item;
m_DelayedCollapseItem.InternalMouseLeave();
}
}
internal void InternalMouseHover()
{
if(m_ParentItem!=null && m_ParentItem.DesignMode || m_ParentItem==null)
return;
// Hover delayed collapse of last expanded item
if(m_DelayedCollapseItem!=null)
{
m_DelayedCollapseItem.Expanded=false;
m_DelayedCollapseItem=null;
}
if(m_HotSubItem!=null)
{
bool bWasExpanded=false;
bWasExpanded=m_HotSubItem.Expanded;
m_HotSubItem.InternalMouseHover();
m_Hover=true;
if(!bWasExpanded && m_HotSubItem!=null && m_HotSubItem.Expanded)
m_LastExpandedOnHover=true;
else
m_LastExpandedOnHover=true; // was false
}
else if(m_ExpandButton.ShowExpandButton && m_ExpandButton.MouseOver)
{
if(m_PersonalizedMenus!=ePersonalizedMenus.DisplayOnClick)
{
m_ExpandButton.PersonalizedAllVisible=true;
IOwnerMenuSupport ownersupport=m_Owner as IOwnerMenuSupport;
if(ownersupport!=null)
ownersupport.PersonalizedAllVisible=true;
RecalcSize();
ResetHover();
}
}
else if(m_Scroll)
{
if(m_ScrollTimer==null)
{
CheckScrolling();
ResetHover();
}
}
}
protected override void OnMouseHover(EventArgs e)
{
base.OnMouseHover(e);
InternalMouseHover();
}
protected override void OnMouseLeave(EventArgs e)
{
if(m_ParentItem!=null && m_ParentItem.DesignMode || m_ParentItem==null)
return;
// If we had hot sub item pass the mouse leave message to it...
if(m_HotSubItem!=null) // && !m_HotSubItem.Expanded)
{
// Handle the case when child control of the item gets the mouse
Point mp=this.PointToClient(Control.MousePosition);
if (!m_HotSubItem.DisplayRectangle.Contains(mp))
{
if (!(m_HotSubItem is PopupItem && m_HotSubItem.Expanded))
{
m_HotSubItem.InternalMouseLeave();
m_HotSubItem = null;
}
}
}
else if(m_ExpandButton.ShowExpandButton && m_ExpandButton.MouseOver)
{
m_ExpandButton.MouseOver=false;
RefreshExpandButton();
}
if (m_HotSubItem == null)
{
BaseItem exp = ExpandedItem();
if (exp != null && exp is PopupItem)
{
m_HotSubItem = exp;
m_HotSubItem.InternalMouseEnter();
m_HotSubItem.InternalMouseMove(new MouseEventArgs(MouseButtons.None, 0, m_HotSubItem.DisplayRectangle.X+4, m_HotSubItem.DisplayRectangle.Y+4, 0));
}
}
base.OnMouseLeave(e);
}
protected override void OnMouseDown(MouseEventArgs e)
{
if(m_ParentItem==null)
return;
this.ShowKeyTips = false;
IOwner owner=this.Owner as IOwner;
m_MouseDownPt=new System.Drawing.Point(e.X,e.Y);
if(m_ParentItem.DesignMode)
{
DesignTimeMouseDown(e);
}
if(!this.DesignMode && owner!=null && owner.GetFocusItem()!=null)
{
BaseItem objNew=ItemAtLocation(e.X,e.Y);
if(objNew!=owner.GetFocusItem())
owner.GetFocusItem().ReleaseFocus();
}
if (e.Button == MouseButtons.Right && m_HotSubItem != null && !this.IsCustomizeMenu && owner is IRibbonCustomize && m_ParentItem!=null && m_ParentItem.Name!="syscustomizepopupmenu")
((IRibbonCustomize)owner).ItemRightClick(m_HotSubItem);
if(m_HotSubItem!=null)
m_HotSubItem.InternalMouseDown(e);
else if(m_ExpandButton.ShowExpandButton && m_ExpandButton.MouseOver)
{
RefreshExpandButton();
}
base.OnMouseDown(e);
}
internal void InternalMouseUp(MouseEventArgs e)
{
this.OnMouseUp(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
if (m_DragDropInProgress)
{
DesignTimeMouseUp(e);
}
else
{
if (m_HotSubItem != null)
{
m_HotSubItem.InternalMouseUp(e);
}
else if (m_ExpandButton.ShowExpandButton && m_ExpandButton.MouseOver)
{
if (m_PersonalizedMenus != ePersonalizedMenus.DisplayOnHover && m_ExpandButton.Rect.Contains(e.X, e.Y))
{
ExpandRecentlyUsed();
}
else
RefreshExpandButton();
}
}
base.OnMouseUp(e);
}
internal void ExpandRecentlyUsed()
{
if(m_PersonalizedMenus!=ePersonalizedMenus.DisplayOnHover)
{
m_ExpandButton.PersonalizedAllVisible=true;
IOwnerMenuSupport ownermenu=this.Owner as IOwnerMenuSupport;
if(ownermenu!=null)
ownermenu.PersonalizedAllVisible=true;
RecalcSize();
}
}
protected override void OnClick(EventArgs e)
{
if(m_ParentItem!=null && m_ParentItem.DesignMode || m_ParentItem==null)
return;
if(m_HotSubItem!=null)
{
m_HotSubItem.InternalClick(Control.MouseButtons,Control.MousePosition);
}
else if(m_Scroll)
{
CheckScrolling();
}
base.OnClick(e);
}
protected override void OnDoubleClick(EventArgs e)
{
ISite site = this.GetSite();
if(site!=null && site.DesignMode)
{
ISelectionService selection = (ISelectionService) site.GetService(typeof(ISelectionService));
if(selection!=null)
{
IDesignerHost host=(IDesignerHost) site.GetService(typeof(IDesignerHost));
if(host!=null)
{
IDesigner designer=host.GetDesigner(selection.PrimarySelection as IComponent);
if(designer!=null)
{
designer.DoDefaultAction();
}
}
}
}
if(m_ParentItem!=null && m_ParentItem.DesignMode || m_ParentItem==null)
return;
if(m_HotSubItem!=null)
{
m_HotSubItem.InternalDoubleClick(Control.MouseButtons,Control.MousePosition);
}
base.OnDoubleClick(e);
}
protected override void OnKeyDown(KeyEventArgs e)
{
if(m_ParentItem==null || m_ParentItem.SubItems.Count==0)
{
base.OnKeyDown(e);
return;
}
this.ExKeyDown(e);
base.OnKeyDown(e);
}
private bool CanGetMouseFocus(BaseItem item)
{
if (item is LabelItem)
return false;
return true;
}
internal void ExKeyDown(KeyEventArgs e)
{
if(m_ParentItem==null || m_ParentItem.SubItems.Count==0 || m_ParentItem.DesignMode)
return;
if(m_HotSubItem==null || m_HotSubItem!=null && !m_HotSubItem.Expanded)
{
if(e.KeyCode==Keys.Down)
{
if (m_ParentItem is ItemContainer)
{
m_ParentItem.InternalKeyDown(e);
}
else
{
if (m_HotSubItem is ItemContainer)
m_HotSubItem.InternalKeyDown(e);
if (!e.Handled)
{
int i = 0;
if (m_HotSubItem != null)
{
m_HotSubItem.InternalMouseLeave();
i = m_ParentItem.SubItems.IndexOf(m_HotSubItem) + 1;
if (i == m_ParentItem.SubItems.Count && m_ExpandButton.ShowExpandButton)
{
m_ExpandButton.MouseOver = true;
RefreshExpandButton();
}
else if (i < 0 || i == m_ParentItem.SubItems.Count)
{
i = 0;
}
m_HotSubItem = null;
}
else if (m_ExpandButton.MouseOver)
{
m_ExpandButton.MouseOver = false;
RefreshExpandButton();
i = 0;
}
BaseItem objTmp;
for (int f = i; f < m_ParentItem.SubItems.Count; f++)
{
objTmp = m_ParentItem.SubItems[f];
if (objTmp.Displayed && objTmp.Visible && CanGetMouseFocus(objTmp))
{
m_HotSubItem = objTmp;
m_HotSubItem.InternalMouseEnter();
m_HotSubItem.InternalMouseMove(new MouseEventArgs(MouseButtons.None, 0, m_HotSubItem.LeftInternal + 2, m_HotSubItem.TopInternal + 2, 0));
if (m_HotSubItem.IsContainer)
m_HotSubItem.InternalKeyDown(e);
break;
}
}
if (m_HotSubItem == null && m_ExpandButton.ShowExpandButton && !m_ExpandButton.MouseOver)
{
m_ExpandButton.MouseOver = true;
RefreshExpandButton();
}
}
}
e.Handled=true;
m_IgnoreDuplicateMouseMove=true;
}
else if(e.KeyCode==Keys.Up)
{
if (m_ParentItem is ItemContainer)
{
m_ParentItem.InternalKeyDown(e);
}
else
{
if (m_HotSubItem is ItemContainer)
m_HotSubItem.InternalKeyDown(e);
if (!e.Handled)
{
int i = 0;
if (m_HotSubItem != null)
{
m_HotSubItem.InternalMouseLeave();
i = m_ParentItem.SubItems.IndexOf(m_HotSubItem) - 1;
if (i < 0 && m_ExpandButton.ShowExpandButton)
{
m_ExpandButton.MouseOver = true;
RefreshExpandButton();
}
else if (i < 0)
i = m_ParentItem.SubItems.Count - 1;
m_HotSubItem = null;
}
else if (m_ExpandButton.MouseOver)
{
m_ExpandButton.MouseOver = false;
RefreshExpandButton();
i = m_ParentItem.SubItems.Count - 1;
}
else if (m_ExpandButton.ShowExpandButton)
{
m_ExpandButton.MouseOver = true;
RefreshExpandButton();
}
else
i = m_ParentItem.SubItems.Count - 1;
BaseItem objTmp;
for (int f = i; f >= 0; f--)
{
objTmp = m_ParentItem.SubItems[f];
if (objTmp.Displayed && objTmp.Visible && CanGetMouseFocus(objTmp))
{
m_HotSubItem = objTmp;
m_HotSubItem.InternalMouseEnter();
m_HotSubItem.InternalMouseMove(new MouseEventArgs(MouseButtons.None, 0, m_HotSubItem.LeftInternal + 2, m_HotSubItem.TopInternal + 2, 0));
if (m_HotSubItem.IsContainer)
m_HotSubItem.InternalKeyDown(e);
break;
}
}
if (m_HotSubItem == null && m_ExpandButton.ShowExpandButton && !m_ExpandButton.MouseOver)
{
m_ExpandButton.MouseOver = true;
RefreshExpandButton();
}
}
}
e.Handled=true;
m_IgnoreDuplicateMouseMove=true;
}
else if(e.KeyCode==Keys.Right)
{
m_IgnoreDuplicateMouseMove=true;
if (m_HotSubItem != null && m_HotSubItem.GetEnabled())
{
ButtonItem objBtn = m_HotSubItem as ButtonItem;
if (objBtn != null)
{
if (objBtn.SubItems.Count > 0 && objBtn.ShowSubItems && !objBtn.Expanded)
{
objBtn.Expanded = true;
if (objBtn.PopupControl is MenuPanel)
((MenuPanel)objBtn.PopupControl).SelectFirstItem();
e.Handled = true;
}
}
}
if (m_HotSubItem != null && m_HotSubItem is ItemContainer)
m_HotSubItem.InternalKeyDown(e);
if (!e.Handled && m_ParentItem!=null)
{
foreach (BaseItem item in m_ParentItem.SubItems)
{
if (item is ItemContainer)
{
item.InternalKeyDown(e);
if (e.Handled)
break;
}
}
}
}
else if(e.KeyCode==Keys.Left)
{
if (m_HotSubItem != null && m_HotSubItem is ItemContainer)
m_HotSubItem.InternalKeyDown(e);
if (!e.Handled)
{
m_IgnoreDuplicateMouseMove = true;
// Close this popup
if (BaseItem.IsOnPopup(m_ParentItem))
{
m_ParentItem.Expanded = false;
e.Handled = true;
}
}
}
else if(e.KeyCode==Keys.Escape)
{
BaseItem parent = m_ParentItem;
parent.Expanded = false;
if (parent.Parent != null && parent.Parent is GenericItemContainer && parent.Parent.AutoExpand)
parent.Parent.AutoExpand = false;
e.Handled = true;
}
else if (e.KeyCode == Keys.Enter && m_HotSubItem != null && m_HotSubItem.IsContainer)
{
m_HotSubItem.InternalKeyDown(e);
}
else if (e.KeyCode == Keys.Enter && m_HotSubItem != null && m_HotSubItem.SubItems.Count > 0 && m_HotSubItem.ShowSubItems && !m_HotSubItem.Expanded && m_HotSubItem.GetEnabled())
{
m_HotSubItem.Expanded = true;
if (m_HotSubItem is PopupItem && ((PopupItem)m_HotSubItem).PopupControl is MenuPanel)
((MenuPanel)((PopupItem)m_HotSubItem).PopupControl).SelectFirstItem();
e.Handled = true;
}
else if ((e.KeyCode == Keys.Enter || e.KeyCode == Keys.Space) && m_ExpandButton.ShowExpandButton && m_ExpandButton.MouseOver)
{
ExpandRecentlyUsed();
}
else
{
int key = 0;
if (e.Shift)
{
try
{
byte[] keyState = new byte[256];
if (NativeFunctions.GetKeyboardState(keyState))
{
byte[] chars = new byte[2];
if (NativeFunctions.ToAscii((uint)e.KeyValue, 0, keyState, chars, 0) != 0)
{
key = chars[0];
}
}
}
catch (Exception)
{
key = 0;
}
}
if (key == 0 && !BarFunctions.IsSystemKey(e.KeyCode))
{
key = (int)NativeFunctions.MapVirtualKey((uint)e.KeyValue, 2);
if (key == 0)
key = e.KeyValue;
}
if(e is KeyEventArgsEx && ((KeyEventArgsEx)e).KeyChar!=0)
{
if (ProcessContainerAccessKey(m_ParentItem, ((KeyEventArgsEx)e).KeyChar))
e.Handled = true;
}
if (!e.Handled && key > 0)
{
char[] ch = new char[1];
byte[] by = new byte[1];
by[0] = System.Convert.ToByte(key);
System.Text.Encoding.Default.GetDecoder().GetChars(by, 0, 1, ch, 0);
string s = ch[0].ToString();
ch[0] = (s.ToLower())[0];
if ((Control.ModifierKeys & Keys.Control) == Keys.None && ProcessContainerAccessKey(m_ParentItem, ch[0]))
e.Handled = true;
}
}
}
if(!e.Handled && m_HotSubItem!=null)
{
bool raiseKeyDown=true;
if (this.Controls.Count > 0)
{
foreach (Control childControl in this.Controls)
{
if (childControl.Focused)
{
raiseKeyDown = false;
break;
}
}
}
if(raiseKeyDown)
m_HotSubItem.InternalKeyDown(e);
}
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Escape || keyData == Keys.Enter)
{
KeyEventArgs args = new KeyEventArgs(keyData);
ExKeyDown(args);
if (args.Handled) return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
private bool ProcessContainerAccessKey(BaseItem container, char key)
{
List<BaseItem> itemsForMnemonic = GetItemsForMnemonic(container, key);
if (itemsForMnemonic.Count > 1)
{
// Special processing for case when more than one item uses same mnemonic key
BaseItem newHotSubitem = null;
if (m_HotSubItem == null)
newHotSubitem = itemsForMnemonic[0];
else
{
int hotItemIndex = itemsForMnemonic.IndexOf(m_HotSubItem);
if (hotItemIndex == -1)
newHotSubitem = itemsForMnemonic[0];
else
{
if (hotItemIndex == itemsForMnemonic.Count - 1)
hotItemIndex = 0;
else
hotItemIndex++;
newHotSubitem = itemsForMnemonic[hotItemIndex];
}
}
if (newHotSubitem != null)
{
if (m_HotSubItem != null)
m_HotSubItem.InternalMouseLeave();
m_HotSubItem = newHotSubitem;
m_HotSubItem.InternalMouseEnter();
m_HotSubItem.InternalMouseMove(new MouseEventArgs(MouseButtons.None, 0, m_HotSubItem.LeftInternal + 2, m_HotSubItem.TopInternal + 2, 0));
}
return true;
}
BaseItem item = GetItemForMnemonic(container, key, true);
if (item!=null && item.GetEnabled() && item.Visible)
{
if (item is ItemContainer)
{
this.ShowKeyTips = false;
this.HotSubItem = item;
}
else if (item.SubItems.Count > 0 && item.ShowSubItems && !item.Expanded)
{
if (m_HotSubItem != item)
{
if (m_HotSubItem != null)
m_HotSubItem.InternalMouseLeave();
m_HotSubItem = item;
m_HotSubItem.InternalMouseEnter();
m_HotSubItem.InternalMouseMove(new MouseEventArgs(MouseButtons.None, 0, m_HotSubItem.LeftInternal + 2, m_HotSubItem.TopInternal + 2, 0));
}
item.Expanded = true;
if (item is PopupItem && ((PopupItem)item).PopupControl is MenuPanel)
{
((MenuPanel)((PopupItem)item).PopupControl).SelectFirstItem();
}
m_IgnoreDuplicateMouseMove = true;
}
else
{
this.ShowKeyTips = false;
if (item is ComboBoxItem)
{
((ComboBoxItem)item).ComboBoxEx.Focus();
((ComboBoxItem)item).ComboBoxEx.DroppedDown = true;
}
else if (item is TextBoxItem)
{
((TextBoxItem)item).TextBox.Focus();
}
else if (item is ControlContainerItem && ((ControlContainerItem)item).Control != null)
((ControlContainerItem)item).Control.Focus();
else
item.RaiseClick();
}
return true;
}
return false;
}
private List<BaseItem> GetItemsForMnemonic(BaseItem container, char charCode)
{
List<BaseItem> items = new List<BaseItem>();
foreach (BaseItem item in container.SubItems)
{
if (IsMnemonic(charCode, item.Text))
{
if (item.Visible && item.GetEnabled())
{
items.Add(item);
}
}
}
return items;
}
protected virtual BaseItem GetItemForMnemonic(BaseItem container, char charCode, bool deepScan)
{
string keyTipsString = m_KeyTipsKeysStack + charCode.ToString();
keyTipsString = keyTipsString.ToUpper();
bool partialMatch = false;
foreach (BaseItem item in container.SubItems)
{
if (item.KeyTips != "" || m_KeyTipsKeysStack != "")
{
if (item.KeyTips != "")
{
if (item.KeyTips == keyTipsString)
{
if (item.Visible && item.GetEnabled())
{
return item;
}
}
else if (item.KeyTips.StartsWith(keyTipsString))
{
partialMatch = true;
}
}
}
else if (IsMnemonic(charCode, item.Text))
{
if (item.Visible && item.GetEnabled())
{
return item;
}
}
if (deepScan && item.IsContainer)
{
BaseItem mItem = GetItemForMnemonic(item, charCode, deepScan);
if (mItem != null)
return mItem;
}
else if (deepScan && item is ControlContainerItem && ((ControlContainerItem)item).Control is RibbonBar)
{
RibbonBar rb = ((ControlContainerItem)item).Control as RibbonBar;
BaseItem mItem = GetItemForMnemonic(rb.GetBaseItemContainer(), charCode, deepScan);
if (mItem != null)
return mItem;
}
}
if (partialMatch)
{
m_KeyTipsKeysStack += charCode.ToString().ToUpper();
}
return null;
}
/// <summary>
/// Return Sub Item at specified location
/// </summary>
protected BaseItem ItemAtLocation(int x, int y)
{
if(m_ParentItem!=null && m_ParentItem.SubItems.Count!=0)
{
foreach(BaseItem objSub in m_ParentItem.SubItems)
{
if((objSub.Visible || m_IsCustomizeMenu) && objSub.Displayed && x>=objSub.LeftInternal && x<=(objSub.LeftInternal+objSub.WidthInternal) && y>=objSub.TopInternal && y<=(objSub.TopInternal+objSub.HeightInternal))
{
if (objSub.IsContainer)
{
BaseItem item = objSub.ItemAtLocation(x, y);
if (item != null)
return item;
}
return objSub;
}
}
}
return null;
}
protected override void OnHandleDestroyed(EventArgs e)
{
ClearHotSubItem();
base.OnHandleDestroyed(e);
}
internal void ClearHotSubItem()
{
if(m_HotSubItem!=null)
{
//if(m_ParentItem!=null && m_ParentItem.DesignMode && this.Owner!=null)
// this.Owner.SetFocusItem(null);
//else
m_HotSubItem.InternalMouseLeave();
m_HotSubItem=null;
}
}
private void ResetHover()
{
// We need to reset hover thing since it is fired only first time mouse hovers inside the window and we need it for each of our items
NativeFunctions.TRACKMOUSEEVENT tme=new NativeFunctions.TRACKMOUSEEVENT();
tme.dwFlags=NativeFunctions.TME_QUERY;
tme.hwndTrack=this.Handle;
tme.cbSize=System.Runtime.InteropServices.Marshal.SizeOf(tme);
NativeFunctions.TrackMouseEvent(ref tme);
tme.dwFlags=tme.dwFlags | NativeFunctions.TME_HOVER;
NativeFunctions.TrackMouseEvent(ref tme);
}
private void SetupScrollTimer()
{
m_ScrollTimer=new Timer();
m_ScrollTimer.Interval=100;
m_ScrollTimer.Tick+=new EventHandler(this.ScrollTimerTick);
m_ScrollTimer.Start();
}
private void ScrollTimerTick(object sender, EventArgs e)
{
CheckScrolling();
}
private void ScrollItemsUp()
{
if (m_ScrollTopPosition > 0)
{
m_ScrollTopPosition--;
//BaseItem o=m_ParentItem.SubItems[m_ScrollTopPosition] as BaseItem;
//if(o is SeparatorItem && m_ScrollTopPosition>0)
// m_ScrollTopPosition--;
}
RepositionItems();
this.Refresh();
}
private void ScrollItemsDown()
{
m_ScrollTopPosition++;
//BaseItem o=m_ParentItem.SubItems[m_ScrollTopPosition] as BaseItem;
//if(o is SeparatorItem && m_ScrollTopPosition<m_ParentItem.SubItemsCount)
// m_ScrollTopPosition++;
RepositionItems();
this.Refresh();
}
private bool CheckScrolling()
{
if(!m_Scroll)
return false;
Point p=this.PointToClient(Control.MousePosition);
if(m_TopScroll && p.Y<=m_TopScrollHeight+m_ClientRect.Top)
{
ScrollItemsUp();
if(m_ScrollTimer==null)
SetupScrollTimer();
return true;
}
else if(m_BottomScroll && p.Y>=this.Height-m_BottomScrollHeight)
{
ScrollItemsDown();
if(m_ScrollTimer==null)
SetupScrollTimer();
return true;
}
else
{
if(m_ScrollTimer!=null)
{
m_ScrollTimer.Stop();
m_ScrollTimer.Dispose();
m_ScrollTimer=null;
}
}
return false;
}
// Reposition items when scrolling changes
// This function will change only Y coordinate of the items
// It will also set the Displayed property properly
private void RepositionItems()
{
m_TopScroll=false;
m_BottomScroll=false;
if(!m_Scroll || m_ParentItem==null || m_ParentItem.SubItems.Count==0)
return;
int iTop=m_ClientRect.Top;
int iItemHeight=0;
if(m_ScrollTopPosition>0)
{
// There is a top scroll triangle, with inital height of 16
m_TopScrollHeight=16;
iTop+=m_TopScrollHeight;
m_TopScroll=true;
}
BaseItem objItem;
bool bOverrun=false;
for(int i=0;i<m_ParentItem.SubItems.Count;i++)
{
objItem=m_ParentItem.SubItems[i];
if(bOverrun || i<m_ScrollTopPosition || !objItem.Visible && !m_IsCustomizeMenu)
{
objItem.Displayed=false;
continue;
}
iItemHeight=objItem.HeightInternal;
if(objItem.BeginGroup)
{
if (m_ParentItem.EffectiveStyle == eDotNetBarStyle.Office2000)
iItemHeight+=Dpi.Height(GROUP_SPACINGOFFICE);
else
iItemHeight+=Dpi.Height(GROUP_SPACINGDOTNET);
}
if(iItemHeight+iTop>m_ClientRect.Bottom || m_ClientRect.Bottom-(iItemHeight+iTop)<15 && i+1<m_ParentItem.SubItems.Count)
{
// Overflows, this item is out
objItem.Displayed=false;
bOverrun=true;
// We will need bottom scrolling triangle
m_BottomScroll=true;
m_BottomScrollHeight=m_ClientRect.Bottom-iTop;
continue;
}
// If this item is last item we need to change positions so last item
// Is at the bottom of the window
if(i==m_ParentItem.SubItems.Count-1)
{
// This is a last item, now we have to do more work to make this look better
// Get the previous item so we know what our top position will be
objItem.Displayed=true;
iTop=m_ClientRect.Bottom;
for(int i1=i;i1>=m_ScrollTopPosition;i1--)
{
objItem=m_ParentItem.SubItems[i1];
if(!objItem.Visible && !m_IsCustomizeMenu)
continue;
iTop-=objItem.HeightInternal;
objItem.TopInternal=iTop;
if(objItem.BeginGroup)
{
if (m_ParentItem.EffectiveStyle == eDotNetBarStyle.Office2000)
iTop-=Dpi.Height(GROUP_SPACINGOFFICE);
else
iTop-=Dpi.Height(GROUP_SPACINGDOTNET);
}
}
// See can we fit more items on top
if(m_ScrollTopPosition>0)
{
objItem=m_ParentItem.SubItems[m_ScrollTopPosition-1];
if(iTop-objItem.HeightInternal-15>m_ClientRect.Top)
{
// Great we can fit some more
for(int i1=m_ScrollTopPosition-1;i1>=0;i1--)
{
objItem=m_ParentItem.SubItems[i1];
if(!objItem.Visible && !m_IsCustomizeMenu)
continue;
if(iTop-objItem.HeightInternal-15>m_ClientRect.Top)
{
iTop-=objItem.HeightInternal;
objItem.TopInternal=iTop;
objItem.Displayed=true;
if(objItem.BeginGroup)
{
if (m_ParentItem.EffectiveStyle == eDotNetBarStyle.Office2000)
iTop-=Dpi.Height(GROUP_SPACINGOFFICE);
else
iTop-=Dpi.Height(GROUP_SPACINGDOTNET);
}
m_ScrollTopPosition=i1;
}
else
break;
}
}
}
// Set the top scroll triangle height
m_TopScrollHeight=iTop-m_ClientRect.Top;
m_BottomScroll=false;
break;
}
if(objItem.BeginGroup)
{
if (m_ParentItem.EffectiveStyle == eDotNetBarStyle.Office2000)
iTop+=Dpi.Height(GROUP_SPACINGOFFICE);
else
iTop+=Dpi.Height(GROUP_SPACINGDOTNET);
}
objItem.TopInternal=iTop;
objItem.Displayed=true;
iTop+=objItem.HeightInternal;
}
}
private bool IsRoundRegion
{
get
{
if (m_ParentItem != null)
{
if (m_ParentItem is ApplicationButton && m_ParentItem.EffectiveStyle == eDotNetBarStyle.Windows7 || StyleManager.IsMetro(m_ParentItem.EffectiveStyle)) return false;
BaseItem p = m_ParentItem;
while(p.Parent!=null)
p=p.Parent;
Control c = p.ContainerControl as Control;
if (c is RibbonStrip || c is RibbonBar || c is ContextMenuBar && BarFunctions.IsOffice2007Style(((ContextMenuBar)c).Style))
return true;
}
return false;
}
}
private void SetRoundRegion(Control c)
{
Rectangle rectPath = c.ClientRectangle;
rectPath.Width--;
rectPath.Height--;
GraphicsPath path = DisplayHelp.GetRoundedRectanglePath(rectPath, m_CornerSize);
Region r = new Region();
r.MakeEmpty();
r.Union(path);
// Widen path for the border...
path.Widen(SystemPens.ControlText);
r.Union(path);
c.Region = r;
}
public new void Hide()
{
base.Hide();
if (m_DesignerParent && this.Parent!=null)
{
this.Parent.Controls.Remove(this);
m_DesignerParent = false;
}
}
private bool m_DesignerParent = false;
private bool AddtoDesignTimeContainer()
{
ISite site = GetSite();
if (site == null)
return false;
IDesignerHost dh = site.GetService(typeof(IDesignerHost)) as IDesignerHost;
if (dh == null) return false;
Control parent = dh.RootComponent as Control;
while (parent != null)
{
parent = parent.Parent;
if (parent!=null && parent.GetType().Name.IndexOf("DesignerFrame")>=0)
break;
}
if (parent == null || parent.Parent==null) return false;
//parent = parent.Parent;
Point p = parent.PointToClient(this.Location);
parent.Controls.Add(this);
this.Location = p;
base.Visible = true;
this.Update();
this.BringToFront();
m_DesignerParent = true;
return true;
}
public new void Show()
{
if(!m_PopupMenu)
{
base.Visible=true;
this.Update();
return;
}
// Design mode add
if (m_ParentItem != null && (m_ParentItem.Site != null && m_ParentItem.Site.DesignMode || m_ParentItem.DesignMode ||
m_ParentItem.Parent != null && m_ParentItem.Parent.Site != null && m_ParentItem.Parent.Site.DesignMode))
{
if (AddtoDesignTimeContainer())
return;
}
PopupContainer popup=new PopupContainer();
popup.ShowDropShadow=(this.DisplayShadow && this.AlphaShadow);
//NativeFunctions.sndPlaySound("MenuPopup",NativeFunctions.SND_ASYNC | NativeFunctions.SND_NODEFAULT);
// This window cannot be outside the screen
// If height of the window is outside the screen, reduce the
// window size and set the flag so we know we have to scroll the window
ScreenInformation objScreen=BarFunctions.ScreenFromControl(this);
if(objScreen!=null)
{
Rectangle workingArea=objScreen.WorkingArea;
if (IsContextMenu || UseWholeScreenForSizeChecking)
workingArea=objScreen.Bounds;
if(this.Location.Y+this.Size.Height>workingArea.Bottom)
{
// Reduce the size
m_ClientRect.Height=m_ClientRect.Height-(this.Location.Y+this.Size.Height-workingArea.Bottom);
this.Height=this.Height-(this.Location.Y+this.Size.Height-workingArea.Bottom);
m_Scroll=true;
m_ScrollTopPosition=0;
RepositionItems();
}
}
popup.Location=this.Location;
popup.Controls.Add(this);
popup.Size=this.Size;
this.Location=new Point(0,0);
popup.CreateControl();
if (BarFunctions.IsOffice2007Style(m_ParentItem.EffectiveStyle) && IsRoundRegion)
{
SetRoundRegion(this);
SetRoundRegion(popup);
}
ePopupAnimation animation=m_PopupAnimation;
if(!BarFunctions.SupportsAnimation)
animation=ePopupAnimation.None;
else
{
if(animation==ePopupAnimation.ManagerControlled)
{
IOwnerMenuSupport ownermenu=m_Owner as IOwnerMenuSupport;
if(ownermenu!=null)
animation=ownermenu.PopupAnimation;
if(animation==ePopupAnimation.ManagerControlled)
animation=ePopupAnimation.SystemDefault;
}
if(animation==ePopupAnimation.SystemDefault)
animation=NativeFunctions.SystemMenuAnimation;
else if(animation==ePopupAnimation.Random)
{
Random r=new System.Random();
int i=r.Next(2);
animation=ePopupAnimation.Fade;
if(i==1)
animation=ePopupAnimation.Slide;
else if(i==2)
animation=ePopupAnimation.Unfold;
}
}
// No animation if menu is hosting controls... Animation caused strange errors on some machines
if(this.Controls.Count>0)
animation=ePopupAnimation.None;
if(animation==ePopupAnimation.Fade && Environment.OSVersion.Version.Major>=5)
{
NativeFunctions.AnimateWindow(popup.Handle,BarFunctions.ANIMATION_INTERVAL,NativeFunctions.AW_BLEND);
popup.Visible = true;
}
else if(animation==ePopupAnimation.Slide)
{
NativeFunctions.AnimateWindow(popup.Handle,BarFunctions.ANIMATION_INTERVAL,(NativeFunctions.AW_SLIDE | NativeFunctions.AW_HOR_POSITIVE | NativeFunctions.AW_VER_POSITIVE));
popup.Visible = true;
}
else if (animation == ePopupAnimation.Unfold)
{
NativeFunctions.AnimateWindow(popup.Handle, BarFunctions.ANIMATION_INTERVAL, (NativeFunctions.AW_HOR_POSITIVE | NativeFunctions.AW_VER_POSITIVE));
popup.Visible = true;
}
else
{
base.Visible = true;
popup.Visible = true;
}
popup.ShowShadow();
if(animation!=ePopupAnimation.None && this.Controls.Count>0)
this.Refresh();
Rectangle rectDisplay=new Rectangle(popup.Location,popup.Size);
if(rectDisplay.Contains(Control.MousePosition))
{
m_IgnoreDuplicateMouseMove=true;
}
// This makes the menu paint BEFORE it returns out of this function
this.Update();
MenuPanel.PopupMenuAccessibleObject acc=this.AccessibilityObject as PopupMenuAccessibleObject;
if(acc!=null)
{
if(m_ParentItem!=null && m_ParentItem.IsOnMenuBar)
acc.GenerateEvent(AccessibleEvents.SystemMenuStart);
acc.GenerateEvent(AccessibleEvents.SystemMenuPopupStart);
}
}
private bool IsContextMenu
{
get
{
if(m_ParentItem==null)
return false;
if(m_ParentItem.Parent==null || m_ParentItem.ContainerControl is ContextMenuBar)
return true;
BaseItem topParent=m_ParentItem.Parent;
while(topParent.Parent!=null)
topParent=topParent.Parent;
if(topParent is PopupItem)
return true;
return false;
}
}
protected override void OnVisibleChanged(EventArgs e)
{
base.OnVisibleChanged(e);
if(!this.Visible && m_DropShadow!=null)
{
m_DropShadow.Hide();
m_DropShadow.Dispose();
m_DropShadow=null;
}
if(!this.Visible && this.Parent!=null && this.Parent is PopupContainer)
{
this.Parent.Visible=false;
}
if(!this.Visible && m_ScrollTimer!=null)
{
m_ScrollTimer.Stop();
m_ScrollTimer.Dispose();
m_ScrollTimer=null;
}
if(m_AccessibleObjectCreated)
{
MenuPanel.PopupMenuAccessibleObject acc=this.AccessibilityObject as PopupMenuAccessibleObject;
if(acc!=null)
{
if(m_ParentItem!=null)
{
foreach(BaseItem item in m_ParentItem.SubItems)
acc.GenerateEvent(item,AccessibleEvents.Destroy);
}
if(!this.Visible)
{
acc.GenerateEvent(AccessibleEvents.SystemMenuPopupEnd);
acc.GenerateEvent(AccessibleEvents.StateChange);
}
}
}
}
private int ClientMarginLeft
{
get
{
int iMargin=0;
if (m_ParentItem != null && IsGradientStyle)
{
iMargin = 1;
if (BarFunctions.IsOffice2007Style(m_ParentItem.EffectiveStyle))
iMargin++;
if (IsContainerMenu)
iMargin--;
}
else
iMargin = 3;
return iMargin;
}
}
private int ClientMarginTop
{
get
{
int iMargin=0;
if(m_ParentItem!=null && IsGradientStyle)
iMargin=2;
else
iMargin=3;
if (IsContainerMenu)
iMargin--;
return iMargin;
}
}
private int ClientMarginRight
{
get
{
bool bShowShadow=true;
int iMargin=0;
IOwnerMenuSupport ownermenu=m_Owner as IOwnerMenuSupport;
if(ownermenu!=null && !ownermenu.ShowPopupShadow)
bShowShadow=false;
if(m_ParentItem!=null && IsGradientStyle)
{
if(this.AlphaShadow || !bShowShadow)
iMargin=1;
else
iMargin=3;
if (BarFunctions.IsOffice2007Style(m_ParentItem.EffectiveStyle))
iMargin++;
if (IsContainerMenu)
iMargin--;
}
else
iMargin=3;
return iMargin;
}
}
private int ClientMarginBottom
{
get
{
IOwnerMenuSupport ownermenu=m_Owner as IOwnerMenuSupport;
bool bShowShadow=true;
int iMargin=0;
if(ownermenu!=null && !ownermenu.ShowPopupShadow)
bShowShadow=false;
if(m_ParentItem!=null && IsGradientStyle)
{
if(this.AlphaShadow || !bShowShadow)
iMargin=2;
else
iMargin=4;
if (IsContainerMenu)
iMargin--;
}
else
iMargin=3;
return iMargin;
}
}
internal bool DisplayShadow
{
get
{
if(!m_PopupMenu || m_ParentItem!=null && m_ParentItem.Site!=null && m_ParentItem.Site.DesignMode)
return false;
IOwnerMenuSupport ownermenu=m_Owner as IOwnerMenuSupport;
if(ownermenu!=null)
{
if (m_ParentItem != null && m_ParentItem.EffectiveStyle == eDotNetBarStyle.Office2000)
{
if(ownermenu.MenuDropShadow==eMenuDropShadow.Show)
return true;
else
return false;
}
return ownermenu.ShowPopupShadow;
}
else
{
if (m_ParentItem != null && m_ParentItem.EffectiveStyle == eDotNetBarStyle.Office2000)
return false;
}
return true;
}
}
/// <summary>
/// Gets or sets whether anti-alias smoothing is used while painting. Default value is false.
/// </summary>
[DefaultValue(false), Browsable(true), Category("Appearance"), Description("Gets or sets whether anti-aliasing is used while painting.")]
public bool AntiAlias
{
get { return m_AntiAlias; }
set {m_AntiAlias = value; }
}
internal bool AlphaShadow
{
get
{
if(Environment.OSVersion.Version.Major<5)
return false;
IOwnerMenuSupport ownermenu=m_Owner as IOwnerMenuSupport;
if(ownermenu!=null && !ownermenu.AlphaBlendShadow)
return false;
return true; //NativeFunctions.CursorShadow;
}
}
/// <summary>
/// Indicates whether Tooltips are shown on Bars and menus.
/// </summary>
[System.ComponentModel.Browsable(true),DevCoBrowsable(true),DefaultValue(true),System.ComponentModel.Category("Run-time Behavior"),System.ComponentModel.Description("Indicates whether Tooltips are shown on Bar and it's sub-items.")]
public bool ShowToolTips
{
get
{
return m_ShowToolTips;
}
set
{
m_ShowToolTips=value;
}
}
/// <summary>
/// Sets,Gets the side bar image structure.
/// </summary>
public SideBarImage SideBar
{
get
{
return m_SideBarImage;
}
set
{
m_SideBarImage=value;
}
}
public object Owner
{
get
{
return m_Owner;
}
set
{
m_Owner=value;
}
}
internal bool IsCustomizeMenu
{
get
{
return m_IsCustomizeMenu;
}
set
{
m_IsCustomizeMenu=value;
if(m_ParentItem!=null)
{
foreach(BaseItem objItem in m_ParentItem.SubItems)
objItem.SetIsOnCustomizeMenu(m_IsCustomizeMenu);
}
}
}
[System.ComponentModel.Browsable(true),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("Indicates when menu items are displayed when MenuVisiblity is set to VisibleIfRecentlyUsed and RecentlyUsed is true.")]
public ePersonalizedMenus PersonalizedMenus
{
get
{
return m_PersonalizedMenus;
}
set
{
m_PersonalizedMenus=value;
}
}
public bool PersonalizedAllVisible
{
get
{
return m_ExpandButton.PersonalizedAllVisible;
}
set
{
m_ExpandButton.PersonalizedAllVisible=value;
}
}
public ePopupAnimation PopupAnimation
{
get
{
return m_PopupAnimation;
}
set
{
m_PopupAnimation=value;
}
}
public DevComponents.DotNetBar.ColorScheme ColorScheme
{
get {return m_ColorScheme;}
set
{
m_ColorScheme=value;
if(this.Visible)
this.Refresh();
}
}
/// <summary>
/// Gets or sets the HotSubItem on the menu. This method is used internally by DotNetBar and should not be used in your application.
/// </summary>
public BaseItem HotSubItem
{
get {return m_HotSubItem;}
set
{
if(m_HotSubItem!=null)
m_HotSubItem.InternalMouseLeave();
m_HotSubItem=null;
if(this.ParentItem.SubItems.Contains(value) || IsChildItem(value))
{
m_HotSubItem=value;
if(m_HotSubItem!=null)
{
m_HotSubItem.InternalMouseEnter();
m_HotSubItem.InternalMouseMove(new MouseEventArgs(MouseButtons.None,0,m_HotSubItem.LeftInternal+1,m_HotSubItem.TopInternal+1,0));
}
}
}
}
private bool IsChildItem(BaseItem item)
{
if (item == null) return false;
while (item != null)
{
if (this.ParentItem == item) return true;
item = item.Parent;
}
return false;
}
//***********************************************
// IDesignTimeProvider Implementation
//***********************************************
public InsertPosition GetInsertPosition(Point pScreen, BaseItem DragItem)
{
if(m_ParentItem==null)
return null;
return DesignTimeProviderContainer.GetInsertPosition(m_ParentItem, pScreen, DragItem);
//InsertPosition objInsertPos=null;
//Point pClient=this.PointToClient(pScreen);
//Rectangle r;
//if(this.ClientRectangle.Contains(pClient))
//{
// for(int i=0;i<m_ParentItem.SubItems.Count;i++)
// {
// BaseItem objItem=m_ParentItem.SubItems[i];
// r=objItem.DisplayRectangle;
// r.Inflate(2,2);
// if(objItem.Visible && r.Contains(pClient))
// {
// if(objItem.SystemItem)
// return null;
// if(objItem==DragItem)
// return new InsertPosition();
// if (objItem.IsContainer && objItem is IDesignTimeProvider)
// {
// Rectangle inner = r;
// inner.Inflate(-5, -5);
// if (inner.Contains(pClient))
// return ((IDesignTimeProvider)objItem).GetInsertPosition(pScreen, DragItem);
// }
// objInsertPos=new InsertPosition();
// objInsertPos.TargetProvider=(IDesignTimeProvider)m_ParentItem;
// objInsertPos.Position=i;
// //if(objItem.Orientation==eOrientation.Horizontal)
// //{
// // if(pClient.X<=objItem.Left+objItem.Width/2)
// // objInsertPos.Before=true;
// //}
// //else
// //{
// if(pClient.Y<=objItem.TopInternal+objItem.HeightInternal/2)
// objInsertPos.Before=true;
// //}
// if(objItem is PopupItem && objItem.SubItems.Count>0)
// {
// if(!objItem.Expanded)
// objItem.Expanded=true;
// }
// else
// BaseItem.CollapseSubItems(m_ParentItem);
// break;
// }
// }
// if(objInsertPos==null)
// {
// // Container is empty but it can contain the items
// //objInsertPos=new InsertPosition(m_ParentItem.SubItemsCount-1,false,this);
// if(m_ParentItem.SubItems.Count>1 && m_ParentItem.SubItems[m_ParentItem.SubItems.Count-1].SystemItem)
// objInsertPos=new InsertPosition(m_ParentItem.SubItems.Count-2,true,(IDesignTimeProvider)m_ParentItem);
// else
// objInsertPos=new InsertPosition(m_ParentItem.SubItems.Count-1,false,(IDesignTimeProvider)m_ParentItem);
// }
//}
//else
//{
// foreach(BaseItem objItem in m_ParentItem.SubItems)
// {
// if(objItem==DragItem)
// continue;
// IDesignTimeProvider provider=objItem as IDesignTimeProvider;
// if(provider!=null)
// {
// objInsertPos=provider.GetInsertPosition(pScreen, DragItem);
// if(objInsertPos!=null)
// break;
// }
// }
//}
//return objInsertPos;
}
public void DrawReversibleMarker(int iPos, bool Before)
{
Rectangle r, rl,rr;
if(iPos>=0)
{
BaseItem objItem=m_ParentItem.SubItems[iPos];
if(objItem.DesignInsertMarker!=eDesignInsertPosition.None)
objItem.DesignInsertMarker=eDesignInsertPosition.None;
else if(Before)
objItem.DesignInsertMarker=eDesignInsertPosition.Before;
else
objItem.DesignInsertMarker=eDesignInsertPosition.After;
return;
}
else
{
r=new Rectangle(this.ClientRectangle.Left+2,this.ClientRectangle.Top+2,this.ClientRectangle.Width-4,1);
rl=new Rectangle(this.ClientRectangle.Left+1,this.ClientRectangle.Top,1,5);
rr=new Rectangle(this.ClientRectangle.Right-2,this.ClientRectangle.Top,1,5);
}
//r.Location=this.PointToScreen(r.Location);
//rl.Location=this.PointToScreen(rl.Location);
//rr.Location=this.PointToScreen(rr.Location);
//ControlPaint.DrawReversibleFrame(r,SystemColors.Control,FrameStyle.Thick);
//ControlPaint.DrawReversibleFrame(rl,SystemColors.Control,FrameStyle.Thick);
//ControlPaint.DrawReversibleFrame(rr,SystemColors.Control,FrameStyle.Thick);
}
public void InsertItemAt(BaseItem objItem, int iPos, bool Before)
{
if(!Before)
{
//objItem.BeginGroup=true; //!objItem.BeginGroup;
if(iPos+1>=m_ParentItem.SubItems.Count)
m_ParentItem.SubItems.Add(objItem);
else
m_ParentItem.SubItems.Add(objItem,iPos+1);
}
else
{
//objItem.BeginGroup=false;
if(iPos>=m_ParentItem.SubItems.Count)
m_ParentItem.SubItems.Add(objItem);
else
m_ParentItem.SubItems.Add(objItem,iPos);
}
objItem.ContainerControl=this;
ClearHotSubItem();
this.RecalcSize();
ISite site = GetSite();
if (site != null && m_ParentItem != null)
{
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (cc != null)
cc.OnComponentChanged(m_ParentItem, TypeDescriptor.GetProperties(m_ParentItem)["SubItems"], null, null);
}
}
public class PopupMenuAccessibleObject : Control.ControlAccessibleObject
{
MenuPanel m_Owner = null;
public PopupMenuAccessibleObject(MenuPanel owner):base(owner)
{
m_Owner = owner;
}
internal void GenerateEvent(BaseItem sender, System.Windows.Forms.AccessibleEvents e)
{
if(m_Owner==null)
return;
if(m_Owner!=null && m_Owner.m_ParentItem!=null)
{
int iChild = m_Owner.m_ParentItem.SubItems.IndexOf(sender);
if(iChild>=0)
{
m_Owner.AccessibilityNotifyClients(e,iChild);
}
}
}
internal void GenerateEvent(System.Windows.Forms.AccessibleEvents e)
{
if(m_Owner==null)
return;
m_Owner.AccessibilityNotifyClients(e,-1);
}
//public override string Name
//{
// get
// {
// if(m_Owner==null)
// return "";
// return m_Owner.AccessibleName;
// }
// set
// {
// if(m_Owner==null)
// return;
// m_Owner.AccessibleName = value;
// }
//}
//public override string Description
//{
// get
// {
// if(m_Owner==null)
// return "";
// return m_Owner.AccessibleDescription;
// }
//}
public override AccessibleRole Role
{
get
{
if(m_Owner==null)
return AccessibleRole.None;
return m_Owner.AccessibleRole;
}
}
public override AccessibleObject Parent
{
get
{
if (m_Owner == null || m_Owner.ParentItem == null)
return null;
return m_Owner.ParentItem.AccessibleObject;
}
}
public override Rectangle Bounds
{
get
{
if(m_Owner==null)
return Rectangle.Empty;
return this.m_Owner.DisplayRectangle;
}
}
public override int GetChildCount()
{
if(m_Owner!=null && m_Owner.m_ParentItem!=null)
return this.m_Owner.m_ParentItem.SubItems.Count;
return 0;
}
public override System.Windows.Forms.AccessibleObject GetChild(int iIndex)
{
if(m_Owner!=null && m_Owner.m_ParentItem!=null)
return this.m_Owner.m_ParentItem.SubItems[iIndex].AccessibleObject;
return null;
}
public override AccessibleStates State
{
get
{
if(m_Owner==null || m_Owner.IsDisposed)
return AccessibleStates.Unavailable;
return AccessibleStates.Floating;
}
}
public override void Select(AccessibleSelection flags){}
public override void DoDefaultAction() {}
// public virtual string DefaultAction {get;}
// public virtual AccessibleStates State {get;}
// public virtual void DoDefaultAction();
// public virtual bool Equals(object obj);
// public static bool Equals(object objA,object objB);
// public virtual AccessibleObject GetFocused();
// public virtual AccessibleObject GetSelected();
// public virtual AccessibleObject HitTest(int xScreen,int yScreen);
// public virtual AccessibleObject Navigate(AccessibleNavigation navdir);
}
}
}