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)
// {
// }
}
}