/// <summary>节点被按下时
        ///
        /// </summary>
        private void mindMapNode_MindMapNodeMouseDown(object sender, MouseEventArgs e)
        {
            MindMapNodeContentBase      SenderObject    = ((Control)sender).GetNodeContent();
            List <MindMapNodeContainer> MindMapNodeList = mindMapNode.GetChidrenNode(true);

            MindMapNodeList.Add(mindMapNode);
            if (Control.ModifierKeys != Keys.Control || e.Button == MouseButtons.Right) //不按住ctrl就单选
            {
                if (!SenderObject.Selected)                                             //如果单击已选中节点就不做任何事,因为可能需要按住进行拖拽
                {
                    MindMapNodeList.ForEach(T1 => T1.NodeContent.Selected = false);
                    SenderObject.Selected = true;
                }
            }
            else    //按住ctrl可单选
            {
                SenderObject.Selected = !SenderObject.Selected;
            }

            MindMap_Panel_MouseDown(sender, e);
            if (MindMapNodeMouseDown != null)
            {
                MindMapNodeMouseDown(GetNodeContainer(sender), e);
            }
        }
        private void 添加子文件夹ToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            MindMapNodeContentBase MindMapNodeContentBase = GetCurrentContent();

            if (MindMapNodeContentBase == null)
            {
                return;
            }
            AddFolder(MindMapNodeContentBase.NodeContainer);//添加一个文件夹
        }
        private void 添加同级文件夹ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MindMapNodeContentBase MindMapNodeContentBase = GetCurrentContent();

            if (MindMapNodeContentBase == null)
            {
                return;
            }
            MindMapNodeContainer MindMapNodeContainer = MindMapNodeContentBase.NodeContainer.ParentNode;

            if (MindMapNodeContainer == null)
            {
                return;                      //没有父节点直接返回
            }
            AddFolder(MindMapNodeContainer); //添加一个文件夹
        }
        /// <summary> 在某节点完成拖拽
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void MindMapNode_DragDrop(object sender, DragEventArgs e)
        {
            DragEventHandler RunEvent = MindMapNodeDragDrop;

            if (IsElseNode(e.Data))//拖拽操作是从其他节点发起的?
            {
                MindMapNodeContentBase Content = ((Control)sender).GetNodeContent();
                if (AllowDrag(Content.NodeContainer)) //当前节点不能拖动到选中节点和它的子节点下
                {
                    RunEvent = MindeMapNodeToNodeDragDrop;
                }
            }
            if (RunEvent != null)
            {
                RunEvent(GetNodeContainer(sender), e);
            }
        }
        /// <summary> 为节点设置内容布局样式
        ///
        /// </summary>
        /// <param name="Struct">指示DataItem的数据结构</param>
        /// <param name="NodeContentParame">设置节点内容布局</param>
        public void SetNodeContent(MindMapNodeStructBase Struct, MindMapNodeContentBase NodeContentParame)
        {
            #region 为什么要有锁?

            /*
             * 锁的概念是为了调用本方法设置节点内容时,要将以前的节点内容的ParentMindMapNode属性设置为空
             * 类似于Control类的Parent属性,使得节点容器和节点内容只需要修改其中一个实例另一个实例就会自动变
             * 但是以前的节点内容的ParentMindMapNode属性也有相同的特性会返回来调用本方法,所以会造成死递归
             */
            #endregion 为什么要有锁?
            if (SetContentLock)
            {
                return;            //锁打开了就直接返回
            }
            SetContentLock = true; //打开锁

            if (this._NodeContent == NodeContentParame)
            {
                return;
            }
            if (this._NodeContent != null)
            {
                this._NodeContent.NodeContainer = null;                           //把以前的置为空
            }
            this._NodeContent = NodeContentParame;
            this.Content_Panel.Controls.Clear();
            if (this._NodeContent != null)
            {
                this.NodeContent.DataStruct = Struct;
                this.Content_Panel.Controls.Add(this.NodeContent);
                this._NodeContent.NodeContainer  = this;
                this._NodeContent.CurrentScaling = this.CurrentScaling;
            }
            ReSetSize();
            SetContentLock = false;//关闭锁
            if (AddNodeContent != null)
            {
                AddNodeContent(this, null);
            }
        }
        /// <summary> 传入发生事件节点的Sender参数返回它的节点容器
        ///
        /// </summary>
        /// <param name="ControlObj"></param>
        /// <returns></returns>
        private Control GetNodeContainer(object ControlObj)
        {
            Control ContainerControl = null;

            #region 获取节点容器
            if (ControlObj == null)
            {
                return(null);
            }
            if (!(ControlObj is Control))
            {
                return(null);
            }
            MindMapNodeContentBase ContainerTemp = ((Control)ControlObj).GetNodeContent();
            if (ContainerTemp == null)
            {
                return(null);
            }
            ContainerControl = ContainerTemp.NodeContainer;
            #endregion 获取节点容器
            return(ContainerControl);
        }
        private void 重命名QToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MindMapNodeContentBase CurrentContent = GetCurrentContent();

            if (CurrentContent == null)
            {
                return;
            }
            if (!(CurrentContent is Text_NodeContent))
            {
                return;
            }
            Edit_textBox.Text    = ((Text_NodeContent)CurrentContent).ContentText;
            Edit_textBox.Visible = true;
            #region 居中编辑框

            Edit_textBox.Left = (this.Size.Width - Edit_textBox.Size.Width) / 2;
            Edit_textBox.Top  = (this.Size.Height - Edit_textBox.Size.Height) / 2;

            #endregion 居中编辑框
            Edit_textBox.Focus();
        }
Example #8
0
        /// <summary> 通过节点内容里的某个控件,递归向上获取节点内容控件
        ///
        /// </summary>
        /// <param name="thisControl"></param>
        /// <returns></returns>
        public static MindMapNodeContentBase GetNodeContent(this Control thisControl)
        {
            MindMapNodeContentBase result = null;

            if (thisControl is MindMapNodeContentBase)
            {
                result = (MindMapNodeContentBase)thisControl;
                return(result);
            }
            else
            {
                if (thisControl is MindMap_Panel)
                {
                    return(result);                            //如果找到思维导图容器了还没有找到那这个控件就不是节点内容里的控件
                }
                if (thisControl.Parent == null)
                {
                    return(result);
                }
                return(thisControl.Parent.GetNodeContent());
            }
        }