예제 #1
0
        /// <summary>
        /// 执行命令
        /// </summary>
        /// <param name="o">命令的参数</param>
        /// <returns>是否执行成功</returns>
        public override bool Execute(object o)
        {
            bool  success      = true;
            Point currentPoint = (Point)o;
            Size  moveSize     = Size.Empty;

            // 保存命令执行前的数据
            if (firstCommand) // 只有第一条命令保存执行前的数据
            {
                SaveBeforeExecute(flowChartManager.GetArguments());
            }

            description = "粘贴图元";
            Hashtable table = CopyGraphElement(documentManager.CopyTable);

            // 计算图元粘贴位置偏移
            List <GraphElement> graphElementList = new List <GraphElement>();

            foreach (object key in table.Keys)
            {
                graphElementList.Add(key as GraphElement);
            }
            moveSize = InitMoveSize(graphElementList, currentPoint);

            // 加入到绘图容器中
            foreach (object key in table.Keys)
            {
                if (key is SlotContainer) // 插槽容器
                {
                    SlotContainer slotContainer = key as SlotContainer;
                    slotContainer.Move(moveSize);
                    graphManager.SlotContainerList.Add(slotContainer);

                    // 分配新的图元ID
                    slotContainer.ID = graphManager.AllocateGraphElementID();

                    // 复制数据
                    dataManager.AddDataElement(slotContainer);
                    dataManager.SetData(slotContainer, table[key]);
                    dataManager.ReloadData(slotContainer);
                }
                else if (key is ConnectorContainer) // 连接线
                {
                    ConnectorContainer line = key as ConnectorContainer;

                    foreach (ConnectorGraphElement connector in line.GetConnectorList()) // 移动连接线控制点
                    {
                        if (!connector.Binded)                                           // 连接线控制点不是连接线的头结点和尾结点
                        {
                            connector.Move(moveSize);
                        }
                    }

                    graphManager.ConnectorContainerList.Add(line);

                    // 分配新的图元ID
                    line.ID = graphManager.AllocateGraphElementID();

                    // 复制数据
                    dataManager.AddDataElement(line);
                    dataManager.SetData(line, table[key]);
                    dataManager.ReloadData(line);
                }
            }

            // 检查事件结点是否有效
            foreach (object key in table.Keys)
            {
                if (key is SlotContainer) // 插槽容器
                {
                    SlotContainer slotContainer = key as SlotContainer;
                    slotContainer.Enable = dataManager.IsConnectEventNode(slotContainer);
                }
                else if (key is ConnectorContainer) // 连接线
                {
                    ConnectorContainer line = key as ConnectorContainer;
                    line.Enable = dataManager.IsConnectEventNode(line);
                }
            }

            flowChartManager.PasteTable = table;

            if (success) // 保存命令执行后的数据
            {
                flowChartManager.ContentChanged = true;
                SaveAfterExecute(flowChartManager.GetArguments());
            }

            return(success);
        }