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