private void SetRevert(TreeNode node, TreeNodeDragEventArgs e) { switch (GetTarget(node, e)) { case TreeNodeDDTarget.Self: { Gdi::Rectangle rect = new Gdi::Rectangle(node.ClientPosition, node.ContentSize); rect.X += node.ContentOffsetX; node.View.dropArea.RevertRect(rect); break; } case TreeNodeDDTarget.Prev: { Gdi::Point p = node.ClientPosition; p.X += node.ContentOffsetX; node.View.dropArea.RevertLine(p); break; } case TreeNodeDDTarget.Next: { Gdi::Point p = node.ClientPosition; p.X += node.ContentOffsetX; p.Y += node.ContentSize.Height; node.View.dropArea.RevertLine(p); break; } case TreeNodeDDTarget.Child: { Gdi::Point p = node.ClientPosition; p.X += node.ContentOffsetX + node.ChildIndent.Width; p.Y += node.ContentSize.Height; node.View.dropArea.RevertLine(p); break; } } }
//----------------------------------------------------------------------- // OnDrop //----------------------------------------------------------------------- /// <summary> /// ドロップ処理を実行します。 /// </summary> /// <param name="node">処理対象のノードを指定します。</param> /// <param name="e">ドラッグの情報を指定します。</param> public override void OnDrop(TreeNode node, TreeNodeDragEventArgs e) { TreeTreeNode <T> _dst = node as TreeTreeNode <T>; TreeNodeDDTarget target = this.GetTarget(node, e); switch (e.Effect & this.GetEffect(node, e)) { case Forms::DragDropEffects.Move: { TreeNode node2 = e.Data.GetData("afh.Forms.TreeNode") as TreeNode; if (node2 != null) { this.OnDrop_MoveNode(_dst, node2, target); break; } Gen::List <TreeNode> list = e.Data.GetData("afh.Forms.TreeNode:List") as Gen::List <TreeNode>; if (list != null) { this.OnDrop_MoveList(_dst, list, target); break; } break; } case Forms::DragDropEffects.Link: case Forms::DragDropEffects.Copy: throw new System.NotImplementedException(); default: break; } }
/// <summary> /// ドロップ先からのデータの続柄を取得します。 /// </summary> /// <param name="node">ドロップ先のノードを指定します。</param> /// <param name="e">ドラッグに関する情報を指定します。</param> /// <returns>ドロップ先からのデータの続柄を返します。</returns> protected virtual TreeNodeDDTarget GetTarget(TreeNode node, TreeNodeDragEventArgs e) { //System.Console.WriteLine("dbg: "+e.HitTypeVertical.ToString()); switch (e.HitTypeVertical) { case TreeNodeHitType.Above: case TreeNodeHitType.BorderTop: return(TreeNodeDDTarget.Prev); case TreeNodeHitType.Below: case TreeNodeHitType.BorderBottom: if (node.HasChildren && node.IsExpanded) { return(TreeNodeDDTarget.Child); } return(TreeNodeDDTarget.Next); default: return(TreeNodeDDTarget.Self); } }
//----------------------------------------------------------------------- // GetEffect //----------------------------------------------------------------------- /// <summary> /// ドラッグドロップ操作の期待される DDE を取得します。 /// </summary> /// <param name="node">ドロップ先のノードを指定します。</param> /// <param name="e">ドラッグに関する情報を指定します。</param> /// <returns>ドロップによって期待される DDE を返します。</returns> protected override Forms::DragDropEffects GetEffect(TreeNode node, TreeNodeDragEventArgs e) { //■TODO: 他のプロセスから来た場合はどうなるのか? // キー状態 Forms::DragDropEffects mask; switch (e.KeyState) { case TreeNodeDragEventArgs.KEY_MLEFT | TreeNodeDragEventArgs.KEY_CTRL: mask = Forms::DragDropEffects.Copy; break; case TreeNodeDragEventArgs.KEY_MLEFT | TreeNodeDragEventArgs.KEY_ALT: mask = Forms::DragDropEffects.Link; break; default: mask = Forms::DragDropEffects.Move; break; } // ドロップ先 TreeTreeNode <T> _dst = node as TreeTreeNode <T>; if (_dst == null) { goto none; } switch (this.GetTarget(node, e)) { case TreeNodeDDTarget.Self: case TreeNodeDDTarget.Child: break; case TreeNodeDDTarget.Next: case TreeNodeDDTarget.Prev: TreeTreeNode <T> parent = _dst.ParentNode as TreeTreeNode <T>; if (parent == null) { goto none; } _dst = parent; break; default: goto none; } if (_dst.Value.Nodes.IsReadOnly) { goto none; } // ドラッグオブジェクト { // 単一ノードの場合 TreeNode node2 = e.Data.GetData("afh.Forms.TreeNode") as TreeNode; if (node2 != null) { return(GetEffect_Node(_dst, node2, mask)); } // ノードリストの場合 Gen::List <TreeNode> list = e.Data.GetData("afh.Forms.TreeNode:List") as Gen::List <TreeNode>; if (list != null) { return(GetEffect_List(_dst, list, mask)); } //■此処で拡張可能に } none: return(Forms::DragDropEffects.None); }
public void OnLeave(TreeNode node, TreeNodeDragEventArgs e) { }
public void OnEnter(TreeNode node, TreeNodeDragEventArgs e) { }
public void OnDrop(TreeNode node, TreeNodeDragEventArgs e) { }
/// <summary> /// ドラッグドロップ操作の期待される DDE を取得します。 /// </summary> /// <param name="node">ドロップ先のノードを指定します。</param> /// <param name="e">ドラッグに関する情報を指定します。</param> /// <returns>ドロップによって期待される DDE を返します。</returns> protected override Forms::DragDropEffects GetEffect(TreeNode node, TreeNodeDragEventArgs e) { return(Forms::DragDropEffects.Copy); }
/// <summary> /// ドロップ操作を実行します。 /// </summary> /// <param name="node">ドロップ先のノードを指定します。</param> /// <param name="e">ドラッグに関する情報を指定します。</param> public override void OnDrop(TreeNode node, TreeNodeDragEventArgs e) { }
/// <summary> /// ドラッグが要素の外へ出て行く時の処理を行います。 /// </summary> /// <param name="node">処理対象のノードを指定します。</param> /// <param name="e">ドラッグの情報を指定します。 /// 情報がない場合には null を指定します。</param> public virtual void OnLeave(TreeNode node, TreeNodeDragEventArgs e) { node.View.dropArea.Clear(); }
/// <summary> /// ドラッグが入ってくる時の処理を行います。 /// </summary> /// <param name="node">処理対象のノードを指定します。</param> /// <param name="e">ドラッグの情報を指定します。</param> public virtual void OnEnter(TreeNode node, TreeNodeDragEventArgs e) { this.SetRevert(node, e); }
//------------------------------------------------------------------------- /// <summary> /// データがノードの上にドラッグされて来た時の動作を提供します。 /// </summary> /// <param name="node">処理対象のノードを指定します。</param> /// <param name="e">ドラッグの情報を指定します。</param> public virtual void OnDrag(TreeNode node, TreeNodeDragEventArgs e) { e.Effect = GetEffect(node, e); this.SetRevert(node, e); }
/// <summary> /// ドラッグドロップ操作の期待される DDE を取得します。 /// </summary> /// <param name="node">ドロップ先のノードを指定します。</param> /// <param name="e">ドラッグに関する情報を指定します。</param> /// <returns>ドロップによって期待される DDE を返します。</returns> protected abstract Forms::DragDropEffects GetEffect(TreeNode node, TreeNodeDragEventArgs e);
//------------------------------------------------------------------------- /// <summary> /// ドロップ操作を実行します。 /// </summary> /// <param name="node">ドロップ先のノードを指定します。</param> /// <param name="e">ドラッグに関する情報を指定します。</param> public abstract void OnDrop(TreeNode node, TreeNodeDragEventArgs e);