/// <summary>
 /// 删除节点
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void  除节点ToolStripMenuItem_Click(object sender, EventArgs e)
 {
     if (iSelectedControlNow != null)
     {
         IDialoguePointID iDialoguePointID = iSelectedControlNow as IDialoguePointID;
         Control          parentControl    = iSelectedControlNow.GetParent();
         if (iDialoguePointID.GetType().Equals(typeof(DialogueConditionControl)))
         {
             FlowLayoutPanel_Main.Controls.Remove(parentControl);
             iSelectedControlNow = null;
         }
         else
         {
             DialogueConditionControl dialogueConditionControl = parentControl.Controls.OfType <DialogueConditionControl>().FirstOrDefault();
             if (dialogueConditionControl != null)
             {
                 IDialoguePointID parentIDialoguePointID = GetParentDialoguePointID(iDialoguePointID, dialogueConditionControl);
                 if (parentIDialoguePointID != null)
                 {
                     parentIDialoguePointID.RemovNextPointID(iDialoguePointID);
                     RemoveDialoguePointIDControl(parentControl, iDialoguePointID);
                     List <Control> tagControlList = (parentIDialoguePointID as Control).Tag as List <Control>;
                     if (tagControlList != null)
                     {
                         tagControlList.Remove(iDialoguePointID as Control);
                     }
                     //移除所有子节点
                     iSelectedControlNow = null;
                     ResetControlRect(parentControl);
                 }
             }
         }
     }
 }
        /// <summary>
        /// 创建一个顶级节点
        /// </summary>
        /// <param name="conditionData">关系数据</param>
        /// <param name="updateControl">是否立即更新</param>
        private DialogueConditionControl CreateNewTopNode(DialogueCondition conditionData = null, bool updateControl = true)
        {
            Panel p = new Panel();

            FlowLayoutPanel_Main.Controls.Add(p);
            DialogueConditionControl dialogueConditionControl = new DialogueConditionControl(conditionData);

            dialogueConditionControl.Size = dialogueConditionControl.StopSize;
            dialogueConditionControl.SetListenControlSelected(ListenControlSelected);
            dialogueConditionControl.SetLiestenOpenStop(AddListenOpenStop);
            dialogueConditionControl.Tag = new List <Control>();
            p.Controls.Add(dialogueConditionControl);
            p.Paint += (sender, e) =>
            {
                Graphics g = e.Graphics;
                g.Clear(p.BackColor);
                //绘制连接线
                Pen pen = new Pen(Color.Red);
                foreach (Control control in p.Controls.OfType <Control>())
                {
                    if (control.Tag == null)
                    {
                        continue;
                    }
                    Size           parentSize     = control.Size;
                    Point          parentLocation = control.Location;
                    List <Control> childControls  = control.Tag as List <Control>;
                    if (parentLocation.X >= 0 && parentLocation.Y >= 0)
                    {
                        foreach (Control childControl in childControls)
                        {
                            Size  childSize     = childControl.Size;
                            Point childLocation = childControl.Location;
                            if (childLocation.X >= 0 && childLocation.Y >= 0)
                            {
                                g.DrawBezier(pen,
                                             new Point(parentLocation.X + parentSize.Width, parentLocation.Y + parentSize.Height / 2),
                                             new Point(parentLocation.X + parentSize.Width + 20, parentLocation.Y + parentSize.Height / 2),
                                             new Point(childLocation.X - 20, childLocation.Y + childSize.Height / 2),
                                             new Point(childLocation.X, childLocation.Y + childSize.Height / 2));
                            }
                        }
                    }
                }
            };
            if (updateControl)
            {
                ResetControlRect(p);
            }
            if (searchNodeForm != null)
            {
                searchNodeForm.NodeChanged = true;
            }
            return(dialogueConditionControl);
        }
Пример #3
0
        /// <summary>
        /// 将panel的数据设置到TreeNode中
        /// </summary>
        /// <param name="treeNode">树节点</param>
        /// <param name="panel">对应的panel</param>
        private void SetPanelToTreeNode(TreeNode treeNode, Panel panel)
        {
            treeNode.Tag = panel;
            DialogueConditionControl dialogueConditionControl = panel.Controls.OfType <DialogueConditionControl>().FirstOrDefault();
            DialogueCondition        dialogueCondition        = dialogueConditionControl.GetDialogueCondition();

            treeNode.Text = "Text:[" + dialogueCondition.text + "];Type:[" + dialogueCondition.enumDialogueType + "]";
            if (dialogueConditionControl.Tag != null && (dialogueConditionControl.Tag as List <Control>) != null && (dialogueConditionControl.Tag as List <Control>).Count > 0)
            {
                SetControlToTreeNode(treeNode, (dialogueConditionControl.Tag as List <Control>).ToArray());
            }
        }
 /// <summary>
 /// 根据现有数据创建控件
 /// </summary>
 private void CreateControlByData()
 {
     int[] dialogueConditionIDs = dialogueAnalysisData.GetDialogueConditionAllID;
     foreach (int dialogueConditionID in dialogueConditionIDs)
     {
         DialogueCondition dialogueCondition = dialogueAnalysisData.GetDialogueConditionIDByID(dialogueConditionID);
         if (dialogueCondition == null)
         {
             continue;
         }
         DialogueConditionControl dialogueConditionControl = CreateNewTopNode(dialogueCondition, false);
         DialoguePoint            dialoguePoint            = dialogueCondition.topPoint;
         CreateControlByData(dialogueConditionControl, dialoguePoint);
         ResetControlRect(dialogueConditionControl.Parent);
         dialogueConditionControl.Parent.Refresh();
     }
     ResetBackRect();
 }
 /// <summary>
 /// 将选择的控件移动到父控件指定位置以显示控件
 /// </summary>
 /// <param name="panel">选择显示的控件</param>
 private void ShowSearchPanel(Panel panel)
 {
     if (panel != null)
     {
         int   locationY    = panel.Location.Y;
         int   allHeight    = FlowLayoutPanel_Main.Size.Height;
         int   windowHeigth = Panel_Main.Size.Height;
         float bili         = (float)locationY / (float)allHeight;
         Panel_Main.VerticalScroll.Value = (int)(Panel_Main.VerticalScroll.Maximum * bili);
         Panel_Main.VerticalScroll.Value = (int)(Panel_Main.VerticalScroll.Maximum * bili);
         DialogueConditionControl dialogueConditionControl = panel.Controls.OfType <DialogueConditionControl>().FirstOrDefault();
         if (dialogueConditionControl != null)
         {
             if (iSelectedControlNow != null)
             {
                 iSelectedControlNow.NoSelectedControl();
             }
             dialogueConditionControl.SelectedControl();
             iSelectedControlNow = dialogueConditionControl;
         }
     }
 }
        /// <summary>
        /// 保存方案
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void 保存方案ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //重建对话关系数据集合以及对话数据字典
            List <DialogueCondition>        dialogueConditionList = new List <DialogueCondition>();
            Dictionary <int, DialogueValue> dialogueValueDic      = new Dictionary <int, DialogueValue>();

            foreach (Panel panel in FlowLayoutPanel_Main.Controls.OfType <Panel>())
            {
                DialogueConditionControl dialogueConditionContorl = panel.Controls.OfType <DialogueConditionControl>().FirstOrDefault();
                if (dialogueConditionContorl == null)
                {
                    continue;
                }
                //对话条件
                DialogueCondition dialogueCondition = dialogueConditionContorl.GetDialogueCondition();
                //对话关系
                if (dialogueConditionContorl.Tag != null &&
                    dialogueConditionContorl.Tag.GetType().Equals(typeof(List <Control>)) &&
                    (dialogueConditionContorl.Tag as List <Control>).Count > 0)
                {
                    List <Control>       childControlList = dialogueConditionContorl.Tag as List <Control>;
                    DialoguePointControl topPointControl  = childControlList[0] as DialoguePointControl;
                    if (topPointControl != null)
                    {
                        DialoguePoint topPoint = new DialoguePoint();
                        topPoint.dialogueID = topPointControl.GetDialogueValue().dialogueID;
                        if (childControlList[0].Tag != null &&
                            childControlList[0].Tag.GetType().Equals(typeof(List <Control>)) &&
                            (childControlList[0].Tag as List <Control>).Count > 0)
                        {
                            SetDialoguePointData_Child(topPoint, (childControlList[0].Tag as List <Control>).ToArray());
                        }
                        dialogueCondition.topPoint = topPoint;
                    }
                }
                else
                {
                    dialogueCondition.topPoint = null;
                }
                dialogueConditionList.Add(dialogueCondition);
                //对话数据
                foreach (DialoguePointControl dialoguePointControl in panel.Controls.OfType <DialoguePointControl>())
                {
                    DialoguePointControl topPointControl = dialoguePointControl as DialoguePointControl;
                    if (topPointControl != null)
                    {
                        if (!dialogueValueDic.ContainsKey(topPointControl.GetDialogueValue().dialogueID))
                        {
                            dialogueValueDic.Add(topPointControl.GetDialogueValue().dialogueID, topPointControl.GetDialogueValue());
                        }
                    }
                }
            }
            dialogueAnalysisData.ResetData(dialogueConditionList, dialogueValueDic);
            string dialogueConditionStr, dialogueValueStr;

            dialogueAnalysisData.GetData(out dialogueConditionStr, out dialogueValueStr);
            //保存
            string folderPath = Path.GetDirectoryName(projectPath);

            File.WriteAllText(folderPath + "\\" + dialogueConditionFileName + ".txt", dialogueConditionStr, Encoding.UTF8);
            File.WriteAllText(folderPath + "\\" + dialogueValueFileName + ".txt", dialogueValueStr, Encoding.UTF8);
        }
        /// <summary>
        /// 重新设置控件尺寸
        /// </summary>
        /// <param name="parent"></param>
        private void ResetControlRect(Control parent)
        {
            if (parent == null)
            {
                return;
            }
            try
            {
                DialogueConditionControl topControl = parent.Controls.OfType <DialogueConditionControl>().FirstOrDefault();
                #region 构建一个深度结构并计算

                //初步构建
                List <IDialoguePointID>          nextChilds             = new List <IDialoguePointID>();
                List <List <DeepControlStruct> > deepControlStructLists = new List <List <DeepControlStruct> >();
                int tempDeep = 0;
                nextChilds.Add(topControl);
                while (nextChilds.Count > 0)
                {
                    IDialoguePointID[] tempChilds = nextChilds.ToArray();
                    nextChilds.Clear();
                    if (deepControlStructLists.Count == tempDeep)
                    {
                        List <DeepControlStruct> deepControlStructList = new List <DeepControlStruct>();
                        deepControlStructLists.Add(deepControlStructList);
                        deepControlStructList.AddRange(tempChilds.Select(temp => new DeepControlStruct()
                        {
                            deep = tempDeep, iOpenStop = temp as IOpenStop, childs = new List <DeepControlStruct>()
                        }));
                    }
                    foreach (IDialoguePointID tempChild in tempChilds)
                    {
                        IOpenStop iOpenStop = tempChild as IOpenStop;
                        if (iOpenStop != null && iOpenStop.OpenStopState)          //如果该节点是展开节点并且该节点时展开的
                        {
                            nextChilds.AddRange(tempChild.GetDialogueNextPointID); //用于下次计算
                        }
                    }
                    tempDeep++;
                }

                //计算父子关系
                for (int i = 0; i < deepControlStructLists.Count - 1; i++)
                {
                    foreach (DeepControlStruct deepControlStruct in deepControlStructLists[i])
                    {
                        IDialoguePointID    iDialoguePointID       = deepControlStruct.iOpenStop as IDialoguePointID;
                        IDialoguePointID[]  childIDialoguePointIDs = iDialoguePointID.GetDialogueNextPointID;
                        DeepControlStruct[] childs = deepControlStructLists[i + 1].Where(temp => childIDialoguePointIDs.Contains(temp.iOpenStop as IDialoguePointID)).ToArray();
                        foreach (DeepControlStruct child in childs)
                        {
                            child.parent = deepControlStruct;
                            deepControlStruct.childs.Add(child);
                        }
                    }
                }
                //初始化对象的BoundY
                foreach (DeepControlStruct deepControlStruct in deepControlStructLists[0])
                {
                    deepControlStruct.InitBoundY();
                }
                //计算每个节点的x轴坐标
                int tempLocationX = 0;
                for (int i = 0; i < deepControlStructLists.Count; i++)
                {
                    int maxLocationX = 0;
                    foreach (DeepControlStruct deepControlStruct in deepControlStructLists[i])
                    {
                        deepControlStruct.location_x = tempLocationX;
                        int thisWidth = deepControlStruct.iOpenStop.OpenStopState ? deepControlStruct.iOpenStop.OpenSize.Width : deepControlStruct.iOpenStop.StopSize.Width;
                        maxLocationX = maxLocationX > thisWidth ? maxLocationX : thisWidth;
                    }
                    tempLocationX += maxLocationX + 50;
                }
                //计算每个节点的y轴坐标
                foreach (List <DeepControlStruct> deepControlStructList in deepControlStructLists)
                {
                    int tempY = 0;
                    DeepControlStruct parentDeep = null;
                    foreach (DeepControlStruct deepControlStruct in deepControlStructList)
                    {
                        if (deepControlStruct.parent == null)
                        {
                            deepControlStruct.location_y = tempY;
                            tempY += deepControlStruct.boundY;
                        }
                        else
                        {
                            if (parentDeep != deepControlStruct.parent)
                            {
                                tempY      = 0;
                                parentDeep = deepControlStruct.parent;
                            }
                            deepControlStruct.location_y = parentDeep.location_y + tempY;
                            tempY += deepControlStruct.boundY;
                        }
                    }
                }
                //设置父控件大小
                List <int> deepWidthList = new List <int>();
                deepWidthList = deepControlStructLists.Select(temp =>
                                                              temp.Select(deepControl => deepControl.iOpenStop).
                                                              Select(iOpenStop => iOpenStop.OpenStopState ? iOpenStop.OpenSize.Width : iOpenStop.StopSize.Width).
                                                              Max() + 50
                                                              ).ToList();
                int panelWidth  = deepWidthList.Sum();
                int panelHeight = deepControlStructLists[0].Select(temp => temp.boundY).Sum();
                parent.Size = new Size(panelWidth, panelHeight);
                //设置每个节点的大小以及隐藏节点的位置与大小
                Action <IDialoguePointID> HideChild = null;//隐藏子节点
                HideChild = (target) =>
                {
                    IDialoguePointID[] childs = target.GetDialogueNextPointID;
                    foreach (IDialoguePointID child in childs)
                    {
                        (child as Control).Location = new Point(-1000, -1000);
                        HideChild(child);
                    }
                };
                foreach (List <DeepControlStruct> deepControlStructList in deepControlStructLists)
                {
                    foreach (DeepControlStruct deepControlStruct in deepControlStructList)
                    {
                        Control thisControl = deepControlStruct.iOpenStop as Control;
                        thisControl.Location = new Point(deepControlStruct.location_x, deepControlStruct.location_y);
                        thisControl.Size     = deepControlStruct.iOpenStop.OpenStopState ? deepControlStruct.iOpenStop.OpenSize : deepControlStruct.iOpenStop.StopSize;
                        if (!deepControlStruct.iOpenStop.OpenStopState)
                        {
                            HideChild(deepControlStruct.iOpenStop as IDialoguePointID);
                        }
                    }
                }
                //重置背景控件大小
                ResetBackRect();
                #endregion
            }
            catch { }
        }