442 lines
11 KiB
C#
442 lines
11 KiB
C#
namespace DevComponents.DotNetBar
|
|
{
|
|
using System;
|
|
using System.Drawing;
|
|
|
|
public struct SideBarImage
|
|
{
|
|
public Image Picture;
|
|
public Color BackColor;
|
|
public System.Drawing.Drawing2D.LinearGradientBrush GradientBrush;
|
|
public eAlignment Alignment;
|
|
public bool StretchPicture;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Summary description for ToolMenu.
|
|
/// </summary>
|
|
[Serializable] public class ToolMenu:PopupItem
|
|
{
|
|
protected int m_PaddingTop, m_PaddingBottom, m_PaddingLeft, m_PaddingRight;
|
|
protected bool m_MouseOver;
|
|
|
|
public ToolMenu():this("") {}
|
|
public ToolMenu(string sName):base(sName)
|
|
{
|
|
// This Bar pops-up its children, so they are not contained
|
|
m_PaddingTop=2;
|
|
m_PaddingBottom=3;
|
|
m_PaddingLeft=7;
|
|
m_PaddingRight=9;
|
|
m_IsContainer=false;
|
|
m_MouseOver=false;
|
|
//m_SideBar=new SideBarImage();
|
|
this.PopupType=ePopupType.Menu;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns copy of ToolMenu item
|
|
/// </summary>
|
|
public override BaseItem Copy()
|
|
{
|
|
ToolMenu objCopy=new ToolMenu();
|
|
this.CopyToItem(objCopy);
|
|
|
|
return objCopy;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Paints this base container
|
|
/// </summary>
|
|
public override void Paint(System.Drawing.Graphics g)
|
|
{
|
|
Font objFont=this.GetFont();
|
|
if(m_Expanded && !this.DesignMode || m_Expanded && this.DesignMode && !m_MouseOver)
|
|
{
|
|
// Office 2000 Style
|
|
if(m_Style==eDotNetBarStyle.Office)
|
|
{
|
|
g.FillRectangle(SystemBrushes.Control,m_Rect);
|
|
System.Windows.Forms.ControlPaint.DrawBorder3D(g,m_Rect,System.Windows.Forms.Border3DStyle.SunkenOuter,System.Windows.Forms.Border3DSide.All);
|
|
}
|
|
else
|
|
{
|
|
// DotNet Style
|
|
g.FillRectangle(SystemBrushes.Control,m_Rect);
|
|
g.FillRectangle(new SolidBrush(ColorFunctions.ToolMenuFocusBackColor(g)),m_Rect.Left,m_Rect.Top,m_Rect.Width-2,m_Rect.Height);
|
|
Point[] p=new Point[4];
|
|
p[0].X=m_Rect.Left;
|
|
p[0].Y=m_Rect.Top+m_Rect.Height-1;
|
|
p[1].X=m_Rect.Left;
|
|
p[1].Y=m_Rect.Top;
|
|
p[2].X=m_Rect.Left+m_Rect.Width-3;
|
|
p[2].Y=m_Rect.Top;
|
|
p[3].X=m_Rect.Left+m_Rect.Width-3;
|
|
p[3].Y=m_Rect.Top+m_Rect.Height-1;
|
|
g.DrawLines(new Pen(ColorFunctions.MenuFocusBorderColor(g),1),p);
|
|
// Draw the shadow
|
|
g.FillRectangle(SystemBrushes.ControlDark,m_Rect.Left+m_Rect.Width-2,m_Rect.Top+2,2,m_Rect.Height-2);
|
|
}
|
|
|
|
}
|
|
else if(m_MouseOver && (m_Enabled || this.DesignMode))
|
|
{
|
|
// Office 2000 Style
|
|
if(!this.DesignMode && m_MouseOver)
|
|
{
|
|
if(m_Style==eDotNetBarStyle.Office)
|
|
{
|
|
g.FillRectangle(SystemBrushes.Control,m_Rect);
|
|
System.Windows.Forms.ControlPaint.DrawBorder3D(g,m_Rect,System.Windows.Forms.Border3DStyle.RaisedInner,System.Windows.Forms.Border3DSide.All);
|
|
}
|
|
else
|
|
{
|
|
// DotNet Style
|
|
g.FillRectangle(SystemBrushes.Control,m_Rect);
|
|
g.FillRectangle(new SolidBrush(ColorFunctions.HoverBackColor(g)),m_Rect.Left,m_Rect.Top,m_Rect.Width-2,m_Rect.Height);
|
|
// TODO: Beta 2 fix --> g.DrawRectangle(SystemPens.Highlight,m_Rect.Left,m_Rect.Top,m_Rect.Width-2,m_Rect.Height);
|
|
NativeFunctions.DrawRectangle(g,SystemPens.Highlight,m_Rect.Left,m_Rect.Top,m_Rect.Width-2,m_Rect.Height);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
g.FillRectangle(SystemBrushes.Control,m_Rect);
|
|
|
|
if(this.DesignMode && this.Focused)
|
|
{
|
|
Rectangle r=m_Rect;
|
|
r.Inflate(-1,-1);
|
|
g.DrawRectangle(new Pen(SystemColors.ControlText,2),r);
|
|
}
|
|
|
|
StringFormat sf=StringFormat.GenericDefault;
|
|
sf.HotkeyPrefix=System.Drawing.Text.HotkeyPrefix.Show;
|
|
sf.Alignment=System.Drawing.StringAlignment.Center;
|
|
sf.LineAlignment=System.Drawing.StringAlignment.Center;
|
|
if(m_Enabled || this.DesignMode)
|
|
{
|
|
g.DrawString(m_Text,objFont,SystemBrushes.ControlText,m_Rect,sf);
|
|
}
|
|
else
|
|
{
|
|
if(m_Style==eDotNetBarStyle.DotNet)
|
|
g.DrawString(m_Text,objFont,SystemBrushes.ControlDark,m_Rect,sf);
|
|
else
|
|
System.Windows.Forms.ControlPaint.DrawStringDisabled(g,m_Text,objFont,SystemColors.Control,m_Rect,sf);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Recalculate Size of this item
|
|
/// </summary>
|
|
public override void RecalcSize()
|
|
{
|
|
System.Windows.Forms.Control objCtrl=this.ContainerControl as System.Windows.Forms.Control;
|
|
if(IsHandleValid(objCtrl))
|
|
{
|
|
Graphics g=objCtrl.CreateGraphics();
|
|
Font f=this.GetFont();
|
|
SizeF sf;
|
|
StringFormat sfmt=StringFormat.GenericDefault;
|
|
sfmt.HotkeyPrefix=System.Drawing.Text.HotkeyPrefix.Show;
|
|
sf=g.MeasureString(m_Text,f,0,sfmt);
|
|
|
|
if(m_Style==eDotNetBarStyle.DotNet)
|
|
{
|
|
m_Rect.Width=(int)sf.Width+m_PaddingLeft+m_PaddingRight;
|
|
m_Rect.Height=(int)sf.Height+m_PaddingTop+m_PaddingBottom;
|
|
}
|
|
else
|
|
{
|
|
m_Rect.Width=(int)sf.Width+6;
|
|
m_Rect.Height=(int)sf.Height+6;
|
|
}
|
|
g.Dispose();
|
|
objCtrl=null;
|
|
}
|
|
base.RecalcSize();
|
|
}
|
|
|
|
public override void MouseEnter()
|
|
{
|
|
m_MouseOver=true;
|
|
this.Refresh();
|
|
}
|
|
|
|
public override void MouseLeave()
|
|
{
|
|
m_MouseOver=false;
|
|
this.Refresh();
|
|
}
|
|
|
|
public override void MouseDown(System.Windows.Forms.MouseEventArgs objArg)
|
|
{
|
|
if(objArg.Button != System.Windows.Forms.MouseButtons.Left || !m_Enabled && !this.DesignMode)
|
|
{
|
|
base.MouseDown(objArg);
|
|
return;
|
|
}
|
|
|
|
// This behaviour is specific to menus and maybe the popup Bar items.
|
|
// Needs to be incorporated when ToolMenu is moved into the ButtonItem
|
|
if(m_ParentItem!=null && !this.DesignMode)
|
|
{
|
|
if(this.Expanded)
|
|
{
|
|
m_ParentItem.AutoExpand=false;
|
|
Bar bar=this.ContainerControl as Bar;
|
|
this.Expanded=!this.Expanded;
|
|
if(bar!=null && bar.Focused)
|
|
bar.ReleaseFocus();
|
|
}
|
|
else
|
|
{
|
|
m_ParentItem.AutoExpand=true;
|
|
Bar bar=this.ContainerControl as Bar;
|
|
if(bar!=null && !bar.Focused)
|
|
bar.SetSystemFocus();
|
|
this.Expanded=!this.Expanded;
|
|
}
|
|
}
|
|
else if(this.DesignMode)
|
|
this.Expanded=!this.Expanded;
|
|
|
|
base.MouseDown(objArg);
|
|
}
|
|
|
|
/*public override void OnExpandChange()
|
|
{
|
|
base.OnExpandChange();
|
|
if(m_ParentItem!=null && !this.DesignMode)
|
|
{
|
|
if(this.Expanded)
|
|
m_ParentItem.AutoExpand=true;
|
|
else
|
|
m_ParentItem.AutoExpand=false;
|
|
}
|
|
}*/
|
|
|
|
public override void KeyDown(System.Windows.Forms.KeyEventArgs objArg)
|
|
{
|
|
base.KeyDown(objArg);
|
|
if(this.Expanded)
|
|
return;
|
|
|
|
if(objArg.KeyCode==System.Windows.Forms.Keys.Enter || objArg.KeyCode==System.Windows.Forms.Keys.Return || objArg.KeyCode==System.Windows.Forms.Keys.Down)
|
|
{
|
|
if(SubItemsCount>0)
|
|
{
|
|
if(m_ParentItem!=null)
|
|
m_ParentItem.AutoExpand=true;
|
|
this.Expanded=true;
|
|
objArg.Handled=true;
|
|
return;
|
|
}
|
|
}
|
|
else if(objArg.KeyCode==System.Windows.Forms.Keys.Escape)
|
|
{
|
|
if(SubItemsCount>0 && this.Expanded)
|
|
{
|
|
if(m_ParentItem!=null)
|
|
m_ParentItem.AutoExpand=false;
|
|
this.Expanded=false;
|
|
objArg.Handled=true;
|
|
return;
|
|
}
|
|
}
|
|
|
|
//base.KeyDown(objArg);
|
|
}
|
|
|
|
protected virtual Font GetFont()
|
|
{
|
|
System.Windows.Forms.Control objCtrl=this.ContainerControl as System.Windows.Forms.Control;
|
|
if(objCtrl!=null)
|
|
return (Font)objCtrl.Font;
|
|
return (Font)System.Windows.Forms.SystemInformation.MenuFont;
|
|
}
|
|
|
|
/*public override void KeyDown(System.Windows.Forms.KeyEventArgs objArg)
|
|
{
|
|
base.KeyDown(objArg);
|
|
if(!m_Expanded && (objArg.KeyCode==System.Windows.Forms.Keys.Enter || objArg.KeyCode==System.Windows.Forms.Keys.Return))
|
|
{
|
|
if(m_ParentItem!=null)
|
|
m_ParentItem.AutoExpand=true;
|
|
this.Expanded=true;
|
|
}
|
|
if(this.Expanded)
|
|
{
|
|
m_Popup.ExKeyDown(objArg);
|
|
}
|
|
}*/
|
|
|
|
/*public override void OnExpandedChange()
|
|
{
|
|
System.Windows.Forms.Control objCtrl=this.ContainerControl as System.Windows.Forms.Control;
|
|
|
|
if(!m_Expanded && m_Popup!=null)
|
|
{
|
|
ClosePopupMenu();
|
|
}
|
|
|
|
this.Refresh();
|
|
|
|
if(m_Expanded && m_Popup==null)
|
|
{
|
|
if(IsHandleValid(objCtrl))
|
|
{
|
|
Point p=new Point(m_Rect.Left,m_Rect.Top+m_Rect.Height-1), ps;
|
|
ps=objCtrl.PointToScreen(p);
|
|
PopupMenu(ps);
|
|
}
|
|
}
|
|
objCtrl=null;
|
|
}*/
|
|
|
|
/*public void PopupMenu(Point p)
|
|
{
|
|
PopupMenu(p.X,p.Y);
|
|
}*/
|
|
|
|
/*public virtual void PopupMenu(int x, int y)
|
|
{
|
|
if(m_Popup!=null)
|
|
ClosePopupMenu();
|
|
|
|
if(m_Popup==null)
|
|
{
|
|
m_Popup=new PopupMenu();
|
|
m_Popup.ParentItem=this;
|
|
m_Popup.SideBar=m_SideBar;
|
|
m_Popup.CreateControl();
|
|
m_Popup.RecalcSize();
|
|
}
|
|
|
|
// Make sure that menu is on-screen
|
|
System.Windows.Forms.Control objCtrl=this.ContainerControl as System.Windows.Forms.Control;
|
|
System.Windows.Forms.Screen objScreen=null;
|
|
if(IsHandleValid(objCtrl))
|
|
{
|
|
objScreen=System.Windows.Forms.Screen.FromControl(objCtrl);
|
|
}
|
|
else
|
|
objScreen=System.Windows.Forms.Screen.FromPoint(new Point(x,y));
|
|
|
|
if(x+m_Popup.Width>objScreen.WorkingArea.Right)
|
|
{
|
|
x=x-((x+m_Popup.Width)-objScreen.WorkingArea.Right);
|
|
}
|
|
// Try to fit whole popup menu "nicely"
|
|
if(y+m_Popup.Height>objScreen.WorkingArea.Bottom)
|
|
{
|
|
// If this container is displayed then try to put it above the menu item
|
|
if(this.Displayed &&IsHandleValid(objCtrl))
|
|
{
|
|
Point p=new Point(m_Rect.Left,m_Rect.Top), ps;
|
|
ps=objCtrl.PointToScreen(p);
|
|
ps.Y+=2;
|
|
if(ps.Y-m_Popup.Height>=objScreen.WorkingArea.Top)
|
|
y=ps.Y-m_Popup.Height;
|
|
}
|
|
else
|
|
{
|
|
y=objScreen.WorkingArea.Bottom-m_Popup.Height;
|
|
if(y<0)
|
|
y=0;
|
|
}
|
|
}
|
|
// If it still does not fit at this point, container will scale itself properly
|
|
// And allow item scrolling
|
|
|
|
m_Popup.Location=new Point(x,y);
|
|
m_Popup.Show();
|
|
m_Expanded=true;
|
|
|
|
Bar bar=objCtrl as Bar;
|
|
if(bar==null || bar.BarState!=eBarState.Popup)
|
|
{
|
|
System.Windows.Forms.Application.AddMessageFilter(this);
|
|
m_FilterInstalled=true;
|
|
}
|
|
bar=null;
|
|
}*/
|
|
|
|
/*public virtual void ClosePopupMenu()
|
|
{
|
|
if(m_Popup!=null)
|
|
{
|
|
if(m_FilterInstalled)
|
|
System.Windows.Forms.Application.RemoveMessageFilter(this);
|
|
m_Popup.Hide();
|
|
m_Popup.Dispose();
|
|
m_Popup=null;
|
|
}
|
|
m_Expanded=false;
|
|
}*/
|
|
|
|
// public override void LostFocus()
|
|
// {
|
|
// base.LostFocus();
|
|
// if(m_Expanded)
|
|
// {
|
|
// this.Expanded=false;
|
|
// if(m_ParentItem!=null)
|
|
// m_ParentItem.AutoExpand=false;
|
|
// }
|
|
// }
|
|
|
|
// public override void SubItemSizeChanged(BaseItem objChildItem)
|
|
// {
|
|
// if(m_Popup!=null)
|
|
// {
|
|
// m_Popup.RecalcSize();
|
|
// m_Popup.Refresh();
|
|
// }
|
|
// }
|
|
|
|
|
|
// public bool PreFilterMessage(ref System.Windows.Forms.Message m)
|
|
// {
|
|
// // Block all the messages relating to the left mouse button.
|
|
// if ((m.Msg >= NativeFunctions.WM_LBUTTONDOWN && m.Msg <= NativeFunctions.WM_LBUTTONDBLCLK) ||
|
|
// (m.Msg>=NativeFunctions.WM_NCLBUTTONDOWN && m.Msg<=NativeFunctions.WM_NCMBUTTONDBLCLK))
|
|
// {
|
|
// System.Windows.Forms.Control objCtrl=this.ContainerControl as System.Windows.Forms.Control;
|
|
//
|
|
// bool bChildHandle=this.IsAnyOnHandle(m.HWnd.ToInt32());
|
|
//
|
|
// if(objCtrl!=null && m.HWnd!=objCtrl.Handle && !bChildHandle)
|
|
// {
|
|
// if(m_ParentItem!=null)
|
|
// {
|
|
// if(m_Expanded)
|
|
// {
|
|
// m_ParentItem.AutoExpand=false;
|
|
// }
|
|
// else
|
|
// {
|
|
// m_ParentItem.AutoExpand=true;
|
|
// }
|
|
// }
|
|
// this.Expanded=!m_Expanded;
|
|
// }
|
|
// else if(objCtrl==null && !bChildHandle)
|
|
// {
|
|
// ClosePopupMenu();
|
|
// }
|
|
// }
|
|
// else if(m.Msg==NativeFunctions.WM_ACTIVATEAPP && m.WParam.ToInt32()==0)
|
|
// {
|
|
// ClosePopupMenu();
|
|
// }
|
|
//
|
|
// return false;
|
|
// }
|
|
//
|
|
// public void PostFilterMessage(ref System.Windows.Forms.Message m)
|
|
// {
|
|
// }
|
|
}
|
|
}
|