522 lines
14 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|