Example #1
0
            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;
                }
            }
Example #2
0
            //-----------------------------------------------------------------------
            // 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;
                }
            }
Example #3
0
 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);
         }
 }
Example #4
0
            /// <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);
            }
Example #5
0
 /// <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);
     }
 }
Example #6
0
            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);
            }
Example #7
0
            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);
            }
Example #8
0
            //-----------------------------------------------------------------------
            //	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);
            }