private void OnDrop_MoveNode(TreeTreeNode <T> _dst, TreeNode src, TreeNodeDDTarget target) { TreeTreeNode <T> _src = src as TreeTreeNode <T>; if (_src == null) { return; } T dval = _dst.Value; switch (target) { case TreeNodeDDTarget.Self: dval.Nodes.Add(_src.Value); _dst.Nodes.Add(_src); break; case TreeNodeDDTarget.Child: dval.Nodes.Insert(0, _src.Value); _dst.Nodes.Insert(0, _src); break; case TreeNodeDDTarget.Prev: dval.Parent.Nodes.Insert(dval.Parent.Nodes.IndexOf(dval), _src.Value); _dst.ParentNode.Nodes.InsertBefore(_dst, _src); break; case TreeNodeDDTarget.Next: dval.Parent.Nodes.Insert(dval.Parent.Nodes.IndexOf(dval) + 1, _src.Value); _dst.ParentNode.Nodes.InsertAfter(_dst, _src); 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; } }
private void OnDrop_MoveList(TreeTreeNode <T> _dst, Gen::List <TreeNode> list, TreeNodeDDTarget target) { _todo.TreeNodeDisplayHeight("TreeNodeCollection.Suppress: ノードリストの幾何再計算・再描画を抑止"); _todo.TreeNodeDisplayHeight("target==Child の時は AddRange を利用する様にする?"); using (_dst.Nodes.SuppressLayout()) foreach (TreeNode node3 in list) { this.OnDrop_MoveNode(_dst, node3, target); } }
/// <summary> /// 指定した TreeNode をドラッグ可能か否か判定し、 /// 可能なドラッグドロップエフェクトを返します。 /// </summary> /// <param name="node">判定対象の TreeNode を指定します。</param> /// <returns>ドラッグ可能の場合には、可能な DragDropEffects を返します。 /// ドラッグ不可能の場合には DragDropEffects.None を返します。</returns> public override System.Windows.Forms.DragDropEffects GetAllowedDDE(TreeNode node) { TreeTreeNode <T> _node = node as TreeTreeNode <T>; if (_node == null) { return(Forms::DragDropEffects.None); } // 他種類の物体へドロップする為、取り敢えず全て可能。 return(Forms::DragDropEffects.All); }
/// <summary> /// 子ノードを初期化します。 /// </summary> /// <returns>新しく作成した子ノード集合を返します。</returns> protected override void InitializeNodes(TreeNodeCollection nodes) { foreach (T child in this.value.Nodes) { TreeTreeNode <T> childNode = new TreeTreeNode <T>(child); if (this.DDBehaviorInherit == TreeNodeInheritType.Custom) { childNode.DDBehavior = this.DDBehavior; } nodes.Add(childNode); } }
private Forms::DragDropEffects GetEffect_Node(TreeTreeNode <T> _dst, TreeNode src, Forms::DragDropEffects mask) { TreeTreeNode <T> _src = src as TreeTreeNode <T>; if (_src == null) { return(Forms::DragDropEffects.None); } mask &= _src.DragEffectToTreeNode; if (_src.IsDescendant(_dst) || _src == _dst) { mask &= ~Forms::DragDropEffects.Move; } return(mask); }
private Forms::DragDropEffects GetEffect_List(TreeTreeNode <T> _dst, Gen::List <TreeNode> list, Forms::DragDropEffects mask) { foreach (TreeNode node2 in list) { TreeTreeNode <T> _src = node2 as TreeTreeNode <T>; if (_src == null) { return(Forms::DragDropEffects.None); } mask &= _src.DragEffectToTreeNode; if (_src.IsDescendant(_dst) || _src == _dst) { mask &= ~Forms::DragDropEffects.Move; } } return(mask); }
//----------------------------------------------------------------------- // 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); }