DotNet 4.8.1 build of DotNetBar
This commit is contained in:
521
PROMS/DotNetBar Source Code/TreeGX/TreeGXDesigner.cs
Normal file
521
PROMS/DotNetBar Source Code/TreeGX/TreeGXDesigner.cs
Normal file
@@ -0,0 +1,521 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user