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
{
///
/// 加载了DLL外部依赖事件参数
///
///
public LoadDllEventArgs(FlowLibraryInfo nodeLibraryInfo)
{
this.NodeLibraryInfo = nodeLibraryInfo;
}
///
/// 已加载了的程序集
///
public FlowLibraryInfo NodeLibraryInfo { get;}
}
///
/// 移除了DLL外部依赖
///
public class RemoteDllEventArgs : FlowEventArgs
{
///
/// 移除了DLL外部依赖事件参数
///
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;
}
///
/// 连接关系所在的画布Guid
///
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;
}
///
/// 所处画布Guid
///
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 class NodeRemoveEventArgs : FlowEventArgs
{
///
/// 被移除节点事件参数
///
///
///
public NodeRemoveEventArgs(string canvasGuid, string nodeGuid)
{
CanvasGuid = canvasGuid;
this.NodeGuid = nodeGuid;
}
///
/// 被移除节点所在的画布Guid
///
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;
}
///
/// 画布Guid
///
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;
}
///
/// 所在画布Guid
///
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; ;
}
///
/// 所在画布Guid
///
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 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
{
///
/// IOC成员发生改变的事件类型
///
public enum EventType
{
///
/// 登记了类型
///
Registered,
///
/// 构建了类型
///
Completeuild,
}
///
/// IOC成员发生改变事件参数
///
///
///
public IOCMembersChangedEventArgs(string key, object instance)
{
this.Key = key;
this.Instance = instance;
}
///
/// IOC成员发生改变事件参数
///
public string Key { get; private set; }
///
/// IOC成员发生改变事件参数
///
public object Instance { get; private set; }
}
///
/// 节点需要定位
///
public class NodeLocatedEventArgs : FlowEventArgs
{
///
/// 节点需要定位事件参数
///
///
public NodeLocatedEventArgs(string nodeGuid)
{
NodeGuid = nodeGuid;
}
///
/// 节点需要定位事件参数
///
public string NodeGuid { 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;
///
/// 加载了DLL外部依赖事件
///
///
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);
///
/// IOC容器成员发生了改变事件
///
///
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.Debug);
///
/// 提供设置UI上下文的能力
/// 提供设置UI上下文的能力,在WinForm/WPF项目中,在UI线程外对UI元素的修改将会导致异常
/// 需要你提供
///
///
void SetUIContextOperation(UIContextOperation uiContextOperation);
#endregion
#region 项目相关操作
///
/// 加载项目文件
///
///
void LoadProject(string filePath);
///
/// 加载项目文件
///
///
Task LoadProjetAsync(string filePath);
///
/// 保存项目
///
void SaveProject();
///
/// 获取当前项目信息
///
///
SereinProjectData 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
}
}