SourceCode/PROMS/DotNetBar Source Code/PopupItemControl.cs

1561 lines
53 KiB
C#

using System;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using DevComponents.DotNetBar.Rendering;
namespace DevComponents.DotNetBar
{
public abstract class PopupItemControl: Control, IThemeCache, IMessageHandlerClient,
IOwnerMenuSupport, IOwner, IRenderingSupport, IAccessibilitySupport, IOwnerLocalize
{
#region Events
/// <summary>
/// Occurs when popup of type container is loading.
/// </summary>
[Description("Occurs when popup of type container is loading.")]
public event EventHandler PopupContainerLoad;
/// <summary>
/// Occurs when popup of type container is unloading.
/// </summary>
[Description("Occurs when popup of type container is unloading.")]
public event EventHandler PopupContainerUnload;
/// <summary>
/// Occurs when popup item is about to open.
/// </summary>
[Description("Occurs when popup item is about to open.")]
public event EventHandler PopupOpen;
/// <summary>
/// Occurs when popup item is closing.
/// </summary>
[Description("Occurs when popup item is closing.")]
public event EventHandler PopupClose;
/// <summary>
/// Occurs just before popup window is shown.
/// </summary>
[Description("Occurs just before popup window is shown.")]
public event EventHandler PopupShowing;
/// <summary>
/// Occurs when Control is looking for translated text for one of the internal text that are
/// displayed on menus, toolbars and customize forms. You need to set Handled=true if you want
/// your custom text to be used instead of the built-in system value.
/// </summary>
public event DotNetBarManager.LocalizeStringEventHandler LocalizeString;
#endregion
#region Private Variables
private PopupItem m_PopupItem = null;
private ColorScheme m_ColorScheme = null;
private bool m_AntiAlias = false;
private bool m_FilterInstalled = false;
private bool m_MenuEventSupport = false;
private bool m_MenuFocus = false;
private Timer m_ActiveWindowTimer = null;
private IntPtr m_ForegroundWindow = IntPtr.Zero;
private IntPtr m_ActiveWindow = IntPtr.Zero;
private Hashtable m_ShortcutTable = new Hashtable();
private BaseItem m_ExpandedItem = null;
private BaseItem m_FocusItem = null;
private System.Windows.Forms.ImageList m_ImageList=null;
private System.Windows.Forms.ImageList m_ImageListMedium=null;
private System.Windows.Forms.ImageList m_ImageListLarge=null;
private bool m_DisabledImagesGrayScale = true;
// Theme Caching Support
private ThemeWindow m_ThemeWindow = null;
private ThemeRebar m_ThemeRebar = null;
private ThemeToolbar m_ThemeToolbar = null;
private ThemeHeader m_ThemeHeader = null;
private ThemeScrollBar m_ThemeScrollBar = null;
private ThemeExplorerBar m_ThemeExplorerBar = null;
private ThemeProgress m_ThemeProgress = null;
private ThemeButton m_ThemeButton = null;
private BaseItem m_DoDefaultActionItem = null;
#endregion
#region Constructor
public PopupItemControl()
{
PainterFactory.InitFactory();
if (!ColorFunctions.ColorsLoaded)
{
NativeFunctions.RefreshSettings();
NativeFunctions.OnDisplayChange();
ColorFunctions.LoadColors();
}
m_PopupItem = CreatePopupItem();
m_PopupItem.GlobalItem = false;
m_PopupItem.ContainerControl = this;
m_PopupItem.Style = eDotNetBarStyle.Office2007;
m_PopupItem.SetOwner(this);
m_ColorScheme = new ColorScheme(m_PopupItem.EffectiveStyle);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.Opaque, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(DisplayHelp.DoubleBufferFlag, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.SetStyle(ControlStyles.ContainerControl, false);
this.SetStyle(ControlStyles.Selectable, true);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (m_PopupItem != null)
{
m_PopupItem.Dispose();
//m_PopupItem = null; In designer the control keeps on being used after it has been disposed and can generate unpredictable results crashing the designer.
}
}
base.Dispose(disposing);
}
protected abstract PopupItem CreatePopupItem();
/// <summary>
/// Notifies the accessibility client applications of the specified AccessibleEvents for the specified child control.
/// </summary>
/// <param name="accEvent">The AccessibleEvents object to notify the accessibility client applications of. </param>
/// <param name="childID">The child Control to notify of the accessible event.</param>
internal void InternalAccessibilityNotifyClients(AccessibleEvents accEvent, int childID)
{
this.AccessibilityNotifyClients(accEvent, childID);
}
#endregion
#region Internal Implementation
protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
if (Dpi.RecordScalePerControl)
Dpi.SetScaling(factor);
base.ScaleControl(factor, specified);
}
#if FRAMEWORK20
protected override void OnBindingContextChanged(EventArgs e)
{
base.OnBindingContextChanged(e);
if (m_PopupItem != null) m_PopupItem.UpdateBindings();
}
#endif
protected override void OnFontChanged(EventArgs e)
{
if (m_PopupItem != null)
BarUtilities.InvalidateFontChange(m_PopupItem);
base.OnFontChanged(e);
this.RecalcLayout();
}
protected override void OnEnabledChanged(EventArgs e)
{
if (m_PopupItem != null) m_PopupItem.Enabled = this.Enabled;
base.OnEnabledChanged(e);
}
protected internal virtual ColorScheme GetColorScheme()
{
if (BarFunctions.IsOffice2007Style(this.Style))
{
BaseRenderer r = GetRenderer();
if (r is Office2007Renderer)
return ((Office2007Renderer)r).ColorTable.LegacyColors;
}
return m_ColorScheme;
}
/// <summary>
/// Forces the button to perform internal layout.
/// </summary>
public void RecalcLayout()
{
RecalcSize();
this.Invalidate();
}
protected abstract void RecalcSize();
[EditorBrowsable(EditorBrowsableState.Never)]
public void SetDesignMode(bool value)
{
if (m_PopupItem != null)
m_PopupItem.SetDesignMode(value);
}
/// <summary>
/// Gets/Sets the visual style for the button.
/// </summary>
[Category("Appearance"), Description("Specifies the visual style of the button."), DefaultValue(eDotNetBarStyle.Office2007)]
public virtual eDotNetBarStyle Style
{
get { return (InternalStyle); }
set { InternalStyle = value; }
}
protected eDotNetBarStyle InternalStyle
{
get
{
return m_PopupItem.Style;
}
set
{
m_ColorScheme.Style = value;
m_PopupItem.Style = value;
OnDotNetBarStyleChanged();
this.RecalcLayout();
}
}
protected virtual void OnDotNetBarStyleChanged() { }
/// <summary>
/// Creates the Graphics object for the control.
/// </summary>
/// <returns>The Graphics object for the control.</returns>
public new Graphics CreateGraphics()
{
Graphics g = base.CreateGraphics();
if (m_AntiAlias)
{
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
#if FRAMEWORK20
if (!SystemInformation.IsFontSmoothingEnabled)
#endif
g.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint;
}
return g;
}
internal virtual ItemPaintArgs GetItemPaintArgs(Graphics g)
{
ItemPaintArgs pa = new ItemPaintArgs(this, this, g, GetColorScheme());
pa.Renderer = this.GetRenderer();
pa.ButtonStringFormat = pa.ButtonStringFormat & ~(pa.ButtonStringFormat & eTextFormat.SingleLine);
pa.ButtonStringFormat |= (eTextFormat.WordBreak | eTextFormat.EndEllipsis);
return pa;
}
private Rendering.BaseRenderer m_DefaultRenderer = null;
private Rendering.BaseRenderer m_Renderer = null;
private eRenderMode m_RenderMode = eRenderMode.Global;
/// <summary>
/// Returns the renderer control will be rendered with.
/// </summary>
/// <returns>The current renderer.</returns>
public virtual Rendering.BaseRenderer GetRenderer()
{
if (m_RenderMode == eRenderMode.Global && Rendering.GlobalManager.Renderer != null)
return Rendering.GlobalManager.Renderer;
else if (m_RenderMode == eRenderMode.Custom && m_Renderer != null)
return m_Renderer;
if (m_DefaultRenderer == null)
{
if (BarFunctions.IsOffice2007Style(this.Style))
m_DefaultRenderer = new Rendering.Office2007Renderer();
//else
// m_DefaultRenderer = new Rendering.Office12Renderer();
}
return m_Renderer;
}
/// <summary>
/// Gets or sets the rendering mode used by control. Default value is eRenderMode.Global which means that static GlobalManager.Renderer is used. If set to Custom then Renderer property must
/// also be set to the custom renderer that will be used.
/// </summary>
[Browsable(false), DefaultValue(eRenderMode.Global)]
public eRenderMode RenderMode
{
get { return m_RenderMode; }
set
{
if (m_RenderMode != value)
{
m_RenderMode = value;
this.Invalidate(true);
}
}
}
/// <summary>
/// Gets or sets the custom renderer used by the items on this control. RenderMode property must also be set to eRenderMode.Custom in order renderer
/// specified here to be used.
/// </summary>
[Browsable(false), DefaultValue(null)]
public DevComponents.DotNetBar.Rendering.BaseRenderer Renderer
{
get
{
return m_Renderer;
}
set { m_Renderer = value; }
}
/// <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
{
if (m_AntiAlias != value)
{
m_AntiAlias = value;
InvalidateAutoSize();
this.Invalidate();
}
}
}
protected virtual void InvalidateAutoSize()
{
}
/// <summary>
/// Gets or sets button Color Scheme. ColorScheme does not apply to Office2007 styled buttons.
/// </summary>
[Browsable(false), DevCoBrowsable(false), Category("Appearance"), Description("Gets or sets Bar Color Scheme."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ColorScheme ColorScheme
{
get { return m_ColorScheme; }
set
{
if (value == null)
throw new ArgumentException("NULL is not a valid value for this property.");
m_ColorScheme = value;
if (this.Visible)
this.Invalidate();
}
}
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
private bool ShouldSerializeColorScheme()
{
return m_ColorScheme.SchemeChanged;
}
/// <summary>
/// Specifies whether button is drawn using Windows Themes when running on OS that supports themes like Windows XP.
/// </summary>
[Browsable(true), DevCoBrowsable(true), DefaultValue(false), Category("Appearance"), Description("Specifies whether button is drawn using Themes when running on OS that supports themes like Windows XP.")]
public virtual bool ThemeAware
{
get { return m_PopupItem.ThemeAware; }
set
{
m_PopupItem.ThemeAware = value;
this.RecalcLayout();
}
}
/// <summary>
/// Gets whether Windows Themes should be used to draw the button.
/// </summary>
protected bool IsThemed
{
get
{
if (ThemeAware && m_PopupItem.EffectiveStyle != eDotNetBarStyle.Office2000 && BarFunctions.ThemedOS && Themes.ThemesActive)
return true;
return false;
}
}
[EditorBrowsable(EditorBrowsableState.Never), Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public BaseItem InternalItem
{
get { return m_PopupItem; }
}
#endregion
#region IOwnerMenuSupport Implementation
private bool m_UseHook = false;
/// <summary>
/// Gets or sets whether hooks are used for internal DotNetBar system functionality. Using hooks is recommended only if DotNetBar is used in hybrid environments like Visual Studio designers or IE.
/// </summary>
[System.ComponentModel.Browsable(false), DefaultValue(false), System.ComponentModel.Category("Behavior"), System.ComponentModel.Description("Gets or sets whether hooks are used for internal DotNetBar system functionality. Using hooks is recommended only if DotNetBar is used in hybrid environments like Visual Studio designers or IE.")]
public bool UseHook
{
get
{
return m_UseHook;
}
set
{
m_UseHook = value;
}
}
private bool GetDesignMode()
{
return this.DesignMode;
}
private Hook m_Hook = null;
// IOwnerMenuSupport
private ArrayList m_RegisteredPopups = new ArrayList();
bool IOwnerMenuSupport.PersonalizedAllVisible { get { return false; } set { } }
bool IOwnerMenuSupport.ShowFullMenusOnHover { get { return true; } set { } }
bool IOwnerMenuSupport.AlwaysShowFullMenus { get { return false; } set { } }
void IOwnerMenuSupport.RegisterPopup(PopupItem objPopup)
{
this.MenuFocus = true;
if (m_RegisteredPopups.Contains(objPopup))
return;
if (!this.GetDesignMode() && !m_UseHook)
{
if (!m_FilterInstalled)
{
MessageHandler.RegisterMessageClient(this);
m_FilterInstalled = true;
}
}
else
{
if (m_Hook == null)
{
m_Hook = new Hook(this);
}
}
if (!m_MenuEventSupport)
MenuEventSupportHook();
if (m_RegisteredPopups.Count == 0)
PopupManager.RegisterPopup((IOwnerMenuSupport)this);
m_RegisteredPopups.Add(objPopup);
if (objPopup.GetOwner() != this)
objPopup.SetOwner(this);
}
void IOwnerMenuSupport.UnregisterPopup(PopupItem objPopup)
{
if (m_RegisteredPopups.Contains(objPopup))
m_RegisteredPopups.Remove(objPopup);
if (m_RegisteredPopups.Count == 0)
{
MenuEventSupportUnhook();
if (m_Hook != null)
{
m_Hook.Dispose();
m_Hook = null;
}
PopupManager.UnregisterPopup((IOwnerMenuSupport)this);
this.MenuFocus = false;
}
}
bool IOwnerMenuSupport.RelayMouseHover()
{
foreach (PopupItem popup in m_RegisteredPopups)
{
Control ctrl = popup.PopupControl;
if (ctrl != null && ctrl.DisplayRectangle.Contains(MousePosition))
{
if (ctrl is MenuPanel)
((MenuPanel)ctrl).InternalMouseHover();
else if (ctrl is Bar)
((Bar)ctrl).InternalMouseHover();
return true;
}
}
return false;
}
void IOwnerMenuSupport.ClosePopups()
{
ClosePopups();
}
private void ClosePopups()
{
ArrayList popupList = new ArrayList(m_RegisteredPopups);
foreach (PopupItem objPopup in popupList)
objPopup.ClosePopup();
}
// Events
void IOwnerMenuSupport.InvokePopupClose(PopupItem item, EventArgs e)
{
if (PopupClose != null)
PopupClose(item, e);
}
void IOwnerMenuSupport.InvokePopupContainerLoad(PopupItem item, EventArgs e)
{
if (PopupContainerLoad != null)
PopupContainerLoad(item, e);
}
void IOwnerMenuSupport.InvokePopupContainerUnload(PopupItem item, EventArgs e)
{
if (PopupContainerUnload != null)
PopupContainerUnload(item, e);
}
void IOwnerMenuSupport.InvokePopupOpen(PopupItem item, PopupOpenEventArgs e)
{
if (PopupOpen != null)
PopupOpen(item, e);
}
void IOwnerMenuSupport.InvokePopupShowing(PopupItem item, EventArgs e)
{
if (PopupShowing != null)
PopupShowing(item, e);
}
bool IOwnerMenuSupport.ShowPopupShadow { get { return true; } }
eMenuDropShadow IOwnerMenuSupport.MenuDropShadow { get { return eMenuDropShadow.SystemDefault; } set { } }
ePopupAnimation IOwnerMenuSupport.PopupAnimation { get { return ePopupAnimation.SystemDefault; } set { } }
bool IOwnerMenuSupport.AlphaBlendShadow { get { return true; } set { } }
internal bool MenuFocus
{
get
{
return m_MenuFocus;
}
set
{
if (m_MenuFocus != value)
{
m_MenuFocus = value;
if (m_MenuFocus)
{
SetupActiveWindowTimer();
}
else
{
ReleaseActiveWindowTimer();
ClosePopups();
}
this.Invalidate();
}
}
}
#endregion
#region Active Window Changed Handling
/// <summary>
/// Sets up timer that watches when active window changes.
/// </summary>
protected virtual void SetupActiveWindowTimer()
{
if (m_ActiveWindowTimer != null)
return;
m_ActiveWindowTimer = new Timer();
m_ActiveWindowTimer.Interval = 100;
m_ActiveWindowTimer.Tick += new EventHandler(ActiveWindowTimer_Tick);
m_ForegroundWindow = NativeFunctions.GetForegroundWindow();
m_ActiveWindow = NativeFunctions.GetActiveWindow();
m_ActiveWindowTimer.Start();
}
private void ActiveWindowTimer_Tick(object sender, EventArgs e)
{
if (m_ActiveWindowTimer == null)
return;
IntPtr f = NativeFunctions.GetForegroundWindow();
IntPtr a = NativeFunctions.GetActiveWindow();
if (f != m_ForegroundWindow || a != m_ActiveWindow)
{
Control c = Control.FromChildHandle(a);
if (c != null)
{
do
{
if ((c is MenuPanel || c is Bar || c is PopupContainer || c is PopupContainerControl))
return;
c = c.Parent;
} while (c!=null && c.Parent != null);
}
m_ActiveWindowTimer.Stop();
OnActiveWindowChanged();
}
}
/// <summary>
/// Called after change of active window has been detected. SetupActiveWindowTimer must be called to enable detection.
/// </summary>
protected virtual void OnActiveWindowChanged()
{
if (this.MenuFocus)
this.MenuFocus = false;
}
/// <summary>
/// Releases and disposes the active window watcher timer.
/// </summary>
protected virtual void ReleaseActiveWindowTimer()
{
if (m_ActiveWindowTimer != null)
{
Timer timer = m_ActiveWindowTimer;
m_ActiveWindowTimer = null;
timer.Stop();
timer.Tick -= new EventHandler(ActiveWindowTimer_Tick);
timer.Dispose();
}
}
#endregion
#region IMessageHandlerClient Implementation
bool IMessageHandlerClient.IsModal
{
get
{
Form form = this.FindForm();
if (form != null && form.Modal && Form.ActiveForm == form)
return true;
return false;
}
}
bool IMessageHandlerClient.OnMouseWheel(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
{
return OnMouseWheel(hWnd, wParam, lParam);
}
protected virtual bool OnMouseWheel(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
{
return false;
}
bool IMessageHandlerClient.OnKeyDown(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
{
return OnKeyDown(hWnd, wParam, lParam);
}
protected virtual bool EatMenuFilterKeyDown
{
get
{
return true;
}
}
protected virtual bool OnKeyDown(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
{
int wParamInt = WinApi.ToInt(wParam);
if (m_RegisteredPopups.Count > 0)
{
if (((BaseItem)m_RegisteredPopups[m_RegisteredPopups.Count - 1]).Parent == null)
{
PopupItem objItem = (PopupItem)m_RegisteredPopups[m_RegisteredPopups.Count - 1];
Control ctrl = objItem.PopupControl as Control;
Control ctrl2 = FromChildHandle(hWnd);
if (ctrl2 != null)
{
while (ctrl2.Parent != null)
ctrl2 = ctrl2.Parent;
}
bool bIsOnHandle = false;
if (ctrl2 != null && objItem != null)
bIsOnHandle = objItem.IsAnyOnHandle(ctrl2.Handle);
bool bNoEat = ctrl != null && ctrl2 != null && ctrl.Handle == ctrl2.Handle || bIsOnHandle;
if (!bIsOnHandle)
{
Keys key = (Keys)NativeFunctions.MapVirtualKey((uint)wParam, 2);
if (key == Keys.None)
key = (Keys)wParamInt;
KeyEventArgs keyArgs = new KeyEventArgs(key | Control.ModifierKeys);
objItem.InternalKeyDown(keyArgs);
if (keyArgs.Handled) bNoEat = false;
if (!EatMenuFilterKeyDown) bNoEat = true;
}
// Don't eat the message if the pop-up window has focus
if (bNoEat)
return false;
return true;
}
}
if (this.MenuFocus)
{
bool bPassToMenu = true;
Control ctrl2 = Control.FromChildHandle(hWnd);
if (ctrl2 != null)
{
while (ctrl2.Parent != null)
ctrl2 = ctrl2.Parent;
if ((ctrl2 is MenuPanel || ctrl2 is ItemControl || ctrl2 is PopupContainer || ctrl2 is PopupContainerControl) && ctrl2.Handle != hWnd)
bPassToMenu = false;
}
if (bPassToMenu)
{
Keys key = (Keys)NativeFunctions.MapVirtualKey((uint)wParam, 2);
if (key == Keys.None)
key = (Keys)wParamInt;
m_PopupItem.InternalKeyDown(new KeyEventArgs(key));
return true;
}
}
if (!this.IsParentFormActive)
return false;
if (wParamInt >= 0x70 || ModifierKeys != Keys.None || (WinApi.ToInt(lParam) & 0x1000000000) != 0 || wParamInt == 0x2E || wParamInt == 0x2D) // 2E=VK_DELETE, 2D=VK_INSERT
{
int i = (int)ModifierKeys | wParamInt;
return ProcessShortcut((eShortcut)i);
}
return false;
}
private bool ProcessShortcut(eShortcut key)
{
foreach (eShortcut k in m_PopupItem.Shortcuts)
{
if (k == key)
{
PerformClick();
return true;
}
}
return BarFunctions.ProcessItemsShortcuts(key, m_ShortcutTable);
}
/// <summary>
/// Generates a Click event for the control.
/// </summary>
public abstract void PerformClick();
protected bool IsParentFormActive
{
get
{
// Process only if parent form is active
Form form = this.FindForm();
if (form == null)
return false;
if (form.IsMdiChild)
{
if (form.MdiParent == null)
return false;
if (form.MdiParent.ActiveMdiChild != form)
return false;
}
else if (form != Form.ActiveForm)
return false;
return true;
}
}
private PopupDelayedClose m_DelayClose = null;
private PopupDelayedClose GetDelayClose()
{
if (m_DelayClose == null)
m_DelayClose = new PopupDelayedClose();
return m_DelayClose;
}
internal void DesignerNewItemAdded()
{
this.GetDelayClose().EraseDelayClose();
}
bool IMessageHandlerClient.OnMouseDown(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
{
if (m_RegisteredPopups.Count == 0)
return false;
BaseItem[] popups = new BaseItem[m_RegisteredPopups.Count];
m_RegisteredPopups.CopyTo(popups);
for (int i = popups.Length - 1; i >= 0; i--)
{
PopupItem objPopup = popups[i] as PopupItem;
bool bChildHandle = objPopup.IsAnyOnHandle(hWnd);
if (!bChildHandle)
{
System.Windows.Forms.Control cTmp = System.Windows.Forms.Control.FromChildHandle(hWnd);
if (cTmp != null)
{
if (cTmp is MenuPanel)
{
bChildHandle = true;
}
else
{
while (cTmp.Parent != null)
{
cTmp = cTmp.Parent;
if (cTmp.GetType().FullName.IndexOf("DropDownHolder") >= 0 || cTmp is MenuPanel || cTmp is PopupContainerControl)
{
bChildHandle = true;
break;
}
}
}
if (!bChildHandle)
bChildHandle = objPopup.IsAnyOnHandle(cTmp.Handle);
}
else
{
string s = NativeFunctions.GetClassName(hWnd);
s = s.ToLower();
if (s.IndexOf("combolbox") >= 0)
bChildHandle = true;
}
}
if (!bChildHandle)
{
Control popupContainer = objPopup.PopupControl;
if (popupContainer != null)
while (popupContainer.Parent != null) popupContainer = popupContainer.Parent;
if (popupContainer != null && popupContainer.Bounds.Contains(Control.MousePosition))
bChildHandle = true;
}
if (bChildHandle)
break;
if (objPopup.Displayed)
{
// Do not close if mouse is inside the popup parent button
Point p = this.PointToClient(MousePosition);
if (objPopup.DisplayRectangle.Contains(p))
break;
}
if (this.GetDesignMode())
{
this.GetDelayClose().DelayClose(objPopup);
}
else if(QueryPopupCloseMouseDown())
objPopup.ClosePopup();
if (m_RegisteredPopups.Count == 0)
break;
}
if (m_RegisteredPopups.Count == 0)
this.MenuFocus = false;
return false;
}
protected virtual bool QueryPopupCloseMouseDown()
{
return true;
}
bool IMessageHandlerClient.OnMouseMove(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
{
if (m_RegisteredPopups.Count > 0)
{
foreach (BaseItem item in m_RegisteredPopups)
{
if (item.Parent == null)
{
Control ctrl = ((PopupItem)item).PopupControl;
if (ctrl != null && ctrl.Handle != hWnd && !item.IsAnyOnHandle(hWnd) && !(ctrl.Parent != null && ctrl.Parent.Handle != hWnd))
return true;
}
}
}
return false;
}
bool IMessageHandlerClient.OnSysKeyDown(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
{
return OnSysKeyDown(hWnd, wParam, lParam);
}
protected virtual bool OnSysKeyDown(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
{
if (!this.GetDesignMode())
{
// Check Shortcuts
int wParamInt = WinApi.ToInt(wParam);
if (ModifierKeys != Keys.None || wParamInt >= (int)eShortcut.F1 && wParamInt <= (int)eShortcut.F12)
{
int i = (int)ModifierKeys | wParamInt;
if (ProcessShortcut((eShortcut)i))
return true;
}
}
return false;
}
bool IMessageHandlerClient.OnSysKeyUp(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
{
return OnSysKeyUp(hWnd, wParam, lParam);
}
protected virtual bool OnSysKeyUp(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
{
return false;
}
private void MenuEventSupportHook()
{
if (m_MenuEventSupport)
return;
m_MenuEventSupport = true;
Form parentForm = this.FindForm();
if (parentForm == null)
{
m_MenuEventSupport = false;
return;
}
parentForm.Resize += new EventHandler(this.ParentResize);
parentForm.Deactivate += new EventHandler(this.ParentDeactivate);
DotNetBarManager.RegisterParentMsgHandler(this, parentForm);
}
private void MenuEventSupportUnhook()
{
if (!m_MenuEventSupport)
return;
m_MenuEventSupport = false;
Form parentForm = this.FindForm();
if (parentForm == null)
return;
DotNetBarManager.UnRegisterParentMsgHandler(this, parentForm);
parentForm.Resize -= new EventHandler(this.ParentResize);
parentForm.Deactivate -= new EventHandler(this.ParentDeactivate);
}
private void ParentResize(object sender, EventArgs e)
{
Form parentForm = this.FindForm();
if (parentForm != null && parentForm.WindowState == FormWindowState.Minimized)
((IOwner)this).OnApplicationDeactivate();
}
private void ParentDeactivate(object sender, EventArgs e)
{
Form parentForm = this.FindForm();
if (parentForm != null && parentForm.WindowState == FormWindowState.Minimized)
((IOwner)this).OnApplicationDeactivate();
}
#endregion
#region IThemeCache Implementation
protected override void WndProc(ref Message m)
{
if (m.Msg == NativeFunctions.WM_THEMECHANGED)
{
this.RefreshThemes();
}
else if (m.Msg == NativeFunctions.WM_USER + 107)
{
if (m_DoDefaultActionItem != null)
{
if (!m_DoDefaultActionItem._AccessibleExpandAction)
this.PerformClick();
m_DoDefaultActionItem.DoAccesibleDefaultAction();
m_DoDefaultActionItem = null;
}
}
base.WndProc(ref m);
}
protected void RefreshThemes()
{
if (m_ThemeWindow != null)
{
m_ThemeWindow.Dispose();
m_ThemeWindow = new ThemeWindow(this);
}
if (m_ThemeRebar != null)
{
m_ThemeRebar.Dispose();
m_ThemeRebar = new ThemeRebar(this);
}
if (m_ThemeToolbar != null)
{
m_ThemeToolbar.Dispose();
m_ThemeToolbar = new ThemeToolbar(this);
}
if (m_ThemeHeader != null)
{
m_ThemeHeader.Dispose();
m_ThemeHeader = new ThemeHeader(this);
}
if (m_ThemeScrollBar != null)
{
m_ThemeScrollBar.Dispose();
m_ThemeScrollBar = new ThemeScrollBar(this);
}
if (m_ThemeProgress != null)
{
m_ThemeProgress.Dispose();
m_ThemeProgress = new ThemeProgress(this);
}
if (m_ThemeExplorerBar != null)
{
m_ThemeExplorerBar.Dispose();
m_ThemeExplorerBar = new ThemeExplorerBar(this);
}
if (m_ThemeButton != null)
{
m_ThemeButton.Dispose();
m_ThemeButton = new ThemeButton(this);
}
}
private void DisposeThemes()
{
if (m_ThemeWindow != null)
{
m_ThemeWindow.Dispose();
m_ThemeWindow = null;
}
if (m_ThemeRebar != null)
{
m_ThemeRebar.Dispose();
m_ThemeRebar = null;
}
if (m_ThemeToolbar != null)
{
m_ThemeToolbar.Dispose();
m_ThemeToolbar = null;
}
if (m_ThemeHeader != null)
{
m_ThemeHeader.Dispose();
m_ThemeHeader = null;
}
if (m_ThemeScrollBar != null)
{
m_ThemeScrollBar.Dispose();
m_ThemeScrollBar = null;
}
if (m_ThemeProgress != null)
{
m_ThemeProgress.Dispose();
m_ThemeProgress = null;
}
if (m_ThemeExplorerBar != null)
{
m_ThemeExplorerBar.Dispose();
m_ThemeExplorerBar = null;
}
if (m_ThemeButton != null)
{
m_ThemeButton.Dispose();
m_ThemeButton = null;
}
}
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
if (!m_FilterInstalled && !this.DesignMode)
{
MessageHandler.RegisterMessageClient(this);
m_FilterInstalled = true;
}
#if FRAMEWORK20
if (this.AutoSize)
this.AdjustSize();
#endif
this.RecalcLayout();
}
#if FRAMEWORK20
protected virtual void AdjustSize() { }
#endif
protected override void OnHandleDestroyed(EventArgs e)
{
DisposeThemes();
MenuEventSupportUnhook();
base.OnHandleDestroyed(e);
if (m_FilterInstalled)
{
MessageHandler.UnregisterMessageClient(this);
m_FilterInstalled = false;
}
}
ThemeWindow IThemeCache.ThemeWindow
{
get
{
if (m_ThemeWindow == null)
m_ThemeWindow = new ThemeWindow(this);
return m_ThemeWindow;
}
}
ThemeRebar IThemeCache.ThemeRebar
{
get
{
if (m_ThemeRebar == null)
m_ThemeRebar = new ThemeRebar(this);
return m_ThemeRebar;
}
}
ThemeToolbar IThemeCache.ThemeToolbar
{
get
{
if (m_ThemeToolbar == null)
m_ThemeToolbar = new ThemeToolbar(this);
return m_ThemeToolbar;
}
}
ThemeHeader IThemeCache.ThemeHeader
{
get
{
if (m_ThemeHeader == null)
m_ThemeHeader = new ThemeHeader(this);
return m_ThemeHeader;
}
}
ThemeScrollBar IThemeCache.ThemeScrollBar
{
get
{
if (m_ThemeScrollBar == null)
m_ThemeScrollBar = new ThemeScrollBar(this);
return m_ThemeScrollBar;
}
}
ThemeExplorerBar IThemeCache.ThemeExplorerBar
{
get
{
if (m_ThemeExplorerBar == null)
m_ThemeExplorerBar = new ThemeExplorerBar(this);
return m_ThemeExplorerBar;
}
}
ThemeProgress IThemeCache.ThemeProgress
{
get
{
if (m_ThemeProgress == null)
m_ThemeProgress = new ThemeProgress(this);
return m_ThemeProgress;
}
}
ThemeButton IThemeCache.ThemeButton
{
get
{
if (m_ThemeButton == null)
m_ThemeButton = new ThemeButton(this);
return m_ThemeButton;
}
}
#endregion
#region IOwner Implementation
/// <summary>
/// Gets or sets the form button is attached to.
/// </summary>
Form IOwner.ParentForm
{
get
{
return base.FindForm();
}
set { }
}
/// <summary>
/// Returns the collection of items with the specified name. This member is not implemented and should not be used.
/// </summary>
/// <param name="ItemName">Item name to look for.</param>
/// <returns></returns>
ArrayList IOwner.GetItems(string ItemName)
{
ArrayList list = new ArrayList(15);
BarFunctions.GetSubItemsByName(m_PopupItem, ItemName, list);
return list;
}
/// <summary>
/// Returns the collection of items with the specified name and type. This member is not implemented and should not be used.
/// </summary>
/// <param name="ItemName">Item name to look for.</param>
/// <param name="itemType">Item type to look for.</param>
/// <returns></returns>
ArrayList IOwner.GetItems(string ItemName, Type itemType)
{
ArrayList list = new ArrayList(15);
BarFunctions.GetSubItemsByNameAndType(m_PopupItem, ItemName, list, itemType);
return list;
}
/// <summary>
/// Returns the collection of items with the specified name and type. This member is not implemented and should not be used.
/// </summary>
/// <param name="ItemName">Item name to look for.</param>
/// <param name="itemType">Item type to look for.</param>
/// <param name="useGlobalName">Indicates whether GlobalName property is used for searching.</param>
/// <returns></returns>
ArrayList IOwner.GetItems(string ItemName, Type itemType, bool useGlobalName)
{
ArrayList list = new ArrayList(15);
BarFunctions.GetSubItemsByNameAndType(m_PopupItem, ItemName, list, itemType, useGlobalName);
return list;
}
/// <summary>
/// Returns the first item that matches specified name. This member is not implemented and should not be used.
/// </summary>
/// <param name="ItemName">Item name to look for.</param>
/// <returns></returns>
BaseItem IOwner.GetItem(string ItemName)
{
BaseItem item = BarFunctions.GetSubItemByName(m_PopupItem, ItemName);
if (item != null)
return item;
return null;
}
// Only one Popup Item can be expanded at a time. This is used
// to track the currently expanded popup item and to close the popup item
// if another item is expanding.
void IOwner.SetExpandedItem(BaseItem objItem)
{
if (objItem != null && objItem.Parent is PopupItem)
return;
if (m_ExpandedItem != null)
{
if(objItem == null)
BaseItem.CollapseSubItemsTree(m_ExpandedItem);
if (m_ExpandedItem.Expanded)
m_ExpandedItem.Expanded = false;
m_ExpandedItem = null;
}
m_ExpandedItem = objItem;
}
BaseItem IOwner.GetExpandedItem()
{
return m_ExpandedItem;
}
// Currently we are using this to communicate "focus" when control is in
// design mode. This can be used later if we decide to add focus
// handling to our BaseItem class.
void IOwner.SetFocusItem(BaseItem objFocusItem)
{
if (m_FocusItem != null && m_FocusItem != objFocusItem)
{
m_FocusItem.OnLostFocus();
}
m_FocusItem = objFocusItem;
if (m_FocusItem != null)
m_FocusItem.OnGotFocus();
}
BaseItem IOwner.GetFocusItem()
{
return m_FocusItem;
}
void IOwner.DesignTimeContextMenu(BaseItem objItem)
{
}
bool IOwner.DesignMode
{
get { return this.GetDesignMode(); }
}
void IOwner.RemoveShortcutsFromItem(BaseItem objItem)
{
ShortcutTableEntry objEntry = null;
if (objItem.ShortcutString != "")
{
foreach (eShortcut key in objItem.Shortcuts)
{
if (m_ShortcutTable.ContainsKey(key))
{
objEntry = (ShortcutTableEntry)m_ShortcutTable[key];
try
{
objEntry.Items.Remove(objItem.Id);
if (objEntry.Items.Count == 0)
m_ShortcutTable.Remove(objEntry.Shortcut);
}
catch (ArgumentException) { }
}
}
}
IOwner owner = this as IOwner;
foreach (BaseItem objTmp in objItem.SubItems)
owner.RemoveShortcutsFromItem(objTmp);
}
void IOwner.AddShortcutsFromItem(BaseItem objItem)
{
ShortcutTableEntry objEntry = null;
if (objItem.ShortcutString != "")
{
foreach (eShortcut key in objItem.Shortcuts)
{
if (m_ShortcutTable.ContainsKey(key))
objEntry = (ShortcutTableEntry)m_ShortcutTable[objItem.Shortcuts[0]];
else
{
objEntry = new ShortcutTableEntry(key);
m_ShortcutTable.Add(objEntry.Shortcut, objEntry);
}
try
{
objEntry.Items.Add(objItem.Id, objItem);
}
catch (ArgumentException) { }
}
}
IOwner owner = this as IOwner;
foreach (BaseItem objTmp in objItem.SubItems)
owner.AddShortcutsFromItem(objTmp);
}
Form IOwner.ActiveMdiChild
{
get
{
Form form = base.FindForm();
if (form == null)
return null;
if (form.IsMdiContainer)
{
return form.ActiveMdiChild;
}
return null;
}
}
bool IOwner.AlwaysDisplayKeyAccelerators
{
get { return true; }
set { }
}
/// <summary>
/// Invokes the DotNetBar Customize dialog.
/// </summary>
void IOwner.Customize()
{
}
void IOwner.InvokeResetDefinition(BaseItem item, EventArgs e)
{
}
/// <summary>
/// Indicates whether Reset buttons is shown that allows end-user to reset the toolbar state.
/// </summary>
bool IOwner.ShowResetButton
{
get { return false; }
set { }
}
void IOwner.OnApplicationActivate() { }
void IOwner.OnApplicationDeactivate()
{
ClosePopups();
}
void IOwner.OnParentPositionChanging() { }
void IOwner.StartItemDrag(BaseItem item) { }
bool IOwner.DragInProgress
{
get { return false; }
}
BaseItem IOwner.DragItem
{
get { return null; }
}
void IOwner.InvokeUserCustomize(object sender, EventArgs e) {}
void IOwner.InvokeEndUserCustomize(object sender, EndUserCustomizeEventArgs e) { }
MdiClient IOwner.GetMdiClient(Form MdiForm)
{
return BarFunctions.GetMdiClient(MdiForm);
}
/// <summary>
/// ImageList for images used on Items. Images specified here will always be used on menu-items and are by default used on all Bars.
/// </summary>
[System.ComponentModel.Browsable(false),System.ComponentModel.Category("Data"),DefaultValue(null),System.ComponentModel.Description("ImageList for images used on Items. Images specified here will always be used on menu-items and are by default used on all Bars.")]
public System.Windows.Forms.ImageList Images
{
get
{
return m_ImageList;
}
set
{
if(m_ImageList!=null)
m_ImageList.Disposed-=new EventHandler(this.ImageListDisposed);
m_ImageList=value;
if(m_ImageList!=null)
m_ImageList.Disposed+=new EventHandler(this.ImageListDisposed);
}
}
/// <summary>
/// ImageList for medium-sized images used on Items.
/// </summary>
[System.ComponentModel.Browsable(false),System.ComponentModel.Category("Data"),DefaultValue(null),System.ComponentModel.Description("ImageList for medium-sized images used on Items.")]
public System.Windows.Forms.ImageList ImagesMedium
{
get
{
return m_ImageListMedium;
}
set
{
if(m_ImageListMedium!=null)
m_ImageListMedium.Disposed-=new EventHandler(this.ImageListDisposed);
m_ImageListMedium=value;
if(m_ImageListMedium!=null)
m_ImageListMedium.Disposed+=new EventHandler(this.ImageListDisposed);
}
}
/// <summary>
/// ImageList for large-sized images used on Items.
/// </summary>
[System.ComponentModel.Browsable(false),System.ComponentModel.Category("Data"),DefaultValue(null),System.ComponentModel.Description("ImageList for large-sized images used on Items.")]
public System.Windows.Forms.ImageList ImagesLarge
{
get
{
return m_ImageListLarge;
}
set
{
if(m_ImageListLarge!=null)
m_ImageListLarge.Disposed-=new EventHandler(this.ImageListDisposed);
m_ImageListLarge=value;
if(m_ImageListLarge!=null)
m_ImageListLarge.Disposed+=new EventHandler(this.ImageListDisposed);
}
}
private void ImageListDisposed(object sender, EventArgs e)
{
if(sender==m_ImageList)
{
m_ImageList=null;
}
else if(sender==m_ImageListLarge)
{
m_ImageListLarge=null;
}
else if(sender==m_ImageListMedium)
{
m_ImageListMedium=null;
}
}
protected override void OnParentChanged(EventArgs e)
{
base.OnParentChanged(e);
if (this.DesignMode)
m_PopupItem.SetDesignMode(this.DesignMode);
}
void IOwner.InvokeDefinitionLoaded(object sender, EventArgs e) {}
/// <summary>
/// Indicates whether Tooltips are shown on Bars and menus.
/// </summary>
//[Browsable(false), DefaultValue(true), Category("Run-time Behavior"), Description("Indicates whether Tooltips are shown on Bars and menus.")]
bool IOwner.ShowToolTips
{
get
{
return true;
}
set
{
//m_ShowToolTips = value;
}
}
/// <summary>
/// Indicates whether item shortcut is displayed in Tooltips.
/// </summary>
//[Browsable(false), DefaultValue(false), Category("Run-time Behavior"), Description("Indicates whether item shortcut is displayed in Tooltips.")]
bool IOwner.ShowShortcutKeysInToolTips
{
get
{
return true;
}
set
{
//m_ShowShortcutKeysInToolTips = value;
}
}
/// <summary>
/// Gets or sets whether gray-scale algorithm is used to create automatic gray-scale images. Default is true.
/// </summary>
[Browsable(true), DefaultValue(true), Category("Appearance"), Description("Gets or sets whether gray-scale algorithm is used to create automatic gray-scale images.")]
public virtual bool DisabledImagesGrayScale
{
get
{
return m_DisabledImagesGrayScale;
}
set
{
m_DisabledImagesGrayScale = value;
}
}
#endregion
#region IOwnerLocalize Members
void IOwnerLocalize.InvokeLocalizeString(LocalizeEventArgs e)
{
if (LocalizeString != null)
LocalizeString(this, e);
}
#endregion
#region IAccessibilitySupport Members
BaseItem IAccessibilitySupport.DoDefaultActionItem
{
get
{
return m_DoDefaultActionItem;
}
set
{
m_DoDefaultActionItem = value; ;
}
}
#endregion
}
}