423 lines
16 KiB
C#
423 lines
16 KiB
C#
using System;
|
|
using System.ComponentModel;
|
|
using System.Runtime.InteropServices;
|
|
using System.Drawing.Text;
|
|
using System.Windows.Forms;
|
|
|
|
namespace DevComponents.DotNetBar
|
|
{
|
|
/// <summary>
|
|
/// Represents class with static functions that provide commonly used utility functions when working with
|
|
/// Bar objects and items hosted by Bar object.
|
|
/// </summary>
|
|
public class BarUtilities
|
|
{
|
|
#region Docking
|
|
/// <summary>
|
|
/// Sets Bar visible property and remembers the auto-hide state.
|
|
/// </summary>
|
|
/// <param name="bar">Bar to set visibility for.</param>
|
|
/// <param name="visible">true if visible otherwise false</param>
|
|
public static void SetBarVisible(Bar bar, bool visible)
|
|
{
|
|
if (bar == null || bar.Visible == visible)
|
|
return;
|
|
|
|
DotNetBarManager manager = bar.Owner as DotNetBarManager;
|
|
if (manager != null)
|
|
manager.SuspendLayout = true;
|
|
|
|
try
|
|
{
|
|
if (visible)
|
|
{
|
|
bar.Visible = true;
|
|
if (bar.PropertyBag.ContainsKey(BarPropertyBagKeys.AutoHideSetting))
|
|
{
|
|
bar.PropertyBag.Remove(BarPropertyBagKeys.AutoHideSetting);
|
|
bar.AutoHide = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (bar.PropertyBag.ContainsKey(BarPropertyBagKeys.AutoHideSetting))
|
|
bar.PropertyBag.Remove(BarPropertyBagKeys.AutoHideSetting);
|
|
// Remember auto-hide setting
|
|
if (bar.AutoHide)
|
|
bar.PropertyBag.Add(BarPropertyBagKeys.AutoHideSetting, true);
|
|
bar.CloseBar();
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
if (manager != null)
|
|
manager.SuspendLayout = false;
|
|
bar.RecalcLayout();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sets the visible property of DockContainerItem and hides the bar if the given item is the last visible item on the bar.
|
|
/// It will also automatically display the bar if bar is not visible.
|
|
/// </summary>
|
|
/// <param name="item">DockContainerItem to set visibility for.</param>
|
|
/// <param name="visible">Indicates the visibility of the item</param>
|
|
public static void SetDockContainerVisible(DevComponents.DotNetBar.DockContainerItem item, bool visible)
|
|
{
|
|
if(item==null || item.Visible==visible)
|
|
return;
|
|
|
|
DevComponents.DotNetBar.Bar containerBar=item.ContainerControl as DevComponents.DotNetBar.Bar;
|
|
|
|
if(containerBar==null)
|
|
{
|
|
// If bar has not been assigned yet just set the visible property and exit
|
|
item.Visible=visible;
|
|
return;
|
|
}
|
|
|
|
DotNetBarManager manager=containerBar.Owner as DotNetBarManager;
|
|
if(manager!=null)
|
|
manager.SuspendLayout=true;
|
|
|
|
try
|
|
{
|
|
int visibleCount=containerBar.VisibleItemCount;
|
|
|
|
if(visible)
|
|
{
|
|
item.Visible=true;
|
|
if(!containerBar.AutoHide && !containerBar.Visible && visibleCount<=1)
|
|
{
|
|
containerBar.Visible=true;
|
|
if(containerBar.PropertyBag.ContainsKey(BarPropertyBagKeys.AutoHideSetting))
|
|
{
|
|
containerBar.PropertyBag.Remove(BarPropertyBagKeys.AutoHideSetting);
|
|
containerBar.AutoHide=true;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (visibleCount <= 1)
|
|
{
|
|
if (containerBar.PropertyBag.ContainsKey(BarPropertyBagKeys.AutoHideSetting))
|
|
containerBar.PropertyBag.Remove(BarPropertyBagKeys.AutoHideSetting);
|
|
// Remember auto-hide setting
|
|
if (containerBar.AutoHide)
|
|
containerBar.PropertyBag.Add(BarPropertyBagKeys.AutoHideSetting, true);
|
|
containerBar.CloseBar();
|
|
}
|
|
item.Visible=false;
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
if(manager!=null)
|
|
manager.SuspendLayout=false;
|
|
containerBar.RecalcLayout();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates new instance of the bar and sets its properties so bar can be used as Document bar.
|
|
/// </summary>
|
|
/// <returns>Returns new instance of the bar.</returns>
|
|
public static Bar CreateDocumentBar()
|
|
{
|
|
Bar bar=new Bar();
|
|
BarUtilities.InitializeDocumentBar(bar);
|
|
return bar;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sets the properties on a bar so it can be used as Document bar.
|
|
/// </summary>
|
|
/// <param name="bar">Bar to set properties of.</param>
|
|
public static void InitializeDocumentBar(Bar bar)
|
|
{
|
|
TypeDescriptor.GetProperties(bar)["LayoutType"].SetValue(bar,eLayoutType.DockContainer);
|
|
TypeDescriptor.GetProperties(bar)["DockTabAlignment"].SetValue(bar,eTabStripAlignment.Top);
|
|
TypeDescriptor.GetProperties(bar)["AlwaysDisplayDockTab"].SetValue(bar,true);
|
|
TypeDescriptor.GetProperties(bar)["Stretch"].SetValue(bar,true);
|
|
TypeDescriptor.GetProperties(bar)["GrabHandleStyle"].SetValue(bar,eGrabHandleStyle.None);
|
|
TypeDescriptor.GetProperties(bar)["CanDockBottom"].SetValue(bar,false);
|
|
TypeDescriptor.GetProperties(bar)["CanDockTop"].SetValue(bar,false);
|
|
TypeDescriptor.GetProperties(bar)["CanDockLeft"].SetValue(bar,false);
|
|
TypeDescriptor.GetProperties(bar)["CanDockRight"].SetValue(bar,false);
|
|
TypeDescriptor.GetProperties(bar)["CanDockDocument"].SetValue(bar,true);
|
|
TypeDescriptor.GetProperties(bar)["CanUndock"].SetValue(bar,false);
|
|
TypeDescriptor.GetProperties(bar)["CanHide"].SetValue(bar,true);
|
|
TypeDescriptor.GetProperties(bar)["CanCustomize"].SetValue(bar,false);
|
|
TypeDescriptor.GetProperties(bar)["TabNavigation"].SetValue(bar,true);
|
|
}
|
|
|
|
#region Win API
|
|
[DllImport("user32")]
|
|
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
|
|
[DllImport("user32")]
|
|
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
|
|
private const int GWL_EXSTYLE = (-20);
|
|
private const int WS_EX_CLIENTEDGE = 0x00000200;
|
|
[DllImport("user32")]
|
|
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
|
|
const int SWP_FRAMECHANGED = 0x0020;
|
|
const int SWP_NOSIZE = 0x0001;
|
|
const int SWP_NOMOVE = 0x0002;
|
|
const int SWP_NOZORDER = 0x0004;
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// Changes the MDI Client border edge to remove 3D border or to add it.
|
|
/// </summary>
|
|
/// <param name="c">Reference to MDI Client object.</param>
|
|
/// <param name="removeBorder">Indicates whether to remove border.</param>
|
|
public static void ChangeMDIClientBorder(System.Windows.Forms.MdiClient c, bool removeBorder)
|
|
{
|
|
if (c != null)
|
|
{
|
|
int exStyle = GetWindowLong(c.Handle, GWL_EXSTYLE);
|
|
|
|
if(removeBorder)
|
|
exStyle ^= WS_EX_CLIENTEDGE;
|
|
else
|
|
exStyle |= WS_EX_CLIENTEDGE;
|
|
|
|
SetWindowLong(c.Handle, GWL_EXSTYLE, exStyle);
|
|
SetWindowPos(c.Handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Changes the MDI Client border edge to remove 3D border or to add it.
|
|
/// </summary>
|
|
/// <param name="c">Reference to MDI parent form.</param>
|
|
/// <param name="removeBorder">Indicates whether to remove border.</param>
|
|
public static void ChangeMDIClientBorder(System.Windows.Forms.Form c, bool removeBorder)
|
|
{
|
|
if (c.IsMdiContainer && c.IsHandleCreated)
|
|
{
|
|
foreach (System.Windows.Forms.Control control in c.Controls)
|
|
{
|
|
if (control is System.Windows.Forms.MdiClient)
|
|
{
|
|
ChangeMDIClientBorder(control as System.Windows.Forms.MdiClient, removeBorder);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region Item Invalidate
|
|
internal static void InvalidateFontChange(SubItemsCollection col)
|
|
{
|
|
foreach (BaseItem item in col)
|
|
{
|
|
InvalidateFontChange(item);
|
|
}
|
|
}
|
|
|
|
internal static void InvalidateFontChange(BaseItem item)
|
|
{
|
|
if (item.TextMarkupBody != null) item.TextMarkupBody.InvalidateElementsSize();
|
|
if (item.SubItems.Count > 0) InvalidateFontChange(item.SubItems);
|
|
}
|
|
#endregion
|
|
|
|
internal static void InvokeRecalcLayout(System.Windows.Forms.Control control)
|
|
{
|
|
if (control is Bar)
|
|
((Bar)control).RecalcLayout();
|
|
else if (control is ItemControl)
|
|
((ItemControl)control).RecalcLayout();
|
|
else if (control is BaseItemControl)
|
|
((BaseItemControl)control).RecalcLayout();
|
|
else if (control is ExplorerBar)
|
|
((ExplorerBar)control).RecalcLayout();
|
|
else if (control is SideBar)
|
|
((SideBar)control).RecalcLayout();
|
|
}
|
|
|
|
private static volatile bool _FadeAnimatorEnabled = true;
|
|
/// <summary>
|
|
/// Gets or sets whether Fade Animation is enabled on system level for DotNetBar items which use this. Default value is true.
|
|
/// </summary>
|
|
public static bool FadeAnimatorEnabled
|
|
{
|
|
get { return _FadeAnimatorEnabled; }
|
|
set { _FadeAnimatorEnabled = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets whether StringFormat internally used by all DotNetBar controls to render text is GenericDefault. Default value is false
|
|
/// which indicates that GenericTypographic is used.
|
|
/// </summary>
|
|
public static bool UseGenericDefaultStringFormat
|
|
{
|
|
get { return TextDrawing.UseGenericDefault; }
|
|
set { TextDrawing.UseGenericDefault = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the anti-alias text rendering hint that will be used to render text on controls that have AntiAlias property set to true.
|
|
/// </summary>
|
|
public static TextRenderingHint AntiAliasTextRenderingHint
|
|
{
|
|
get
|
|
{
|
|
return DisplayHelp.AntiAliasTextRenderingHint;
|
|
}
|
|
set
|
|
{
|
|
DisplayHelp.AntiAliasTextRenderingHint = value;
|
|
}
|
|
}
|
|
|
|
#if FRAMEWORK20
|
|
/// <summary>
|
|
/// Gets or sets whether .NET Framework TextRenderer class is used for text rendering instead of Graphics.DrawString.
|
|
/// Default value is false.
|
|
/// Using TextRenderer will disable the Fade and Animation effects on controls because of issues in TextRenderer when drawing text on transparent
|
|
/// surfaces.
|
|
/// </summary>
|
|
public static bool UseTextRenderer
|
|
{
|
|
get { return TextDrawing.UseTextRenderer; }
|
|
set { TextDrawing.UseTextRenderer = value; }
|
|
}
|
|
#endif
|
|
|
|
|
|
private static bool _AlwaysGenerateAccessibilityFocusEvent = false;
|
|
/// <summary>
|
|
/// Gets or sets whether items always generate the Focus accessibility event when mouse enters the item. Default value is false which indicates
|
|
/// that focus event will be raised only when item is on menu bar.
|
|
/// </summary>
|
|
public static bool AlwaysGenerateAccessibilityFocusEvent
|
|
{
|
|
get { return _AlwaysGenerateAccessibilityFocusEvent; }
|
|
set
|
|
{
|
|
_AlwaysGenerateAccessibilityFocusEvent = value;
|
|
}
|
|
}
|
|
|
|
internal static bool IsModalFormOpen
|
|
{
|
|
get
|
|
{
|
|
#if (FRAMEWORK20)
|
|
for (int i = 0; i < System.Windows.Forms.Application.OpenForms.Count; i++)
|
|
{
|
|
System.Windows.Forms.Form form = System.Windows.Forms.Application.OpenForms[i];
|
|
if (form.Modal) return true;
|
|
}
|
|
#endif
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private static bool _AutoRemoveMessageFilter = false;
|
|
/// <summary>
|
|
/// Gets or sets whether Application Message Filter that is registered by popup controls
|
|
/// is automatically unregistered when last control is disposed. Default value is false and
|
|
/// in most cases should not be changed.
|
|
/// </summary>
|
|
public static bool AutoRemoveMessageFilter
|
|
{
|
|
get { return _AutoRemoveMessageFilter; }
|
|
set { _AutoRemoveMessageFilter = value; }
|
|
}
|
|
|
|
private static int _TextMarkupCultureSpecific = 3;
|
|
/// <summary>
|
|
/// Get or sets the text-markup padding for text measurement when running on Japanese version of Windows.
|
|
/// </summary>
|
|
public static int TextMarkupCultureSpecificPadding
|
|
{
|
|
get { return _TextMarkupCultureSpecific; }
|
|
set
|
|
{
|
|
_TextMarkupCultureSpecific = value;
|
|
}
|
|
}
|
|
|
|
private static bool _DisposeItemImages = false;
|
|
/// <summary>
|
|
/// Gets or sets whether Image and Icon resources assigned to items and controls are automatically disposed when
|
|
/// control or item is disposed. Default value is false.
|
|
/// </summary>
|
|
public static bool DisposeItemImages
|
|
{
|
|
get
|
|
{
|
|
return _DisposeItemImages;
|
|
}
|
|
set
|
|
{
|
|
_DisposeItemImages = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Disposes image reference and sets it to null.
|
|
/// </summary>
|
|
/// <param name="image">Reference to image to dispose.</param>
|
|
internal static void DisposeImage(ref System.Drawing.Image image)
|
|
{
|
|
if (image == null) return;
|
|
image.Dispose();
|
|
image = null;
|
|
}
|
|
/// <summary>
|
|
/// Disposes image reference and sets it to null.
|
|
/// </summary>
|
|
/// <param name="image">Reference to image to dispose.</param>
|
|
internal static void DisposeImage(ref System.Drawing.Icon icon)
|
|
{
|
|
if (icon == null) return;
|
|
icon.Dispose();
|
|
icon = null;
|
|
}
|
|
|
|
#region Delayed Invoke
|
|
/// <summary>
|
|
/// Invokes the method asynchronously using the WinForms Timer.
|
|
/// </summary>
|
|
/// <param name="method">Method to invoke.</param>
|
|
public static void InvokeDelayed(MethodInvoker method)
|
|
{
|
|
InvokeDelayed(method, 10);
|
|
}
|
|
/// <summary>
|
|
/// Invokes the method asynchronously using the WinForms Timer.
|
|
/// </summary>
|
|
/// <param name="method">Method to invoke.</param>
|
|
/// <param name="delayInterval">Time in milliseconds after which method is invoked.</param>
|
|
public static void InvokeDelayed(MethodInvoker method, int delayInterval)
|
|
{
|
|
Timer delayedInvokeTimer = new Timer();
|
|
delayedInvokeTimer = new Timer();
|
|
delayedInvokeTimer.Tag = method;
|
|
delayedInvokeTimer.Interval = delayInterval;
|
|
delayedInvokeTimer.Tick += new EventHandler(DelayedInvokeTimerTick);
|
|
delayedInvokeTimer.Start();
|
|
}
|
|
private static void DelayedInvokeTimerTick(object sender, EventArgs e)
|
|
{
|
|
Timer timer = (Timer)sender;
|
|
MethodInvoker method = (MethodInvoker)timer.Tag;
|
|
timer.Stop();
|
|
timer.Dispose();
|
|
method.Invoke();
|
|
}
|
|
#endregion
|
|
}
|
|
|
|
internal class BarPropertyBagKeys
|
|
{
|
|
public static string AutoHideSetting="autohide";
|
|
}
|
|
}
|