using Serein.Library.Utils;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using static Serein.Library.Utils.ChannelFlowInterrupt;
namespace Serein.Library.Api
{
#region 环境委托
///
/// 流程运行完成
///
///
public delegate void FlowRunCompleteHandler(FlowEventArgs eventArgs);
///
/// 项目加载完成
///
public delegate void ProjectLoadedHandler(ProjectLoadedEventArgs eventArgs);
///
/// 加载项目文件时成功加载了DLL文件
///
public delegate void LoadDllHandler(LoadDllEventArgs eventArgs);
///
/// 移除了加载的dll
///
///
public delegate void RemoteDllHandler(RemoteDllEventArgs eventArgs);
///
/// 运行环境节点连接发生了改变
///
///
public delegate void NodeConnectChangeHandler(NodeConnectChangeEventArgs eventArgs);
///
/// 环境中加载了一个节点
///
///
public delegate void NodeCreateHandler(NodeCreateEventArgs 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 NodeMovedHandler(NodeMovedEventArgs eventArgs);
///
/// 远程环境内容输出
///
/// 输出的文本信息
public delegate void EnvOutHandler(string value);
#endregion
#region 环境事件签名
///
/// 流程事件签名基类
///
public class FlowEventArgs : EventArgs
{
///
/// 是否完成
///
public bool IsSucceed { get; protected set; } = true;
///
/// 错误提示
///
public string ErrorTips { get; protected set; } = string.Empty;
}
//public class LoadNodeEventArgs : FlowEventArgs
//{
// public LoadNodeEventArgs(NodeInfo NodeInfo, MethodDetails MethodDetailss)
// {
// this.NodeInfo = NodeInfo;
// this.MethodDetailss = MethodDetailss;
// }
// ///
// /// 项目文件节点信息参数
// ///
// public NodeInfo NodeInfo { get; protected set; }
// ///
// /// 已加载在环境中的方法描述
// ///
// public MethodDetails MethodDetailss { get; protected set; }
//}
public class ProjectLoadedEventArgs : FlowEventArgs
{
public ProjectLoadedEventArgs()
{
}
}
public class LoadDllEventArgs : FlowEventArgs
{
public LoadDllEventArgs(NodeLibrary nodeLibrary, List MethodDetailss)
{
this.NodeLibrary = nodeLibrary;
this.MethodDetailss = MethodDetailss;
}
///
/// 已加载了的程序集
///
public NodeLibrary NodeLibrary { get; protected set; }
///
/// dll文件中有效的流程方法描述
///
public List MethodDetailss { get; protected set; }
}
public class RemoteDllEventArgs : FlowEventArgs
{
public RemoteDllEventArgs()
{
}
}
public class NodeConnectChangeEventArgs : FlowEventArgs
{
///
/// 连接关系改变类型
///
public enum ConnectChangeType
{
///
/// 创建
///
Create,
///
/// 移除
///
Remote,
}
public NodeConnectChangeEventArgs(string fromNodeGuid, string toNodeGuid, ConnectionType connectionType, ConnectChangeType changeType)
{
this.FromNodeGuid = fromNodeGuid;
this.ToNodeGuid = toNodeGuid;
this.ConnectionType = connectionType;
this.ChangeType = changeType;
}
///
/// 连接关系中始节点的Guid
///
public string FromNodeGuid { get; protected set; }
///
/// 连接关系中目标节点的Guid
///
public string ToNodeGuid { get; protected set; }
///
/// 连接类型
///
public ConnectionType ConnectionType { get; protected set; }
///
/// 表示此次需要在两个节点之间创建连接关系,或是移除连接关系
///
public ConnectChangeType ChangeType { get; protected set; }
}
public class NodeCreateEventArgs : FlowEventArgs
{
public NodeCreateEventArgs(object nodeModel, PositionOfUI position)
{
this.NodeModel = nodeModel;
this.Position = position;
}
public NodeCreateEventArgs(object nodeModel, bool isAddInRegion, string regeionGuid)
{
this.NodeModel = nodeModel;
this.RegeionGuid = regeionGuid;
this.IsAddInRegion = isAddInRegion;
}
///
/// 节点Model对象,目前需要手动转换对应的类型
///
public object NodeModel { get; private set; }
public PositionOfUI Position { get; private set; }
public bool IsAddInRegion { get; private set; }
public string RegeionGuid { get; private set; }
}
///
/// 环境中移除了一个节点
///
///
public delegate void NodeRemoveHandler(NodeRemoveEventArgs eventArgs);
public class NodeRemoveEventArgs : FlowEventArgs
{
public NodeRemoveEventArgs(string nodeGuid)
{
this.NodeGuid = nodeGuid;
}
///
/// 被移除节点的Guid
///
public string NodeGuid { get; private set; }
}
public class StartNodeChangeEventArgs : FlowEventArgs
{
public StartNodeChangeEventArgs(string oldNodeGuid, string newNodeGuid)
{
this.OldNodeGuid = oldNodeGuid;
this.NewNodeGuid = newNodeGuid; ;
}
///
/// 原来的起始节点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; protected set; }
///
/// 监听对象类别
///
public ObjSourceType ObjSource { get; protected set; }
///
/// 新的数据
///
public object NewData { get; protected set; }
}
///
/// 节点中断状态改变事件参数
///
public class NodeInterruptStateChangeEventArgs : FlowEventArgs
{
public NodeInterruptStateChangeEventArgs(string nodeGuid, InterruptClass @class)
{
NodeGuid = nodeGuid;
Class = @class;
}
///
/// 中断的节点Guid
///
public string NodeGuid { get; protected set; }
public InterruptClass Class { get; protected set; }
}
///
/// 节点触发了中断事件参数
///
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; protected set; }
public string Expression { get; protected set; }
public InterruptTriggerType Type { get; protected set; }
}
///
/// 流程事件签名基类
///
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 IFlowEnvironment
{
#region 属性
///
/// 单例模式IOC容器,内部维护了一个实例字典,默认使用类型的FullName作为Key,如果以“接口-实现类”的方式注册,那么将使用接口类型的FullName作为Key。
/// 当某个类型注册绑定成功后,将不会因为其它地方尝试注册相同类型的行为导致类型被重新创建。
///
ISereinIOC IOC { get; }
///
/// 环境名称
///
string EnvName { get; }
///
/// 是否全局中断
///
bool IsGlobalInterrupt { get; }
///
/// 表示是否正在控制远程
/// Local control remote env
///
bool IsLcR { get; }
///
/// 表示是否受到远程控制
/// Remote control local env
///
bool IsRcL { get; }
///
/// 流程运行状态
///
RunState FlowState { get; set; }
///
/// 全局触发器运行状态
///
RunState FlipFlopState { get; set; }
///
/// 表示当前环境
///
IFlowEnvironment CurrentEnv { get; }
///
/// 由运行环境提供的UI线程上下文操作,用于类库中需要在UI线程中操作视觉元素的场景
///
UIContextOperation UIContextOperation { get; }
#endregion
#region 事件
///
/// 加载Dll
///
event LoadDllHandler OnDllLoad;
///
/// 项目加载完成
///
event ProjectLoadedHandler OnProjectLoaded;
///
/// 节点连接属性改变事件
///
event NodeConnectChangeHandler OnNodeConnectChange;
///
/// 节点创建事件
///
event NodeCreateHandler OnNodeCreate;
///
/// 移除节点事件
///
event NodeRemoveHandler OnNodeRemove;
///
/// 起始节点变化事件
///
event StartNodeChangeHandler OnStartNodeChange;
///
/// 流程运行完成事件
///
event FlowRunCompleteHandler OnFlowRunComplete;
///
/// 被监视的对象改变事件
///
event MonitorObjectChangeHandler OnMonitorObjectChange;
///
/// 节点中断状态变化事件
///
event NodeInterruptStateChangeHandler OnNodeInterruptStateChange;
///
/// 触发中断
///
event ExpInterruptTriggerHandler OnInterruptTrigger;
///
/// IOC容器发生改变
///
event IOCMembersChangedHandler OnIOCMembersChanged;
///
/// 节点需要定位
///
event NodeLocatedHandler OnNodeLocated;
///
/// 节点移动了(远程插件)
///
event NodeMovedHandler OnNodeMoved;
///
/// 运行环境输出
///
event EnvOutHandler OnEnvOut;
#endregion
#region 接口
///
/// 设置输出
///
//
//
void SetConsoleOut(); // Action output, Action clearMsg
///
/// 使用JSON处理库输出对象信息
///
///
void WriteLineObjToJson(object obj);
///
/// 启动远程服务
///
Task StartRemoteServerAsync(int port = 7525);
///
/// 停止远程服务
///
void StopRemoteServer();
///
/// 保存当前项目
///
///
Task GetProjectInfoAsync();
///
/// 加载项目文件
///
/// 包含项目信息的远程环境
///
void LoadProject(FlowEnvInfo flowEnvInfo, string filePath);
///
/// 加载远程环境
///
/// 远程环境地址
/// 远程环境端口
/// 密码
Task<(bool, RemoteEnvControl)> ConnectRemoteEnv(string addres,int port, string token);
///
/// 退出远程环境
///
void ExitRemoteEnv();
///
/// 从文件中加载Dll
///
///
void LoadDll(string dllPath);
///
/// 移除DLL
///
/// 程序集的名称
bool RemoteDll(string assemblyFullName);
///
/// 清理加载的DLL(待更改)
///
void ClearAll();
///
/// 开始运行
///
Task StartAsync();
///
/// 从选定的节点开始运行
///
///
///
Task StartAsyncInSelectNode(string startNodeGuid);
///
/// 结束运行
///
void ExitFlow();
///
/// 移动了某个节点(远程插件使用)
///
///
///
///
void MoveNode(string nodeGuid,double x, double y);
///
/// 设置流程起点节点
///
///
void SetStartNode(string nodeGuid);
///
/// 在两个节点之间创建连接关系
///
/// 起始节点Guid
/// 目标节点Guid
/// 连接类型
Task ConnectNodeAsync(string fromNodeGuid, string toNodeGuid, ConnectionType connectionType);
///
/// 创建节点/区域/基础控件
///
/// 节点/区域/基础控件类型
/// 节点在画布上的位置(
/// 节点绑定的方法说明(
Task CreateNodeAsync(NodeControlType nodeType, PositionOfUI position, MethodDetailsInfo methodDetailsInfo = null);
///
/// 移除两个节点之间的连接关系
///
/// 起始节点
/// 目标节点
/// 连接类型
Task RemoveConnectAsync(string fromNodeGuid, string toNodeGuid, ConnectionType connectionType);
///
/// 移除节点/区域/基础控件
///
/// 待移除的节点Guid
Task RemoveNodeAsync(string nodeGuid);
///
/// 激活未启动的全局触发器
///
///
void ActivateFlipflopNode(string nodeGuid);
///
/// 终结一个全局触发器,在它触发后将不会再次监听消息(表现为已经启动的触发器至少会再次处理一次消息,后面版本再修正这个非预期行为)
///
///
void TerminateFlipflopNode(string nodeGuid);
///
/// 设置节点中断级别
///
/// 被中断的节点Guid
/// 新的中断级别
///
Task SetNodeInterruptAsync(string nodeGuid, InterruptClass interruptClass);
///
/// 添加作用于某个对象的中断表达式
///
///
///
///
Task AddInterruptExpressionAsync(string key, string expression);
///
/// 监视指定对象
///
/// 需要监视的对象
/// 是否启用监视
void SetMonitorObjState(string key,bool isMonitor);
///
/// 检查一个对象是否处于监听状态,如果是,则传出与该对象相关的表达式(用于中断),如果不是,则返回false。
///
/// 判断的对象
///
Task<(bool, string[])> CheckObjMonitorStateAsync(string key);
///
/// 全局中断
///
///
///
///
Task GetOrCreateGlobalInterruptAsync();
///
/// (用于远程)通知节点属性变更
///
/// 节点Guid
/// 属性路径
/// 属性值
///
Task NotificationNodeValueChangeAsync(string nodeGuid, string path, object value);
///
/// 获取方法描述信息
///
/// 方法描述
/// 方法信息
///
bool TryGetMethodDetailsInfo(string methodName, out MethodDetailsInfo mdInfo);
///
/// 获取指定方法的Emit委托
///
///
///
///
bool TryGetDelegateDetails(string methodName, out DelegateDetails del);
#region 远程相关
///
/// (适用于远程连接后获取环境的运行状态)获取当前环境的信息
///
///
Task GetEnvInfoAsync();
#endregion
#endregion
#region 启动器调用
///
/// 流程启动器调用,监视数据更新通知
///
/// 更新了数据的节点Guid
/// 更新的数据
/// 更新的数据
void MonitorObjectNotification(string nodeGuid, object monitorData, MonitorObjectEventArgs.ObjSourceType sourceType);
///
/// 流程启动器调用,节点触发了中断
///
/// 被中断的节点Guid
/// 被触发的表达式
/// 中断类型。0主动监视,1表达式
void TriggerInterrupt(string nodeGuid, string expression, InterruptTriggerEventArgs.InterruptTriggerType type);
#endregion
#region UI视觉
///
/// 节点定位
///
///
void NodeLocated(string nodeGuid);
#endregion
}
}