254 lines
9.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel.Design;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Collections;
using System.Globalization;
using DevComponents.DotNetBar.Controls;
namespace DevComponents.DotNetBar.Design
{
/// <summary>
/// Provides design-time support for BindingNavigatorEx control.
/// </summary>
public class BindingNavigatorExDesigner : BarDesigner
{
#region Internal Implementation
private static readonly string[] ItemPropertyNames =
new string[] {
"MovePreviousButton",
"MoveFirstButton",
"MoveNextButton",
"MoveLastButton",
"AddNewRecordButton",
"DeleteButton",
"PositionTextBox",
"CountLabel" };
public override void InitializeNewComponent(IDictionary defaultValues)
{
base.InitializeNewComponent(defaultValues);
BindingNavigatorEx navigator = (BindingNavigatorEx)base.Component;
IDesignerHost designerHost = (IDesignerHost)base.Component.Site.GetService(typeof(IDesignerHost));
navigator.Dock = System.Windows.Forms.DockStyle.Top;
navigator.SuspendLayout();
navigator.AddDefaultItems();
this.SiteItems(designerHost, navigator.Items);
this.RaiseItemsChanged();
navigator.ResumeLayout();
navigator.RecalcLayout();
}
public override void Initialize(IComponent component)
{
base.Initialize(component);
IComponentChangeService service = (IComponentChangeService)this.GetService(typeof(IComponentChangeService));
if (service != null)
{
service.ComponentRemoved += ComponentRemoved;
service.ComponentChanged += ComponentChanged;
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
IComponentChangeService service = (IComponentChangeService)this.GetService(typeof(IComponentChangeService));
if (service != null)
{
service.ComponentRemoved -= this.ComponentRemoved;
service.ComponentChanged -= this.ComponentChanged;
}
}
base.Dispose(disposing);
}
private void ComponentChanged(object sender, ComponentChangedEventArgs e)
{
BindingNavigatorEx component = (BindingNavigatorEx)base.Component;
if (((e.Component != null) && (e.Component == component.CountLabel)) && ((e.Member != null) && (e.Member.Name == "Text")))
{
component.CountLabelFormat = component.CountLabel.Text;
}
}
private void ComponentRemoved(object sender, ComponentEventArgs e)
{
BaseItem item = e.Component as BaseItem;
if (item != null)
{
BindingNavigatorEx navigator = (BindingNavigatorEx)base.Component;
if (item == navigator.MoveFirstButton)
{
navigator.MoveFirstButton = null;
}
else if (item == navigator.MovePreviousButton)
{
navigator.MovePreviousButton = null;
}
else if (item == navigator.MoveNextButton)
{
navigator.MoveNextButton = null;
}
else if (item == navigator.MoveLastButton)
{
navigator.MoveLastButton = null;
}
else if (item == navigator.PositionTextBox)
{
navigator.PositionTextBox = null;
}
else if (item == navigator.CountLabel)
{
navigator.CountLabel = null;
}
else if (item == navigator.AddNewRecordButton)
{
navigator.AddNewRecordButton = null;
}
else if (item == navigator.DeleteButton)
{
navigator.DeleteButton = null;
}
}
}
private void RaiseItemsChanged()
{
BindingNavigatorEx component = (BindingNavigatorEx)base.Component;
IComponentChangeService service = (IComponentChangeService)this.GetService(typeof(IComponentChangeService));
if (service != null)
{
MemberDescriptor member = TypeDescriptor.GetProperties(component)["Items"];
service.OnComponentChanging(component, member);
service.OnComponentChanged(component, member, null, null);
foreach (string str in ItemPropertyNames)
{
PropertyDescriptor itemsDescriptor = TypeDescriptor.GetProperties(component)[str];
if (itemsDescriptor != null)
{
service.OnComponentChanging(component, itemsDescriptor);
service.OnComponentChanged(component, itemsDescriptor, null, null);
}
}
}
}
private void SiteItems(IDesignerHost host, SubItemsCollection items)
{
foreach (BaseItem item in items)
{
this.SiteItem(host, item);
}
}
private void SiteItem(IDesignerHost host, BaseItem item)
{
host.Container.Add(item, GetUniqueSiteName(host, item.Name));
item.Name = item.Site.Name;
if (item.SubItems.Count > 0)
{
this.SiteItems(host, item.SubItems);
}
}
internal static string GetUniqueSiteName(IDesignerHost host, string name)
{
if (string.IsNullOrEmpty(name))
{
return null;
}
INameCreationService service = (INameCreationService)host.GetService(typeof(INameCreationService));
if (service == null)
{
return null;
}
if (host.Container.Components[name] == null)
{
if (!service.IsValidName(name))
{
return null;
}
return name;
}
string str = name;
for (int i = 1; !service.IsValidName(str); i++)
{
str = name + i.ToString(CultureInfo.InvariantCulture);
}
return str;
}
protected override void PreFilterProperties(System.Collections.IDictionary properties)
{
base.PreFilterProperties(properties);
RemoveDescriptors(properties,
new String[] { "AlwaysDisplayDockTab",
"AlwaysDisplayKeyAccelerators",
"AutoCreateCaptionMenu",
"AutoHide",
"AutoHideAnimationTime",
"AutoHideTabTextAlwaysVisible",
"AutoSyncBarCaption",
"BarType",
"CanAutoHide",
"CanCustomize",
"CanDockBottom",
"CanDockDocument",
"CanDockLeft",
"CanDockRight",
"CanDockTab",
"CanDockTop",
"CanDockHide",
"CanReorderTabs",
"CanUndock",
"CaptionHeight",
"CloseSingleTab",
"DisplayMoreItemsOnMenu",
"DockOrientation",
"DockTabAlignment",
"DockTabCloseButtonVisible",
"DockTabStripHeight",
"EqualButtonSize",
"LayoutType",
"MenuBar",
"SaveLayoutChanges",
"SelectedDockTab",
"TabNavigation",
"WrapItemsDock" });
}
private void RemoveDescriptors(System.Collections.IDictionary properties, String[] propNames)
{
foreach (String propName in propNames)
{
if (properties.Contains(propName))
properties.Remove(propName);
}
}
protected override void PreFilterEvents(System.Collections.IDictionary events)
{
RemoveDescriptors(events,
new string[] {
"AutoHideChanged",
"AutoHideDisplay",
"BarDock",
"BarUndock",
"BeforeAutoHideDisplayed",
"BeforeAutoHideHidden",
"BeforeDockTabDisplayed",
"Closing",
"DefinitionLoaded",
"DeserializeItem",
"DockTabChange",
"DockTabClosed",
"DockTabClosing",
"SerializeItem",
});
base.PreFilterEvents(events);
}
#endregion
}
}