522 lines
14 KiB
C#

using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;
namespace DevComponents.Tree
{
/// <summary>
/// Represents windows forms designer for the control.
/// </summary>
public class TreeGXDesigner:ParentControlDesigner
{
#region Private Variables
// private Point m_MouseDownPosition=Point.Empty;
// private bool m_IgnoreMouseUp=false;
// private bool m_Capture=false;
private bool m_DragDropStarted=false;
const int WM_RBUTTONDOWN=0x0204;
const int WM_LBUTTONDOWN=0x0201;
const int WM_LBUTTONUP=0x0202;
const int WM_RBUTTONUP=0x0205;
const int WM_MOUSEMOVE=0x0200;
const int WM_LBUTTONDBLCLK=0x0203;
#endregion
public override void Initialize(IComponent component)
{
base.Initialize(component);
if(!component.Site.DesignMode)
return;
ISelectionService ss =(ISelectionService)GetService(typeof(ISelectionService));
if(ss!=null)
ss.SelectionChanged+=new EventHandler(OnSelectionChanged);
// If our component is removed we need to clean-up
IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
if(cc!=null)
cc.ComponentRemoving+=new ComponentEventHandler(this.OnComponentRemoving);
}
// public override DesignerVerbCollection Verbs
// {
// get
// {
// DesignerVerb[] verbs = new DesignerVerb[]
// {
// new DesignerVerb("Create Node", new EventHandler(CreateNode))};
// return new DesignerVerbCollection(verbs);
// }
// }
public override void OnSetComponentDefaults()
{
base.OnSetComponentDefaults();
CreateNode(null);
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null)
return;
TreeUtilites.InitializeTree(this.Control as TreeGX,new ComponentFactory(dh));
}
private Node CreateNode(Node parentNode)
{
TreeGX tree=this.Control as TreeGX;
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null)
return null;
Node node=null;
tree.BeginUpdate();
try
{
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if(change!=null)
{
if(parentNode!=null)
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(parentNode).Find("Nodes",true));
else
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(tree).Find("Nodes",true));
}
node=dh.CreateComponent(typeof(Node)) as Node;
if(node!=null)
{
node.Text=node.Name;
node.Expanded = true;
if(parentNode==null)
tree.Nodes.Add(node);
else
parentNode.Nodes.Add(node);
if(change!=null)
{
if(parentNode!=null)
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(parentNode).Find("Nodes",true),null,null);
else
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(tree).Find("Nodes",true),null,null);
}
}
}
finally
{
tree.EndUpdate();
}
return node;
}
#region Drag & Drop support
/// <summary>
/// Called after node has been selected by designer as response to mouse action
/// </summary>
/// <param name="node">Node that is selected</param>
protected virtual void OnNodeSelected(Node node)
{
}
/// <summary>
/// Returns whether specified node can be dragged and dropped
/// </summary>
/// <param name="node">Node to verify</param>
/// <returns>true if node can be dragged and dropped</returns>
protected virtual bool CanDragNode(Node node)
{
return true;
}
protected override void OnMouseDragBegin(int x, int y)
{
TreeGX tree=this.Control as TreeGX;
if(tree==null)
{
base.OnMouseDragBegin(x,y);
return;
}
Point pos=tree.PointToClient(new Point(x,y));
Node node = tree.GetNodeAt(pos);
if(node!=null)
{
ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
if(selection!=null)
{
ArrayList arr=new ArrayList(1);
arr.Add(node);
selection.SetSelectedComponents(arr,SelectionTypes.MouseDown);
OnNodeSelected(node);
}
tree.SelectedNode = node;
}
else
tree.SelectedNode = null;
if(node==null || !CanDragNode(node))
{
if(node==null)
base.OnMouseDragBegin(x,y);
else
this.Control.Capture = true; // Does same as base implementation
return;
}
if(tree.StartDragDrop(node))
{
m_DragDropStarted=true;
// DevComponents.Tree.Interop.WinA.RECT rect = new NativeFunctions.RECT(0,0,0,0);
// NativeFunctions.GetWindowRect(bar.Handle, ref rect);
// Rectangle r=Rectangle.FromLTRB(rect.Left, rect.Top, rect.Right, rect.Bottom);
// Cursor.Clip=r;
this.Control.Capture = true;
}
else
base.OnMouseDragBegin(x,y);
}
protected override void OnMouseDragMove(int x, int y)
{
if(m_DragDropStarted)
{
TreeGX tree=this.Control as TreeGX;
DragEventArgs de=new DragEventArgs(null,(int)Control.ModifierKeys,x,y,DragDropEffects.All,DragDropEffects.Move);
tree.InternalDragOver(de);
}
}
protected override void OnMouseDragEnd(bool cancel)
{
this.Control.Capture = false;
Cursor.Clip = Rectangle.Empty;
TreeGX tree=this.Control as TreeGX;
if(m_DragDropStarted)
{
if(tree!=null && tree.IsDragDropInProgress)
{
if(cancel)
tree.InternalDragLeave();
else
{
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
Node dragNode=tree.GetDragNode().Tag as Node;
Node newParent=tree.GetDragNode().Parent;
Node parent=dragNode.Parent;
if(change!=null)
{
if(parent!=null)
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(parent).Find("Nodes",true));
else
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(tree).Find("Nodes",true));
if(newParent!=null)
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(newParent).Find("Nodes",true));
else
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(tree).Find("Nodes",true));
}
tree.InternalDragDrop(new DragEventArgs(null,0,0,0,DragDropEffects.None,DragDropEffects.None));
if(change!=null)
{
if(parent!=null)
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(parent).Find("Nodes",true),null,null);
else
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(tree).Find("Nodes",true),null,null);
if(newParent!=null)
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(newParent).Find("Nodes",true),null,null);
else
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(tree).Find("Nodes",true),null,null);
}
}
}
cancel=true;
}
else
{
if(tree.SelectedNode!=null)
cancel=true;
}
m_DragDropStarted = false;
base.OnMouseDragEnd(cancel);
}
#endregion
private void OnSelectionChanged(object sender,EventArgs e)
{
ISelectionService ss = (ISelectionService)sender;
if(ss.PrimarySelection==this.Component)
{
TreeGX tree=this.Control as TreeGX;
tree.SelectedNode=null;
}
}
public void OnComponentRemoving(object sender,ComponentEventArgs e)
{
if(e.Component==this.Component)
{
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null)
return;
ArrayList list = new ArrayList(this.AssociatedComponents);
foreach(IComponent c in list)
dh.DestroyComponent(c);
}
}
/// <summary>
/// Returns all components associated with this control
/// </summary>
public override ICollection AssociatedComponents
{
get
{
ArrayList c=new ArrayList(base.AssociatedComponents);
TreeGX tree=this.Control as TreeGX;
if(tree!=null)
{
foreach(Node node in tree.Nodes)
GetNodesRecursive(node,c);
foreach(ElementStyle style in tree.Styles)
c.Add(style);
if(tree.NodesConnector!=null)
c.Add(tree.NodesConnector);
if(tree.RootConnector!=null)
c.Add(tree.RootConnector);
if(tree.LinkConnector!=null)
c.Add(tree.LinkConnector);
}
return c;
}
}
private void GetNodesRecursive(Node parent,ArrayList c)
{
c.Add(parent);
if(parent.ParentConnector!=null)
c.Add(parent.ParentConnector);
foreach(Node node in parent.Nodes)
{
c.Add(node);
GetNodesRecursive(node,c);
}
}
/// <summary>
/// Selection support for items on container.
/// </summary>
protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case WM_LBUTTONDOWN:
{
if(OnMouseDown(ref m,MouseButtons.Left))
return;
break;
}
case WM_RBUTTONDOWN:
{
if(OnMouseDown(ref m,MouseButtons.Right))
return;
break;
}
case WM_LBUTTONUP:
{
if(OnMouseUp(ref m,MouseButtons.Left))
return;
break;
}
case WM_RBUTTONUP:
{
if(OnMouseUp(ref m,MouseButtons.Right))
return;
break;
}
case WM_MOUSEMOVE:
{
if(OnMouseMove(ref m))
return;
break;
}
case WM_LBUTTONDBLCLK:
{
if(OnMouseDoubleClick())
return;
break;
}
}
base.WndProc(ref m);
}
private bool OnMouseDoubleClick()
{
bool processed=false;
ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
if(selection.PrimarySelection is Node && ((Node)selection.PrimarySelection).TreeControl==this.Control)
{
IDesignerHost host=(IDesignerHost) this.GetService(typeof(IDesignerHost));
if(host!=null)
{
IDesigner designer=host.GetDesigner(selection.PrimarySelection as IComponent);
if(designer!=null)
{
designer.DoDefaultAction();
processed=true;
}
}
}
return processed;
}
protected virtual bool OnMouseDown(ref Message m, MouseButtons button)
{
TreeGX tree=this.Control as TreeGX;
if(tree==null)
return false;
Point pos=tree.PointToClient(System.Windows.Forms.Control.MousePosition);
//m_MouseDownPosition=pos;
Node node=tree.GetNodeAt(pos);
if(node!=null && button==MouseButtons.Right)
{
ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
ArrayList arr=new ArrayList(1);
arr.Add(node);
selection.SetSelectedComponents(arr,SelectionTypes.MouseDown);
this.OnContextMenu(System.Windows.Forms.Control.MousePosition.X,System.Windows.Forms.Control.MousePosition.Y);
tree.SelectedNode=node;
return true;
}
return false;
}
protected virtual bool OnMouseMove(ref Message m)
{
// TreeGX tree=this.Control as TreeGX;
// Point posScreen=System.Windows.Forms.Control.MousePosition;
// Point pos=tree.PointToClient(posScreen);
//
// if(Control.MouseButtons==MouseButtons.Left)
// {
// if(m_DragDropStarted)
// {
// DragEventArgs de=new DragEventArgs(null,(int)Control.ModifierKeys,posScreen.X,posScreen.Y,DragDropEffects.All,DragDropEffects.Move);
// tree.InternalDragOver(de);
// return true;
// }
// if(Control.MouseButtons==MouseButtons.Left && !tree.IsCellEditing && tree.SelectedNode!=null &&
// (Math.Abs(m_MouseDownPosition.X-pos.X)>=SystemInformation.DragSize.Width || Math.Abs(m_MouseDownPosition.Y-pos.Y)>=SystemInformation.DragSize.Height))
// {
// if(tree.StartDragDrop(tree.SelectedNode))
// {
// m_DragDropStarted=true;
// System.Windows.Forms.Control c=System.Windows.Forms.Control.FromHandle(m.HWnd);
// if(c!=null)
// {
// m_Capture=true;
// c.Capture=true;
// }
// return true;
// }
// m_MouseDownPosition=Point.Empty;
// }
//
// }
return false;
}
private bool OnMouseUp(ref Message m, MouseButtons button)
{
// if(m_Capture)
// {
// System.Windows.Forms.Control c=System.Windows.Forms.Control.FromHandle(m.HWnd);
// if(c!=null)
// c.Capture=false;
// m_Capture=false;
// }
// m_DragDropStarted=false;
//
// TreeGX tree=this.Control as TreeGX;
// if(tree!=null && tree.IsDragDropInProgress)
// {
// IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
//
// Node dragNode=tree.GetDragNode().Tag as Node;
// Node newParent=tree.GetDragNode().Parent;
// Node parent=dragNode.Parent;
//
// if(change!=null)
// {
// if(parent!=null)
// change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(parent).Find("Nodes",true));
// else
// change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(tree).Find("Nodes",true));
//
// if(newParent!=null)
// change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(newParent).Find("Nodes",true));
// else
// change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(tree).Find("Nodes",true));
// }
//
// tree.InternalDragDrop(new DragEventArgs(null,0,0,0,DragDropEffects.None,DragDropEffects.None));
//
// if(change!=null)
// {
// if(parent!=null)
// change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(parent).Find("Nodes",true),null,null);
// else
// change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(tree).Find("Nodes",true),null,null);
// if(newParent!=null)
// change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(newParent).Find("Nodes",true),null,null);
// else
// change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(tree).Find("Nodes",true),null,null);
// }
//
// }
//
// if(m_IgnoreMouseUp)
// {
// m_IgnoreMouseUp=false;
// return true;
// }
return false;
}
public override SelectionRules SelectionRules
{
get
{
return (SelectionRules.AllSizeable | SelectionRules.Moveable | SelectionRules.Visible);
}
}
}
}