236 lines
7.4 KiB
C#

using System;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using System.Collections;
using System.Drawing;
using System.ComponentModel.Design;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.CodeDom;
namespace DevComponents.DotNetBar.Design
{
/// <summary>
/// Provides design time support for NavigationBar control.
/// </summary>
public class NavigationBarDesigner:BarBaseControlDesigner
{
/// <summary>
/// Default constructor
/// </summary>
public NavigationBarDesigner()
{
this.EnableItemDragDrop=true;
}
public override void OnSetComponentDefaults()
{
NavigationBar navbar = this.Control as NavigationBar;
if (navbar != null) navbar.Style = eDotNetBarStyle.StyleManagerControlled;
base.OnSetComponentDefaults();
}
public override DesignerVerbCollection Verbs
{
get
{
DesignerVerb[] verbs;
verbs = new DesignerVerb[]
{
new DesignerVerb("Create New Button", new EventHandler(CreateNewButton)),
};
return new DesignerVerbCollection(verbs);
}
}
private void CreateNewButton(object sender, EventArgs e)
{
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
NavigationBar navbar=this.Control as NavigationBar;
if(navbar==null || dh==null)
return;
DesignerTransaction dt = dh.CreateTransaction();
try
{
IComponentChangeService change = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (change != null)
change.OnComponentChanging(this.Component, null);
ButtonItem item = null;
try
{
m_CreatingItem = true;
item = dh.CreateComponent(typeof(ButtonItem)) as ButtonItem;
item.Text = item.Name;
item.OptionGroup = "navBar";
item.Image = Helpers.LoadBitmap("SystemImages.DefaultNavBarImage.png");
navbar.Items.Add(item);
}
finally
{
m_CreatingItem = false;
}
if (navbar.Items.Count == 1)
item.Checked = true;
navbar.RecalcLayout();
if (change != null)
change.OnComponentChanged(this.Component, null, null, null);
}
catch
{
dt.Cancel();
}
finally
{
if (!dt.Canceled) dt.Commit();
}
}
protected override bool OnMouseDown(ref Message m, MouseButtons mb)
{
if(base.OnMouseDown(ref m, mb))
return true;
NavigationBar navbar=this.GetItemContainerControl() as NavigationBar;
if(navbar==null || navbar.IsDisposed || !navbar.SplitterVisible)
return false;
Point pos=navbar.PointToClient(System.Windows.Forms.Control.MousePosition);
MouseEventArgs e=new MouseEventArgs(MouseButtons.Left,0,pos.X,pos.Y,0);
if(m.Msg==WinApi.WM_LBUTTONDOWN)
{
if(navbar.HitTestSplitter(e.X,e.Y))
navbar.SplitterMouseDown(e);
if(navbar.IsSplitterMouseDown /*|| navbar.ClientRectangle.Contains(pos)*/)
return true;;
}
return false;
}
protected override bool OnMouseUp(ref Message m)
{
NavigationBar navbar=this.GetItemContainerControl() as NavigationBar;
if(navbar!=null && !navbar.IsDisposed && navbar.SplitterVisible)
{
Point pos=navbar.PointToClient(System.Windows.Forms.Control.MousePosition);
MouseEventArgs e=new MouseEventArgs(MouseButtons.Left,0,pos.X,pos.Y,0);
// Design-time splitter support
if(navbar.IsSplitterMouseDown)
{
navbar.SplitterMouseUp(e);
this.OnNavigationBarHeightChanged(navbar.Height);
}
else
navbar.SplitterMouseUp(e);
}
if(base.OnMouseUp(ref m))
return true;
return false;
}
protected virtual void OnNavigationBarHeightChanged(int newHeight)
{
// IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
// if(change!=null)
// {
// change.OnComponentChanging(this.Control,TypeDescriptor.GetProperties(this.Control).Find("NavigationBarHeight",true));
// change.OnComponentChanged(this.Control,TypeDescriptor.GetProperties(this.Control).Find("NavigationBarHeight",true),0,newHeight);
// }
}
protected override bool OnMouseMove(ref Message m)
{
if(base.OnMouseMove(ref m))
return true;
NavigationBar navbar=this.GetItemContainerControl() as NavigationBar;
if(navbar!=null && !navbar.IsDisposed && navbar.SplitterVisible)
{
Point pos=navbar.PointToClient(System.Windows.Forms.Control.MousePosition);
MouseEventArgs e=new MouseEventArgs(System.Windows.Forms.Control.MouseButtons,0,pos.X,pos.Y,0);
navbar.SplitterMouseMove(e);
}
return false;
}
protected override bool OnMouseLeave(ref Message m)
{
if(base.OnMouseLeave(ref m))
return true;
NavigationBar navbar=this.GetItemContainerControl() as NavigationBar;
if(navbar!=null && !navbar.IsDisposed && navbar.SplitterVisible)
navbar.SplitterMouseLeave();
return false;
}
protected override void OnItemSelected(BaseItem item)
{
base.OnItemSelected(item);
if(item is ButtonItem && !((ButtonItem)item).Checked)
{
ButtonItem button=item as ButtonItem;
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if(change!=null)
change.OnComponentChanging(button,TypeDescriptor.GetProperties(button).Find("Checked",true));
button.Checked=true;
if(change!=null)
change.OnComponentChanged(button,TypeDescriptor.GetProperties(button).Find("Checked",true),null,null);
}
}
}
// public class NavigationBarSerializer : CodeDomSerializer
// {
// public override object Serialize(IDesignerSerializationManager manager, object value)
// {
// // first, locate and invoke the default serializer for
// CodeDomSerializer baseSerializer = (CodeDomSerializer)manager.GetSerializer(
// typeof(NavigationBar).BaseType,
// typeof(CodeDomSerializer));
//
// object codeObject = baseSerializer.Serialize(manager, value);
//
// // now add some custom code
// if (codeObject is CodeStatementCollection)
// {
//
// // // add a custom comment to the code.
// CodeStatementCollection statements =
// (CodeStatementCollection)codeObject;
//
// // call a custom method.
// CodeExpression targetObject =
// base.SerializeToReferenceExpression(manager, value);
// if(targetObject != null)
// {
//
// CodeMethodInvokeExpression methodCall =
// new CodeMethodInvokeExpression(targetObject, "RecalcLayout");
// statements.Add(methodCall);
// }
//
// }
//
// // finally, return the statements that have been created
// return codeObject;
// }
//
// /// The default serializer can handle the deserialization just fine. We override this
// /// because it is an abstract member.
// /// </summary>
// public override object Deserialize(IDesignerSerializationManager manager, object codeDomObject)
// {
// // delegate straight through to the default serializer
// //
// CodeDomSerializer baseSerializer = (CodeDomSerializer)manager.GetSerializer(typeof(NavigationBar).BaseType, typeof(CodeDomSerializer));
//
// return baseSerializer.Deserialize(manager, codeDomObject);
// }
// }
}