Exemple #1
0
        /// <summary>
        /// 检查是否更新事件结点
        /// </summary>
        /// <param name="graphElement">当前图元</param>
        /// <param name="eventNode">事件结点</param>
        /// <returns>是否需要更新</returns>
        protected virtual bool CheckCanBindEventNode(GraphElement graphElement, EventGraphElement eventNode)
        {
            bool         avail        = true;
            GraphManager graphManager = data as GraphManager;
            DataManager  dataManager  = graphManager.CurrentFlowChartManager.CurrentDataManager;
            IComparable  com1;
            IComparable  com2;

            if (graphElement is SlotContainer) // 插槽容器
            {
                SlotContainer slotContainer = graphElement as SlotContainer;
                if (slotContainer.EventNode != null && slotContainer.EventNode != eventNode)
                {
                    com1  = dataManager.GetData(slotContainer.EventNode) as IComparable;
                    com2  = dataManager.GetData(eventNode) as IComparable;
                    avail = (com1.CompareTo(com2) == 0);
                }
            }
            else if (graphElement is ConnectorContainer) // 连接线
            {
                ConnectorContainer line = graphElement as ConnectorContainer;
                if (line.EventNode != null && line.EventNode != eventNode)
                {
                    com1  = dataManager.GetData(line.EventNode) as IComparable;
                    com2  = dataManager.GetData(eventNode) as IComparable;
                    avail = (com1.CompareTo(com2) == 0);
                }
            }

            return(avail);
        }
Exemple #2
0
        /// <summary>
        /// 获取连入的图元链表
        /// </summary>
        /// <param name="graphElement">当前图元</param>
        /// <returns>连入的图元链表</returns>
        public List <GraphElement> GetPreviousGraphElements(GraphElement graphElement)
        {
            List <GraphElement> list = new List <GraphElement>();

            if (graphElement is SlotContainer) // 当前图元是插槽容器
            {
                SlotContainer slotContaienr = graphElement as SlotContainer;

                foreach (SlotGraphElement slot in slotContaienr.GetInSlotList())
                {
                    if (slot.Binded)
                    {
                        list.Add(slot.BindingConnector.Line);
                    }
                }
            }
            else if (graphElement is ConnectorContainer) // 当前图元是连接线控制点容器
            {
                ConnectorContainer line = graphElement as ConnectorContainer;

                if (line.InSlotContainer != null)
                {
                    list.Add(line.InSlotContainer);
                }
            }

            return(list);
        }
Exemple #3
0
 /// <summary>
 /// 添加连接线到区域
 /// </summary>
 /// <param name="line">添加连接线到区域</param>
 public void Add(ConnectorContainer line)
 {
     if (!connectorContainers.Contains(line))
     {
         connectorContainers.Add(line);
     }
 }
Exemple #4
0
        /// <summary>
        /// 检查连接线是否有效
        /// </summary>
        /// <param name="flowChartManager">绘图管理器</param>
        /// <returns>连接线是否有效</returns>
        private bool CheckLineAvail(FlowChartManager flowChartManager)
        {
            bool avail = true;
            ConnectorContainer invalidLine     = null;
            DocumentManager    documentManager = DocumentManager.GetDocumentManager();

            foreach (ConnectorContainer line in flowChartManager.CurrentGraphManager.ConnectorContainerList)
            {
                if (line.InSlotContainer == null || line.OutSlotContainer == null) // 连接线两端必须连接上结点
                {
                    avail       = false;
                    invalidLine = line;
                    documentManager.PrintText(string.Format("ID为{0}的连接线没有正确连接!", line.ID));
                    break;
                }
            }

            if (!avail) // 流程图无效
            {
                MessageBox.Show("绘图中有不完整的连接,请确认所有的连接是否正确!", "流程图有效性检查",
                                MessageBoxButtons.OK, MessageBoxIcon.Information);

                // 显示细节
                List <GraphElement> list = new List <GraphElement>();
                list.Add(invalidLine);
                flowChartManager.CurrentGraphManager.SelectGraphElements(list);
            }

            return(avail);
        }
        protected GraphSetting graphSetting; // 绘图参数配置对象

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="line">连接线控制点所属的连接线</param>
        /// <param name="location">连接点的位置</param>
        /// <param name="size">连接线的大小</param>
        public ConnectorGraphElement(ConnectorContainer line, Point location, Size size)
            : base(location)
        {
            this.line        = line;
            this.location    = location;
            this.elementSize = size;
        }
Exemple #6
0
        /// <summary>
        /// 解除连接图元
        /// </summary>
        /// <param name="flowChartManager">绘图管理器</param>
        /// <param name="logicData">逻辑数据</param>
        /// <returns>是否操作成功</returns>
        protected override bool LogicDisconnect(FlowChartManager flowChartManager, object logicData)
        {
            DataManager dataManager = flowChartManager.CurrentDataManager;

            object[]              args          = logicData as object[];
            SlotGraphElement      slot          = args[0] as SlotGraphElement;
            ConnectorGraphElement connector     = args[1] as ConnectorGraphElement;
            ConnectorContainer    line          = connector.Line;
            SlotContainer         slotContainer = slot.SlotContainer;

            List <GraphElement> list = new List <GraphElement>();         // 记录遍历的图元的链表

            if (connector.IsHeadPoint)                                    // 移出连接线的头结点
            {
                ReBindEventNode(dataManager, list, slotContainer, false); // 重新绑定当前图元与其连出图元的事件结点
            }
            else // 移出连接线的尾结点
            {
                SlotContainer outSlotContainer = connector.Line.OutSlotContainer;

                if (outSlotContainer != null)
                {
                    ReBindEventNode(dataManager, list, connector.Line, false); // 重新绑定当前图元与其连出图元的事件结点
                }
            }

            return(true);
        }
Exemple #7
0
        public static void ConfigureServices(IServiceCollection services)
        {
            ConnectorContainer.ConfigureServices(services);

            services.AddTransient <IApiMapper, ApiMapper>();
            services.AddTransient <IItemsManager, ItemsManager>();
            services.AddTransient <ITrackerParser, TrackerParser>();
            services.AddTransient <ITrackerManager, TrackerManager>();
        }
Exemple #8
0
        /// <summary>
        /// 将连接线从区域中删除
        /// </summary>
        /// <param name="line">当前连接线</param>
        private void DeleteFromRegion(ConnectorContainer line)
        {
            foreach (RegionData regionData in regionDataList)
            {
                regionData.Remove(line);
            }

            backupRegionData.Remove(line);
        }
Exemple #9
0
        /// <summary>
        /// 连接图元
        /// </summary>
        /// <param name="flowChartManager">绘图管理器</param>
        /// <param name="logicData">逻辑数据</param>
        /// <returns>是否操作成功</returns>
        protected virtual bool LogicConnect(FlowChartManager flowChartManager, object logicData)
        {
            object[]              data      = logicData as object[];
            SlotGraphElement      slot      = data[0] as SlotGraphElement;
            ConnectorGraphElement connector = data[1] as ConnectorGraphElement;
            ConnectorContainer    line      = connector.Line;

            if ((line.InSlotContainer != null && line.OutSlotContainer != null) || connector.Selected) // 连接线控制点处于被选中状态
            {
                flowChartManager.CurrentGraphManager.EditDataElement(line);
            }

            return(true);
        }
        /// <summary>
        /// 获取连接的图元
        /// </summary>
        /// <returns>连接的图元</returns>
        public GraphElement GetConnectedOutGraphElement()
        {
            GraphElement graphElement = null;

            foreach (SlotGraphElement slot in outSlotList)
            {
                if (slot.Binded)
                {
                    ConnectorContainer line = slot.BindingConnector.Line;
                    graphElement = line.OutSlotContainer;
                }
            }

            return(graphElement);
        }
Exemple #11
0
        /// <summary>
        /// 检查图元是否能够编辑
        /// </summary>
        /// <param name="graphElement">当前图元</param>
        /// <returns>图元是否能够编辑</returns>
        private bool CheckGraphElementEditable(GraphElement graphElement)
        {
            bool result = true;

            if (graphElement is ConnectorContainer)
            {
                ConnectorContainer line = graphElement as ConnectorContainer;
                if (line.InSlotContainer != null && !(line.InSlotContainer is ConditionGraphElement))
                {
                    result = false;
                }
            }

            return(result);
        }
Exemple #12
0
        /// <summary>
        /// 创建并连接连接线
        /// </summary>
        /// <param name="flowChartManager">绘图管理器</param>
        /// <param name="logicData">逻辑数据</param>
        /// <returns>是否操作成功</returns>
        protected virtual bool LogicCreateAndConnectLine(FlowChartManager flowChartManager, object logicData)
        {
            GraphManager graphManager = flowChartManager.CurrentGraphManager;

            object[]         args    = logicData as object[];
            int              id      = graphManager.AllocateGraphElementID();
            SlotGraphElement outSlot = args[0] as SlotGraphElement;
            SlotGraphElement inSlot  = args[1] as SlotGraphElement;

            ConnectorContainer line = CreateLine(outSlot.Location, inSlot.Location, id);

            flowChartManager.CurrentGraphManager.SelectGraphElement(line, false);

            return(true);
        }
Exemple #13
0
        /// <summary>
        /// 创建连接线
        /// </summary>
        /// <param name="flowChartManager">绘图管理器</param>
        /// <param name="logicData">逻辑数据</param>
        /// <returns>是否操作成功</returns>
        protected virtual bool LogicCreateLine(FlowChartManager flowChartManager, object logicData)
        {
            GraphManager graphManager = flowChartManager.CurrentGraphManager;

            object[]         args = logicData as object[];
            int              id   = graphManager.AllocateGraphElementID();
            SlotGraphElement slot = args[0] as SlotGraphElement;
            Point            p    = (Point)args[1];

            ConnectorContainer line = CreateLine(slot.Location, p, id);

            slot.Bind(line.TailConnector);
            flowChartManager.CurrentGraphManager.SelectGraphElement(line, false);

            return(true);
        }
Exemple #14
0
        /// <summary>
        /// 设置图元是否可用
        /// </summary>
        /// <param name="list">遍历过的图元链表</param>
        /// <param name="graphElement">当前图元</param>
        /// <param name="eventNode">事件结点</param>
        /// <param name="enable">图元是否可用</param>
        protected virtual void ReBindEventNode(List <GraphElement> list, GraphElement graphElement, EventGraphElement eventNode, bool enable)
        {
            if (!list.Contains(graphElement)) // 还没有遍历过当前图元
            {
                GraphManager graphManager = data as GraphManager;
                DataManager  dataManager  = graphManager.CurrentFlowChartManager.CurrentDataManager;

                if (graphElement is SlotContainer) // 该图元是插槽容器
                {
                    SlotContainer slotContainer = graphElement as SlotContainer;

                    if (!enable && slotContainer.EventNode != null && dataManager.IsConnect(slotContainer.EventNode, slotContainer)) // 不需要更新当前图元的事件结点
                    {
                    }
                    else
                    {
                        list.Add(slotContainer);
                        slotContainer.Enable    = enable;
                        slotContainer.EventNode = eventNode;

                        foreach (GraphElement g in dataManager.GetNextGraphElements(graphElement))
                        {
                            ReBindEventNode(list, g, eventNode, enable);
                        }
                    }
                }
                else if (graphElement is ConnectorContainer) // 该图元是连接线控制点容器
                {
                    ConnectorContainer line = graphElement as ConnectorContainer;

                    if (!enable && line.EventNode != null && dataManager.IsConnect(line.EventNode, line)) // 不需要更新当前图元的事件结点
                    {
                    }
                    else
                    {
                        list.Add(line);
                        line.Enable    = enable;
                        line.EventNode = eventNode;

                        foreach (GraphElement g in dataManager.GetNextGraphElements(graphElement))
                        {
                            ReBindEventNode(list, g, eventNode, enable);
                        }
                    }
                }
            }
        }
Exemple #15
0
        /// <summary>
        /// 检查是否连接有事件结点
        /// </summary>
        /// <param name="line">当前连接线</param>
        /// <returns>是否连接有事件结点</returns>
        public bool IsConnectEventNode(ConnectorContainer line)
        {
            bool result = false;

            if (line.RequireEvent) // 需要入口事件
            {
                if (GetEventList(line).Count > 0)
                {
                    result = true;
                }
            }
            else
            {
                result = true;
            }

            return(result);
        }
Exemple #16
0
        /// <summary>
        /// 将连接线加入区域中
        /// </summary>
        /// <param name="line">当前连接线</param>
        private void AddToRegion(ConnectorContainer line)
        {
            bool added = false;

            foreach (RegionData regionData in regionDataList)
            {
                if (regionData.IsInRegion(line.InvalidRectangle))
                {
                    regionData.Add(line);
                    added = true;
                }
            }

            if (!added)
            {
                backupRegionData.Add(line);
            }
        }
        /// <summary>
        /// 执行命令
        /// </summary>
        /// <param name="o">当前对象</param>
        /// <returns>是否执行成功</returns>
        public override bool Execute(object o)
        {
            bool   success = true;
            Helper helper  = Helper.GetHelper();

            object[]         args    = o as object[];
            SlotGraphElement outSlot = args[0] as SlotGraphElement;
            SlotGraphElement inSlot  = args[1] as SlotGraphElement;

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

            // 执行逻辑操作
            LogicBaseManager logicManager = helper.GetLogicManager(flowChartManager.CurrentChartMode);

            logicManager.DoLogicOperation(flowChartManager, LogicType.CreateAndConnectLine, o);

            ConnectorContainer line = graphManager.SelectedGraphElement as ConnectorContainer;

            outSlot.Bind(line.GetConnectorList()[0]);
            inSlot.Bind(line.GetConnectorList()[1]);

            graphManager.ConnectorContainerList.Add(line);
            graphManager.SelectGraphElement(line, false);
            description = "创建并连接图元 " + outSlot.SlotContainer.Name + " - " + inSlot.SlotContainer.Name;
            dataManager.AddDataElement(line);
            graphManager.ReconstructCanvasGraphElementList();

            // 执行逻辑操作
            object[] logicData = new object[] { outSlot, outSlot.BindingConnector };
            logicManager.DoLogicOperation(flowChartManager, LogicType.Connect, logicData);

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

            return(success);
        }
Exemple #18
0
        /// <summary>
        /// 获取有接口选项的连接线
        /// </summary>
        /// <param name="infoString">接口选项</param>
        /// <returns>连接线</returns>
        public ConnectorContainer GetConnectedLine(string infoString)
        {
            ConnectorContainer line = null;

            foreach (SlotGraphElement slot in outSlotList)
            {
                if (slot.Binded)
                {
                    ConnectorContainer connectorContainer = slot.BindingConnector.Line;

                    if (connectorContainer.Text == infoString)
                    {
                        line = connectorContainer;
                        break;
                    }
                }
            }

            return(line);
        }
Exemple #19
0
        /// <summary>
        /// 删除图元之后的操作
        /// </summary>
        /// <param name="flowChartManager">绘图管理器</param>
        /// <param name="logicData">逻辑数据</param>
        /// <returns>是否操作成功</returns>
        protected override bool LogicAfterDelete(FlowChartManager flowChartManager, object logicData)
        {
            DataManager         dataManager      = flowChartManager.CurrentDataManager;
            List <GraphElement> graphElementList = logicData as List <GraphElement>;

            foreach (GraphElement graphElement in graphElementList)
            {
                List <GraphElement> list = new List <GraphElement>();    // 记录遍历过图元的链表
                ReBindEventNode(dataManager, list, graphElement, false); // 重新设定事件结点及图元是否可用

                ConnectorContainer line = graphElement as ConnectorContainer;

                if (line != null)
                {
                    // 连接线恢复可见状态
                    line.Moving  = false;
                    line.Visible = true;
                }
            }

            return(true);
        }
Exemple #20
0
        /// <summary>
        /// 获取兄弟连接线的数据
        /// </summary>
        /// <param name="graphElement">当前图元</param>
        /// <returns>兄弟连接线的数据</returns>
        public Hashtable GetNeighborData(GraphElement graphElement)
        {
            Hashtable table = new Hashtable();

            if (graphElement is ConnectorContainer)
            {
                ConnectorContainer line = graphElement as ConnectorContainer;
                if (line.InSlotContainer != null)
                {
                    List <GraphElement> list = GetNextGraphElements(line.InSlotContainer, false);
                    foreach (GraphElement g in list)
                    {
                        if (g != graphElement)
                        {
                            table[g.ID.ToString()] = GetDataElement(g);
                        }
                    }
                }
            }

            return(table);
        }
        /// <summary>
        /// 执行命令
        /// </summary>
        /// <param name="o">当前对象</param>
        /// <returns>是否执行成功</returns>
        public override bool Execute(object o)
        {
            bool             success = true;
            Helper           helper  = Helper.GetHelper();
            SlotGraphElement slot    = o as SlotGraphElement;

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

            ConnectorGraphElement connector     = slot.BindingConnector;
            ConnectorContainer    line          = connector.Line;
            SlotContainer         slotContainer = slot.SlotContainer;

            description = "解除连接图元 " + slotContainer.Name;

            slot.UnBind();
            if (slot.CanDelete && (slot.IsInSlot || slot.SlotContainer.OutSlotCount > 1)) // 插槽可以删除
            {
                slotContainer.RemoveSlot(slot);
            }

            // 执行逻辑操作
            LogicBaseManager logicManager = helper.GetLogicManager(flowChartManager.CurrentChartMode);

            object[] logicData = new object[] { slot, connector };
            logicManager.DoLogicOperation(flowChartManager, LogicType.Disconnect, logicData);

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

            return(success);
        }
Exemple #22
0
        /// <summary>
        /// 获取连接线对应的事件结点数据链表
        /// </summary>
        /// <param name="connectorContainer">当前连接线</param>
        /// <returns>连接线对应的事件结点数据链表</returns>
        public List <DataElement> GetEventList(ConnectorContainer line)
        {
            List <DataElement> list          = new List <DataElement>();
            SlotContainer      slotContainer = line.InSlotContainer;

            if (slotContainer != null)
            {
                List <SlotContainer> slotContainerList = GetAllPreviousSlotContainers(slotContainer);
                foreach (SlotContainer s in slotContainerList)
                {
                    if (s is EventGraphElement)
                    {
                        DataElement dataElement = graphTable[s] as DataElement;
                        if (dataElement != null)
                        {
                            list.Add(dataElement);
                        }
                    }
                }
            }

            return(list);
        }
Exemple #23
0
        /// <summary>
        /// 更新连接线所在的区域
        /// </summary>
        /// <param name="line">当前连接线</param>
        private void ChangeRegion(ConnectorContainer line)
        {
            bool added = false; // 是否已经添加到区域中

            foreach (RegionData regionData in regionDataList)
            {
                if (regionData.Contains(line) && !regionData.IsInRegion(line.InvalidRectangle))
                {
                    regionData.Remove(line);
                }

                if (!regionData.Contains(line) && regionData.IsInRegion(line.InvalidRectangle))
                {
                    regionData.Add(line);
                    added = true;
                }
            }

            if (!added)
            {
                backupRegionData.Add(line);
            }
        }
Exemple #24
0
        /// <summary>
        /// 删除图元
        /// </summary>
        /// <param name="graphElement">要删除的图元</param>
        /// <return>是否删除成功</return>
        protected bool DeleteGraphElement(GraphElement graphElement)
        {
            GraphManager        graphManager = data as GraphManager;
            DataManager         dataManager  = graphManager.CurrentFlowChartManager.CurrentDataManager;
            List <GraphElement> list         = new List <GraphElement>(); // 记录遍历过图元的链表
            bool deleteSuccess = false;                                   // 是否删除成功

            if (graphElement is SlotContainer)                            // 要删除的图元是插槽容器
            {
                SlotContainer slotContainer = graphElement as SlotContainer;
                ReBindEventNode(list, slotContainer, null, false); // 重新设定事件结点及图元是否可用

                foreach (SlotGraphElement slot in slotContainer.GetSlotList())
                {
                    if (slot.Binded)                                                  // 解除绑定连接线控制点
                    {
                        if (slot.IsOutSlot && slotContainer is ConditionGraphElement) // 对条件结点连出的线要进行有效性检查
                        {
                            ConnectorContainer line = slot.BindingConnector.Line;
                            if (line.Text == "×")
                            {
                                line.Invalid  = false;
                                line.ShowText = false;
                            }
                        }
                        slot.UnBind();
                    }
                }

                graphManager.SlotContainerList.Remove(slotContainer); // 从插槽容器索引链表中删除
                deleteSuccess = true;
            }
            else if (graphElement is ConnectorContainer) // 要删除的图元是连接线控制点容器
            {
                ConnectorContainer connectorContainer = graphElement as ConnectorContainer;

                SlotContainer inSlotContainer = connectorContainer.InSlotContainer;
                if (inSlotContainer != null)
                {
                    connectorContainer.UnbindInSlotContainer();
                }

                ReBindEventNode(list, connectorContainer, null, false); // 重新设定事件结点及图元是否可用

                SlotContainer outSlotContainer = connectorContainer.OutSlotContainer;
                if (outSlotContainer != null)
                {
                    connectorContainer.UnbindOutSlotContainer();
                }

                if (inSlotContainer is ConditionGraphElement) // 对条件结点连出的线要进行有效性检查
                {
                    dataManager.CheckLineValid(inSlotContainer);
                }

                graphManager.ConnectorContainerList.Remove(connectorContainer); // 从连接线控制点索引容器中删除
                deleteSuccess = true;
            }
            else if (graphElement is ConnectorGraphElement) // 要删除的图元是连接线控制点
            {
                ConnectorGraphElement connector = graphElement as ConnectorGraphElement;
                if (connector.IsHeadPoint || connector.IsTailPoint) // 不允许删除头结点和尾结点
                {
                    MessageBox.Show("不能删除头连接线控制点和尾连接线控制点!", "图元删除", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    connector.Line.RemoveConnector(connector);
                    deleteSuccess = true;
                }
            }
            else if (graphElement is SlotGraphElement) // 要删除的图元是插槽
            {
                SlotGraphElement slot = graphElement as SlotGraphElement;

                if (slot.CanDelete && (slot.IsInSlot || slot.SlotContainer.OutSlotCount > 1)) // 插槽可以删除
                {
                    SlotContainer slotContainer = slot.SlotContainer;
                    slotContainer.RemoveSlot(slot);
                    deleteSuccess = true;
                }
                else
                {
                    MessageBox.Show("该插槽不能删除", "图元删除", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else if (graphElement is RemarkGraphElement) // 要删除的图元是注释结点
            {
                RemarkGraphElement remarkGraphElement = graphElement as RemarkGraphElement;
                SlotContainer      slotContainer      = remarkGraphElement.Owner as SlotContainer;

                slotContainer.RemarkNode = null;
                remarkGraphElement.Owner = null;
                remarkGraphElement       = null;
                deleteSuccess            = true;
            }

            if (deleteSuccess) // 释放图元所占的资源
            {
                dataManager.DeleteData(graphElement);
                graphElement.Release();
            }

            return(deleteSuccess);
        }
Exemple #25
0
        /// <summary>
        /// 编辑图元
        /// </summary>
        /// <param name="flowChartManager">绘图管理器</param>
        /// <param name="logicData">逻辑数据</param>
        /// <returns>是否操作成功</returns>
        protected virtual bool LogicEdit(FlowChartManager flowChartManager, object logicData)
        {
            bool executeResult = true;

            GraphManager    graphManager    = flowChartManager.CurrentGraphManager;
            DataManager     dataManager     = flowChartManager.CurrentDataManager;
            DocumentManager documentManager = DocumentManager.GetDocumentManager();
            GraphElement    graphElement    = logicData as GraphElement;
            DataElement     dataElement     = dataManager.GetDataElement(graphElement);

            object    data        = dataManager.GetData(graphElement);
            Hashtable information = new Hashtable();

            information["data"]           = data;
            information["prev_data"]      = dataManager.GetPreviousData(graphElement);
            information["next_data"]      = dataManager.GetNextData(graphElement);
            information["neighbor_data"]  = dataManager.GetNeighborData(graphElement);
            information["globe_args"]     = dataManager.GlobeArgs;
            information["flowchart_name"] = flowChartManager.Name;
            information["map_name"]       = flowChartManager.MapName;
            information["client_dir"]     = Helper.GetHelper().OutputDir;

            dataElement.PrintInformation = new DataElement.PrintInfo(documentManager.PrintText);

            try
            {
                executeResult = dataElement.EditData(information);
            }
            catch (Exception ex)
            {
                executeResult = false;

                MessageBox.Show("当前图元由于以下原因无法编辑:\n\n" + ex.Message, "图元编辑",
                                MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            if (executeResult) // 保存图元数据
            {
                Hashtable    previousDataTable = information["prev_data"] as Hashtable;
                Hashtable    nextDataTable     = information["next_data"] as Hashtable;
                GraphElement currentGraphElement;
                DataElement  editDataElement;

                // 检查是否需要更新图元和数据元的数据
                foreach (string id in previousDataTable.Keys)
                {
                    editDataElement = previousDataTable[id] as DataElement;

                    if (editDataElement != null && editDataElement.Data == null)
                    {
                        currentGraphElement             = dataManager.FindGraphElementByID(int.Parse(id));
                        currentGraphElement.Text        = editDataElement.Text;
                        currentGraphElement.TooltipText = editDataElement.TooltipText;
                        currentGraphElement.ShowText    = false;
                    }
                }

                foreach (string id in nextDataTable.Keys)
                {
                    editDataElement = nextDataTable[id] as DataElement;

                    if (editDataElement != null && editDataElement.Data == null)
                    {
                        currentGraphElement             = dataManager.FindGraphElementByID(int.Parse(id));
                        currentGraphElement.Text        = editDataElement.Text;
                        currentGraphElement.TooltipText = editDataElement.TooltipText;
                        currentGraphElement.ShowText    = false;
                    }
                }

                graphElement.TooltipText = dataElement.TooltipText;
                graphElement.Text        = dataElement.Text;

                if (string.IsNullOrEmpty(dataElement.Text))
                {
                    graphElement.ShowText = false;
                }
                else
                {
                    graphElement.ShowText = true;
                }

                // 调整文本
                if (graphElement is SlotContainer)
                {
                    SlotContainer slotContainer = graphElement as SlotContainer;
                    slotContainer.AdjustText();

                    // 根据文本内容调整插槽容器的大小
                    slotContainer.AdjustElementSize();
                }
                else if (graphElement is ConnectorContainer)
                {
                    ConnectorContainer line = graphElement as ConnectorContainer;
                    line.AdjustText();
                }
            }

            return(executeResult);
        }
Exemple #26
0
        /// <summary>
        /// 删除图元
        /// </summary>
        /// <param name="graphElement">要删除的图元</param>
        /// <return>是否删除成功</return>
        protected bool DeleteGraphElement(GraphElement graphElement)
        {
            Helper           helper           = Helper.GetHelper();
            GraphManager     graphManager     = data as GraphManager;
            FlowChartManager flowChartManager = graphManager.CurrentFlowChartManager;
            DataManager      dataManager      = flowChartManager.CurrentDataManager;
            bool             deleteSuccess    = false; // 是否删除成功

            // 执行逻辑操作
            LogicBaseManager logicManager = helper.GetLogicManager(flowChartManager.CurrentChartMode);

            logicManager.DoLogicOperation(flowChartManager, LogicType.BeforeDelete, graphElement);

            if (graphElement is SlotContainer) // 要删除的图元是插槽容器
            {
                SlotContainer       slotContainer    = graphElement as SlotContainer;
                List <GraphElement> graphElementList = new List <GraphElement>();

                // 解除绑定连接线控制点
                foreach (ConnectorContainer line in slotContainer.GetConnectedLine())
                {
                    graphElementList.Add(line);
                }

                slotContainer.UnBind();

                // 执行逻辑操作
                logicManager.DoLogicOperation(flowChartManager, LogicType.AfterDelete, graphElementList);

                graphManager.SlotContainerList.Remove(slotContainer); // 从插槽容器索引链表中删除
                deleteSuccess = true;
            }
            else if (graphElement is ConnectorContainer) // 要删除的图元是连接线控制点容器
            {
                ConnectorContainer  connectorContainer = graphElement as ConnectorContainer;
                List <GraphElement> graphElementList   = new List <GraphElement>();

                SlotContainer inSlotContainer = connectorContainer.InSlotContainer;
                if (inSlotContainer != null)
                {
                    connectorContainer.UnbindInSlotContainer();
                }

                SlotContainer outSlotContainer = connectorContainer.OutSlotContainer;
                if (outSlotContainer != null)
                {
                    graphElementList.Add(outSlotContainer);
                    connectorContainer.UnbindOutSlotContainer();
                }

                // 执行逻辑操作
                logicManager.DoLogicOperation(flowChartManager, LogicType.AfterDelete, graphElementList);

                graphManager.ConnectorContainerList.Remove(connectorContainer); // 从连接线控制点索引容器中删除
                deleteSuccess = true;
            }
            else if (graphElement is ConnectorGraphElement) // 要删除的图元是连接线控制点
            {
                ConnectorGraphElement connector          = graphElement as ConnectorGraphElement;
                ConnectorContainer    connectorContainer = connector.Line;
                List <GraphElement>   graphElementList   = new List <GraphElement>();

                SlotContainer inSlotContainer = connectorContainer.InSlotContainer;
                if (inSlotContainer != null)
                {
                    connectorContainer.UnbindInSlotContainer();
                }

                SlotContainer outSlotContainer = connectorContainer.OutSlotContainer;
                if (outSlotContainer != null)
                {
                    graphElementList.Add(outSlotContainer);
                    connectorContainer.UnbindOutSlotContainer();
                }

                // 执行逻辑操作
                logicManager.DoLogicOperation(flowChartManager, LogicType.AfterDelete, graphElementList);

                graphManager.ConnectorContainerList.Remove(connectorContainer); // 从连接线控制点索引容器中删除
                deleteSuccess = true;
            }
            else if (graphElement is SlotGraphElement) // 要删除的图元是插槽
            {
                SlotGraphElement slot = graphElement as SlotGraphElement;

                if (slot.CanDelete && (slot.IsInSlot || slot.SlotContainer.OutSlotCount > 1)) // 插槽可以删除
                {
                    SlotContainer slotContainer = slot.SlotContainer;
                    slotContainer.RemoveSlot(slot);
                    deleteSuccess = true;
                }
                else
                {
                    MessageBox.Show("该插槽不能删除", "图元删除", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else if (graphElement is RemarkGraphElement) // 要删除的图元是注释结点
            {
                RemarkGraphElement remarkGraphElement = graphElement as RemarkGraphElement;
                SlotContainer      slotContainer      = remarkGraphElement.Owner as SlotContainer;

                slotContainer.RemarkNode = null;
                remarkGraphElement.Owner = null;
                remarkGraphElement       = null;
                deleteSuccess            = true;
            }

            if (deleteSuccess) // 释放图元所占的资源
            {
                dataManager.DeleteData(graphElement);
                graphElement.Release();
            }

            return(deleteSuccess);
        }
        /// <summary>
        /// 执行命令
        /// </summary>
        /// <param name="o">命令的参数</param>
        /// <returns>是否执行成功</returns>
        public override bool Execute(object o)
        {
            bool success             = true;
            List <GraphElement> list = new List <GraphElement>();

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

            if (graphManager.SelectedGraphElementList.Count > 0) // 剪切多个图元
            {
                List <GraphElement> graphElementList = graphManager.SelectedGraphElementList;
                description = "剪切图元组";

                foreach (GraphElement graphElement in graphElementList)
                {
                    if (graphElement is SlotContainer) // 图元是插槽容器
                    {
                        SlotContainer slotContainer = graphElement as SlotContainer;

                        foreach (SlotGraphElement slot in slotContainer.GetSlotList())
                        {
                            if (slot.Binded && !graphElementList.Contains(slot.BindingConnector.Line))
                            {
                                slot.UnBind();
                            }
                        }

                        graphManager.SlotContainerList.Remove(slotContainer);
                    }
                    else if (graphElement is ConnectorContainer) // 图元是连接线
                    {
                        ConnectorContainer      line           = graphElement as ConnectorContainer;
                        List <SlotGraphElement> deleteSlotList = new List <SlotGraphElement>();

                        if (line.InSlotContainer != null && !graphElementList.Contains(line.InSlotContainer))
                        {
                            line.UnbindInSlotContainer();
                        }

                        graphManager.ConnectorContainerList.Remove(line);
                    }

                    list.Add(graphElement);
                }
            }
            else // 剪切单个图元
            {
                GraphElement graphElement = graphManager.SelectedGraphElement;
                description = "剪切图元 " + graphElement.Name;

                if (graphElement is SlotContainer) // 图元是插槽容器
                {
                    SlotContainer slotContainer = graphElement as SlotContainer;

                    slotContainer.UnBind();
                    graphManager.SlotContainerList.Remove(slotContainer);
                }
                else if (graphElement is ConnectorContainer) // 图元是连接线
                {
                    ConnectorContainer line = graphElement as ConnectorContainer;

                    if (line.InSlotContainer != null)
                    {
                        line.UnbindInSlotContainer();
                    }

                    if (line.OutSlotContainer != null)
                    {
                        line.UnbindOutSlotContainer();
                    }

                    graphManager.ConnectorContainerList.Remove(line);
                }

                list.Add(graphElement);
            }

            Hashtable cutTable = new Hashtable();

            foreach (GraphElement g in list)
            {
                cutTable[g] = dataManager.GetData(g);
            }
            documentManager.CopyTable = cutTable;

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

            return(success);
        }
Exemple #28
0
        /// <summary>
        /// 获取连出的图元链表
        /// </summary>
        /// <param name="graphElement">当前图元</param>
        /// <param name="hasInnerChart">是否处理子绘图</param>
        /// <returns>连出的图元链表</returns>
        public List <GraphElement> GetNextGraphElements(GraphElement graphElement, bool dealInnerChart)
        {
            List <GraphElement> list = new List <GraphElement>();

            if (graphElement is SlotContainer) // 当前图元是插槽容器
            {
                SlotContainer slotContainer = graphElement as SlotContainer;

                foreach (SlotGraphElement slot in slotContainer.GetOutSlotList())
                {
                    if (slot.Binded)
                    {
                        list.Add(slot.BindingConnector.Line);
                    }
                }
            }
            else if (graphElement is ConnectorContainer) // 当前图元是连接线控制点容器
            {
                ConnectorContainer line = graphElement as ConnectorContainer;

                if (line.OutSlotContainer != null)
                {
                    if (dealInnerChart)
                    {
                        SlotContainer slotContainer = line.OutSlotContainer;

                        if (slotContainer is InnerChart)
                        {
                            SlotGraphElement slot             = slotContainer.GetBindedInSlot(line);
                            InnerChartEditor innerChartEditor = GetDataElement(slotContainer) as InnerChartEditor;

                            if (slot != null)
                            {
                                InterfaceGraphElement interfaceNode = innerChartEditor.GetInterfaceNode(slot.Tag.ToString());

                                if (interfaceNode != null)
                                {
                                    GraphElement connectedGraphElement = interfaceNode.GetConnectedOutGraphElement();

                                    if (connectedGraphElement != null)
                                    {
                                        list.Add(connectedGraphElement);
                                    }
                                }
                            }
                        }
                        else if (slotContainer is InterfaceGraphElement)
                        {
                            InnerChart innerChart = FindGraphElementByID(int.Parse(slotContainer.Tag as string)) as InnerChart;

                            foreach (SlotGraphElement slot in innerChart.GetOutSlotList())
                            {
                                if (slot.Binded)
                                {
                                    ConnectorContainer connectedLine = slot.BindingConnector.Line;
                                    string             lineData      = GetData(connectedLine) as string;

                                    if (!string.IsNullOrEmpty(lineData))
                                    {
                                        string[] dataArray = lineData.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);

                                        if (dataArray[0] == slotContainer.ID.ToString())
                                        {
                                            list.AddRange(GetNextGraphElements(slot.BindingConnector.Line, true));
                                            break;
                                        }
                                    }

                                    /*
                                     * if (!string.IsNullOrEmpty(connectedLine.Text))
                                     * {
                                     *  string[] dataArray = connectedLine.Text.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                                     *
                                     *  if (dataArray[0] == slotContainer.ID.ToString())
                                     *  {
                                     *      list.AddRange(GetNextGraphElements(slot.BindingConnector.Line, true));
                                     *      break;
                                     *  }
                                     * }
                                     */
                                }
                            }

                            /*
                             * foreach (SlotGraphElement slot in innerChart.GetOutSlotList())
                             * {
                             *  if (slot.Tag.ToString() == slotContainer.ID.ToString())
                             *  {
                             *      slotGraphElement = slot;
                             *      break;
                             *  }
                             * }
                             *
                             * if (slotGraphElement != null)
                             * {
                             *  if (slotGraphElement.Binded)
                             *  {
                             *      list.AddRange(GetNextGraphElements(slotGraphElement.BindingConnector.Line, true));
                             *  }
                             * }
                             */
                        }
                        else
                        {
                            list.Add(slotContainer);
                        }
                    }
                    else
                    {
                        list.Add(line.OutSlotContainer);
                    }
                }
            }

            return(list);
        }
Exemple #29
0
            /// <summary>
            /// 检查区域中是否包含当前连接线
            /// </summary>
            /// <param name="line">当前连接线</param>
            /// <returns>区域中是否包含当前连接线</returns>
            public bool Contains(ConnectorContainer line)
            {
                bool result = connectorContainers.Contains(line);

                return(result);
            }
Exemple #30
0
 /// <summary>
 /// 删除区域中的连接线
 /// </summary>
 /// <param name="line">当前连接线</param>
 public void Remove(ConnectorContainer line)
 {
     connectorContainers.Remove(line);
 }