using Serein.Library.FlowNode; using Serein.Library.Utils; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace Serein.Library.Api { #region 环境委托 /// /// 流程运行完成 /// /// public delegate void FlowRunCompleteHandler(FlowEventArgs eventArgs); /// /// 项目加载完成 /// public delegate void ProjectLoadedHandler(ProjectLoadedEventArgs eventArgs); /// /// 项目准备保存 /// /// public delegate void ProjectSavingHandler(ProjectSavingEventArgs eventArgs); /// /// 加载项目文件时成功加载了DLL文件 /// public delegate void LoadDllHandler(LoadDllEventArgs eventArgs); /// /// 移除了加载的dll /// /// public delegate void RemoteDllHandler(RemoteDllEventArgs eventArgs); /// /// 运行环境节点连接发生了改变 /// /// public delegate void NodeConnectChangeHandler(NodeConnectChangeEventArgs eventArgs); /// /// 环境中新增了一个画布 /// /// public delegate void CanvasCreateHandler(CanvasCreateEventArgs eventArgs); /// /// 环境中移除了一个画布 /// /// public delegate void CanvasRemoveHandler(CanvasRemoveEventArgs eventArgs); /// /// 环境中加载了一个节点 /// /// public delegate void NodeCreateHandler(NodeCreateEventArgs eventArgs); /// /// 环境中移除了一个节点 /// /// public delegate void NodeRemoveHandler(NodeRemoveEventArgs eventArgs); /// /// 节点放置事件 /// /// public delegate void NodePlaceHandler(NodePlaceEventArgs eventArgs); /// /// 节点取出事件 /// /// public delegate void NodeTakeOutHandler(NodeTakeOutEventArgs eventArgs); /// /// 环境中流程起始节点发生了改变 /// /// public delegate void StartNodeChangeHandler(StartNodeChangeEventArgs eventArgs); /// /// 被监视的对象改变事件 /// /// public delegate void MonitorObjectChangeHandler(MonitorObjectEventArgs eventArgs); /// /// 节点中断状态改变事件(开启了中断/取消了中断) /// /// public delegate void NodeInterruptStateChangeHandler(NodeInterruptStateChangeEventArgs eventArgs); /// /// 节点触发中断事件 /// /// public delegate void ExpInterruptTriggerHandler(InterruptTriggerEventArgs eventArgs); /// /// IOC容器发生变化 /// public delegate void IOCMembersChangedHandler(IOCMembersChangedEventArgs eventArgs); /// /// 节点需要定位 /// /// public delegate void NodeLocatedHandler(NodeLocatedEventArgs eventArgs); /// /// 远程环境内容输出 /// /// 输出的日志类别 /// 输出的文本信息 public delegate void EnvOutHandler(InfoType type, string value); #endregion #region 环境事件签名 /// /// 流程事件签名基类 /// public class FlowEventArgs : EventArgs { /// /// 是否完成 /// public bool IsSucceed { get;} = true; /// /// 错误提示 /// public string ErrorTips { get;} = string.Empty; } /// /// 项目加载完成 /// public class ProjectLoadedEventArgs : FlowEventArgs { public ProjectLoadedEventArgs() { } } /// /// 项目保存 /// public class ProjectSavingEventArgs : FlowEventArgs { public ProjectSavingEventArgs(SereinProjectData projectData) { ProjectData = projectData; } /// /// 项目数据 /// public SereinProjectData ProjectData { get; } } /// /// 加载了DLL外部依赖 /// public class LoadDllEventArgs : FlowEventArgs { public LoadDllEventArgs(FlowLibraryInfo nodeLibraryInfo) { this.NodeLibraryInfo = nodeLibraryInfo; } /// /// 已加载了的程序集 /// public FlowLibraryInfo NodeLibraryInfo { get;} } /// /// 移除了DLL外部依赖 /// public class RemoteDllEventArgs : FlowEventArgs { public RemoteDllEventArgs() { } } /// /// 改变节点连接关系 /// public class NodeConnectChangeEventArgs : FlowEventArgs { /// /// 连接关系改变类型 /// public enum ConnectChangeType { /// /// 创建 /// Create, /// /// 移除 /// Remove, } /// /// 更改方法调用关系 /// /// /// /// /// /// public NodeConnectChangeEventArgs(string canvasGuid, string fromNodeGuid, string toNodeGuid, JunctionOfConnectionType junctionOfConnectionType, // 指示需要创建什么类型的连接线 ConnectionInvokeType connectionInvokeType, // 节点调用的方法类型(true/false/error/cancel ) ConnectChangeType changeType) // 需要创建连接线还是删除连接线 { this.CanvasGuid = canvasGuid; this.FromNodeGuid = fromNodeGuid; this.ToNodeGuid = toNodeGuid; this.ConnectionInvokeType = connectionInvokeType; this.ChangeType = changeType; this.JunctionOfConnectionType = junctionOfConnectionType; } /// /// 更改参数传递关系 /// /// /// /// /// /// /// public NodeConnectChangeEventArgs(string canvasGuid, string fromNodeGuid, string toNodeGuid, int argIndex, JunctionOfConnectionType junctionOfConnectionType, // 指示需要创建什么类型的连接线 ConnectionArgSourceType connectionArgSourceType, // 节点对应的方法入参所需参数来源 ConnectChangeType changeType) // 需要创建连接线还是删除连接线 { CanvasGuid = canvasGuid; this.FromNodeGuid = fromNodeGuid; this.ToNodeGuid = toNodeGuid; this.ChangeType = changeType; this.ArgIndex = argIndex; this.ConnectionArgSourceType = connectionArgSourceType; this.JunctionOfConnectionType = junctionOfConnectionType; } public string CanvasGuid { get; } /// /// 连接关系中始节点的Guid /// public string FromNodeGuid { get;} /// /// 连接关系中目标节点的Guid /// public string ToNodeGuid { get;} /// /// 连接类型 /// public ConnectionInvokeType ConnectionInvokeType { get; } = ConnectionInvokeType.None; /// /// 表示此次需要在两个节点之间创建连接关系,或是移除连接关系 /// public ConnectChangeType ChangeType { get;} /// /// 指示需要创建什么类型的连接线 /// public JunctionOfConnectionType JunctionOfConnectionType { get; } = JunctionOfConnectionType.None; /// /// 节点对应的方法入参所需参数来源 /// public ConnectionArgSourceType ConnectionArgSourceType { get;} /// /// 第几个参数 /// public int ArgIndex { get; } = -1; } /// /// 添加了一个画布 /// public class CanvasCreateEventArgs : FlowEventArgs { public CanvasCreateEventArgs(FlowCanvasDetails model) { Model = model; } public FlowCanvasDetails Model { get; } } /// /// 移除了一个画布 /// public class CanvasRemoveEventArgs : FlowEventArgs { public CanvasRemoveEventArgs(string canvasGuid) { CanvasGuid = canvasGuid; } public string CanvasGuid { get; } } /// /// 添加了节点 /// public class NodeCreateEventArgs : FlowEventArgs { /// /// 节点添加事件参数 /// /// 画布 /// 节点对象 /// 位置 public NodeCreateEventArgs(string canvasGuid, IFlowNode nodeModel, PositionOfUI position) { CanvasGuid = canvasGuid; this.NodeModel = nodeModel; this.Position = position; } /// /// 所处画布Guid /// public string CanvasGuid { get; } /// /// 节点Model对象 /// public IFlowNode NodeModel { get; private set; } /// /// 在UI上的位置 /// public PositionOfUI Position { get; private set; } /// /// 容器 /// //public string RegeionGuid { get; private set; } } /// /// 移除了节点的事件 /// public class NodeRemoveEventArgs : FlowEventArgs { public NodeRemoveEventArgs(string canvasGuid, string nodeGuid) { CanvasGuid = canvasGuid; this.NodeGuid = nodeGuid; } public string CanvasGuid { get; } /// /// 被移除节点的Guid /// public string NodeGuid { get; private set; } } /// /// 节点放置事件参数 /// public class NodePlaceEventArgs : FlowEventArgs { public NodePlaceEventArgs(string canvasGuid, string nodeGuid, string containerNodeGuid) { CanvasGuid = canvasGuid; NodeGuid = nodeGuid; ContainerNodeGuid = containerNodeGuid; } public string CanvasGuid { get; } /// /// 子节点,该数据为此次时间的主节点 /// public string NodeGuid { get; private set; } /// /// 父节点 /// public string ContainerNodeGuid { get; private set; } } /// /// 节点取出事件参数 /// public class NodeTakeOutEventArgs : FlowEventArgs { public NodeTakeOutEventArgs(string canvasGuid, string containerNodeGuid, string nodeGuid) { CanvasGuid = canvasGuid; NodeGuid = nodeGuid; ContainerNodeGuid = containerNodeGuid; } public string CanvasGuid { get; } /// /// 需要取出的节点Guid /// public string NodeGuid { get; private set; } /// /// 容器节点Guid /// public string ContainerNodeGuid { get; private set; } } public class StartNodeChangeEventArgs : FlowEventArgs { public StartNodeChangeEventArgs(string canvasGuid, string oldNodeGuid, string newNodeGuid) { CanvasGuid = canvasGuid; this.OldNodeGuid = oldNodeGuid; this.NewNodeGuid = newNodeGuid; ; } public string CanvasGuid { get; } /// /// 原来的起始节点Guid /// public string OldNodeGuid { get; private set; } /// /// 新的起始节点Guid /// public string NewNodeGuid { get; private set; } } /// /// 监视的节点数据发生变化 /// public class MonitorObjectEventArgs : FlowEventArgs { /// /// 变化的数据类别 /// public enum ObjSourceType { /// /// 流程节点的数据 /// NodeFlowData, /// /// IOC容器对象 /// IOCObj, } /// /// 在某个节点运行时,监听的数据发生了改变 /// /// /// /// public MonitorObjectEventArgs(string nodeGuid, object monitorData, ObjSourceType objSourceType) { NodeGuid = nodeGuid; NewData = monitorData; ObjSource = objSourceType; } /// /// 中断的节点Guid /// public string NodeGuid { get;} /// /// 监听对象类别 /// public ObjSourceType ObjSource { get;} /// /// 新的数据 /// public object NewData { get;} } /// /// 节点中断状态改变事件参数 /// public class NodeInterruptStateChangeEventArgs : FlowEventArgs { public NodeInterruptStateChangeEventArgs(string nodeGuid,bool isInterrupt) { NodeGuid = nodeGuid; // Class = @class; IsInterrupt = isInterrupt; } /// /// 中断的节点Guid /// public string NodeGuid { get;} public bool IsInterrupt { get;} // public InterruptClass Class { get;} } /// /// 节点触发了中断事件参数 /// public class InterruptTriggerEventArgs : FlowEventArgs { public enum InterruptTriggerType { /// /// 主动监视中断 /// Monitor, /// /// 表达式中断 /// Exp, /// /// 对象监视中断 /// Obj, } public InterruptTriggerEventArgs(string nodeGuid, string expression, InterruptTriggerType type) { this.NodeGuid = nodeGuid; this.Expression = expression; this.Type = type; } /// /// 中断的节点Guid /// public string NodeGuid { get;} public string Expression { get;} public InterruptTriggerType Type { get;} } /// /// 流程事件签名基类 /// public class IOCMembersChangedEventArgs : FlowEventArgs { public enum EventType { /// /// 登记了类型 /// Registered, /// /// 构建了类型 /// Completeuild, } public IOCMembersChangedEventArgs(string key, object instance) { this.Key = key; this.Instance = instance; } public string Key { get; private set; } public object Instance { get; private set; } } /// /// 节点需要定位 /// public class NodeLocatedEventArgs : FlowEventArgs { public NodeLocatedEventArgs(string nodeGuid) { NodeGuid = nodeGuid; } public string NodeGuid { get; private set; } } /* /// /// 节点移动了 /// public class NodeMovedEventArgs : FlowEventArgs { public NodeMovedEventArgs(string nodeGuid, double x, double y) { this.NodeGuid = nodeGuid; this.X = x; this.Y = y; } /// /// 节点唯一标识 /// public string NodeGuid { get; private set; } /// /// 画布上的x坐标 /// public double X { get; private set; } /// /// 画布上的y坐标 /// public double Y { get; private set; } }*/ #endregion /// /// 流程环境事件接口 /// public interface IFlowEnvironmentEvent { /// /// 加载Dll /// event LoadDllHandler DllLoad; /// /// 项目加载完成 /// event ProjectLoadedHandler ProjectLoaded; /// /// 项目准备保存 /// event ProjectSavingHandler ProjectSaving; /// /// 节点连接属性改变事件 /// event NodeConnectChangeHandler NodeConnectChanged; /// /// 增加画布事件 /// event CanvasCreateHandler CanvasCreated; /// /// 删除画布事件 /// event CanvasRemoveHandler CanvasRemoved; /// /// 节点创建事件 /// event NodeCreateHandler NodeCreated; /// /// 移除节点事件 /// event NodeRemoveHandler NodeRemoved; /// /// 节点放置事件 /// event NodePlaceHandler NodePlace; /// /// 节点取出事件 /// event NodeTakeOutHandler NodeTakeOut; /// /// 起始节点变化事件 /// event StartNodeChangeHandler StartNodeChanged; /// /// 流程运行完成事件 /// event FlowRunCompleteHandler FlowRunComplete; /// /// 被监视的对象改变事件 /// event MonitorObjectChangeHandler MonitorObjectChanged; /// /// 节点中断状态变化事件 /// event NodeInterruptStateChangeHandler NodeInterruptStateChanged; /// /// 触发中断 /// event ExpInterruptTriggerHandler InterruptTriggered; /// /// IOC容器发生改变 /// event IOCMembersChangedHandler IOCMembersChanged; /// /// 节点需要定位 /// event NodeLocatedHandler NodeLocated; /// /// 运行环境输出 /// event EnvOutHandler EnvOutput; public void OnDllLoad(LoadDllEventArgs eventArgs); public void OnProjectLoaded(ProjectLoadedEventArgs eventArgs); public void OnProjectSaving(ProjectSavingEventArgs eventArgs); public void OnNodeConnectChanged(NodeConnectChangeEventArgs eventArgs); public void OnCanvasCreated(CanvasCreateEventArgs eventArgs); public void OnCanvasRemoved(CanvasRemoveEventArgs eventArgs); public void OnNodeCreated(NodeCreateEventArgs eventArgs); public void OnNodeRemoved(NodeRemoveEventArgs eventArgs); public void OnNodePlace(NodePlaceEventArgs eventArgs); public void OnNodeTakeOut(NodeTakeOutEventArgs eventArgs); public void OnStartNodeChanged(StartNodeChangeEventArgs eventArgs); public void OnFlowRunComplete(FlowEventArgs eventArgs); public void OnMonitorObjectChanged(MonitorObjectEventArgs eventArgs); public void OnNodeInterruptStateChanged(NodeInterruptStateChangeEventArgs eventArgs); public void OnInterruptTriggered(InterruptTriggerEventArgs eventArgs); public void OnIOCMembersChanged(IOCMembersChangedEventArgs eventArgs); public void OnNodeLocated(NodeLocatedEventArgs eventArgs); public void OnEnvOutput(InfoType type, string value); } /// /// 运行环境 /// public interface IFlowEnvironment { #region 属性 /// /// 运行环境使用的IOC,默认情况下无需对其进行调用 /// ISereinIOC IOC { get; } /// /// 流程编辑接口 /// IFlowEdit FlowEdit { get; } /// /// 流程控制接口 /// IFlowControl FlowControl { get; } /// /// 流程事件接口 /// IFlowEnvironmentEvent Event { get; } /// /// 环境名称 /// string EnvName { get; } /// /// 项目文件位置 /// string ProjectFileLocation { get; } /// /// 是否全局中断 /// bool _IsGlobalInterrupt { get; } /// /// 表示是否正在控制远程 /// Local control remote env /// bool IsControlRemoteEnv { get; } /// /// 信息输出等级 /// InfoClass InfoClass { get; set; } /// /// 流程运行状态 /// RunState FlowState { get; set; } /// /// 表示当前环境 /// IFlowEnvironment CurrentEnv { get; } /// /// 由运行环境提供的UI线程上下文操作,用于类库中需要在UI线程中操作视觉元素的场景 /// UIContextOperation UIContextOperation { get; } #endregion #region 基本接口 /// /// 输出信息 /// /// 消息 /// 输出类型 /// 输出级别 void WriteLine(InfoType type, string message, InfoClass @class = InfoClass.Trivial); /// /// 提供设置UI上下文的能力 /// 提供设置UI上下文的能力,在WinForm/WPF项目中,在UI线程外对UI元素的修改将会导致异常 /// 需要你提供 /// /// void SetUIContextOperation(UIContextOperation uiContextOperation); #endregion #region 项目相关操作 /// /// 加载项目文件 /// /// void LoadProject(string filePath); /// /// 加载项目文件 /// /// Task LoadProjetAsync(string filePath); /// /// 保存项目 /// void SaveProject(); /// /// 获取当前项目信息 /// /// Task GetProjectInfoAsync(); #endregion #region 获取节点信息,获取方法信息,获取Emit委托 /// /// 获取节点信息 /// /// /// /// bool TryGetNodeModel(string nodeGuid, out IFlowNode nodeModel); /// /// 获取方法描述信息 /// /// 程序集名称 /// 方法描述 /// 方法信息 /// bool TryGetMethodDetailsInfo(string assemblyName, string methodName, out MethodDetailsInfo mdInfo); /// /// 获取指定方法的Emit委托 /// /// 程序集名称 /// /// /// bool TryGetDelegateDetails(string assemblyName, string methodName, out DelegateDetails del); #endregion #region 类库依赖相关 /// /// 从文件中加载Dll /// /// void LoadLibrary(string dllPath); /// /// 移除DLL /// /// 程序集的名称 bool TryUnloadLibrary(string assemblyFullName); /// /// 运行时加载 /// /// 文件名 /// bool LoadNativeLibraryOfRuning(string file); /// /// 运行时加载指定目录下的类库 /// /// 目录 /// 是否递归加载 void LoadAllNativeLibraryOfRuning(string path, bool isRecurrence = true); #endregion #region 远程相关 /*/// /// 启动远程服务 /// Task StartRemoteServerAsync(int port = 7525); /// /// 停止远程服务 /// void StopRemoteServer(); /// /// (适用于远程连接后获取环境的运行状态)获取当前环境的信息 /// /// Task GetEnvInfoAsync(); /// /// 加载远程环境 /// /// 远程环境地址 /// 远程环境端口 /// 密码 Task<(bool, RemoteMsgUtil)> ConnectRemoteEnv(string addres, int port, string token); /// /// 退出远程环境 /// void ExitRemoteEnv(); */ /// /// (用于远程)通知节点属性变更 /// /// 节点Guid /// 属性路径 /// 属性值 /// Task NotificationNodeValueChangeAsync(string nodeGuid, string path, object value); #endregion #region 节点中断、表达式(暂时没用) #if false /// /// 设置节点中断 /// /// 更改中断状态的节点Guid /// 是否中断 /// Task SetNodeInterruptAsync(string nodeGuid, bool isInterrup); /// /// 添加作用于某个对象的中断表达式 /// /// /// /// Task AddInterruptExpressionAsync(string key, string expression); /// /// 监视指定对象 /// /// 需要监视的对象 /// 是否启用监视 void SetMonitorObjState(string key, bool isMonitor); /// /// 检查一个对象是否处于监听状态,如果是,则传出与该对象相关的表达式(用于中断),如果不是,则返回false。 /// /// 判断的对象 /// Task<(bool, string[])> CheckObjMonitorStateAsync(string key); /// /// 全局中断 /// /// /// /// Task InterruptNode(); #endif #endregion } }