internal bool TryCastToElementInternal(out SciterElement value) { var result = SciterApi.SciterNodeCastToElement(this.Handle, out var elementHandle).IsOk(); value = result ? SciterElement.Attach(elementHandle) : default; return(result); }
public static bool TryCreate(string tag, out SciterElement element, string text = null) { var result = SciterApi.SciterCreateElement(tag, text, out var elementHandle) .IsOk() && elementHandle != IntPtr.Zero; element = result ? new SciterElement(elementHandle) : null; return(result); }
private ScriptExecutioner(object owner, SciterElement element, MethodInfo methodInfo, SciterValue[] arguments) { _owner = owner; _element = element; _methodInfo = methodInfo; _arguments = arguments; _methodParameters = _methodInfo.GetParameters(); _isAwaitable = _methodInfo.ReturnType.GetMethod(nameof(Task.GetAwaiter)) != null; _isWrappedCallback = _methodInfo.GetCustomAttribute <SciterCallbackWrapperAttribute>() != null; _callbackValue = _isWrappedCallback ? _arguments.Last() : null; _returnType = GetReturnType(); }
public static ScriptExecutioner Create(object owner, SciterElement sciterElement, MethodInfo methodInfo, SciterValue[] arguments) { return(new ScriptExecutioner(owner, sciterElement, methodInfo, arguments)); }
protected virtual void Attached(SciterElement element) { }
// EventProc private bool EventProcMethod(IntPtr tag, IntPtr he, uint evtg, IntPtr prms) { SciterElement sourceElement = null; if (!he.Equals(IntPtr.Zero)) { sourceElement = SciterElement.Attach(he); } switch ((SciterBehaviors.EVENT_GROUPS)evtg) { case SciterBehaviors.EVENT_GROUPS.SUBSCRIPTIONS_REQUEST: { var eventGroups = SubscriptionsRequest(sourceElement); Marshal.WriteInt32(prms, (int)eventGroups); return(true); } case SciterBehaviors.EVENT_GROUPS.HANDLE_INITIALIZATION: { var initializationParams = Marshal.PtrToStructure <SciterBehaviors.INITIALIZATION_PARAMS>(ptr: prms); switch (initializationParams.cmd) { case SciterBehaviors.INITIALIZATION_EVENTS.BEHAVIOR_ATTACH: #if DEBUG Debug.WriteLine($"Attach {this.Name}"); Debug.Assert(_isAttached == false); _isAttached = true; #endif this.Element = sourceElement; AttachedHandlers.Add(this); Attached(sourceElement); break; case SciterBehaviors.INITIALIZATION_EVENTS.BEHAVIOR_DETACH: #if DEBUG Debug.Assert(_isAttached == true); _isAttached = false; #endif Detached(sourceElement); AttachedHandlers.Remove(this); this.Element = null; break; default: return(false); } return(true); } case SciterBehaviors.EVENT_GROUPS.HANDLE_SOM: { //SOM_PARAMS *p = (SOM_PARAMS *)prms; SciterBehaviors.SOM_PARAMS p = Marshal.PtrToStructure <SciterBehaviors.SOM_PARAMS>(ptr: prms); if (p.cmd == SciterBehaviors.SOM_EVENTS.SOM_GET_PASSPORT) { // p->data.passport = pThis->asset_get_passport(); } else if (p.cmd == SciterBehaviors.SOM_EVENTS.SOM_GET_ASSET) { // p->data.asset = static_cast<som_asset_t*>(pThis); // note: no add_ref } return(false); } case SciterBehaviors.EVENT_GROUPS.HANDLE_MOUSE: { var args = Marshal.PtrToStructure <SciterBehaviors.MOUSE_PARAMS>(prms); return(OnMouse(element: sourceElement, args: args.ToEventArgs())); } case SciterBehaviors.EVENT_GROUPS.HANDLE_KEY: { var args = Marshal.PtrToStructure <SciterBehaviors.KEY_PARAMS>(prms).ToEventArgs(); return(OnKey(element: sourceElement, args: args)); } case SciterBehaviors.EVENT_GROUPS.HANDLE_FOCUS: { var args = Marshal.PtrToStructure <SciterBehaviors.FOCUS_PARAMS>(prms).ToEventArgs(); return(OnFocus(element: sourceElement, args: args)); } case SciterBehaviors.EVENT_GROUPS.HANDLE_DRAW: { var args = Marshal.PtrToStructure <SciterBehaviors.DRAW_PARAMS>(prms).ToEventArgs(); return(OnDraw(element: sourceElement, args: args)); } case SciterBehaviors.EVENT_GROUPS.HANDLE_TIMER: { var timerParams = Marshal.PtrToStructure <SciterBehaviors.TIMER_PARAMS>(prms); return(OnTimer(sourceElement, timerParams.timerId.Equals(IntPtr.Zero) ? (IntPtr?)null : timerParams.timerId)); } case SciterBehaviors.EVENT_GROUPS.HANDLE_BEHAVIOR_EVENT: { var eventParams = Marshal.PtrToStructure <SciterBehaviors.BEHAVIOR_EVENT_PARAMS>(prms); var targetElement = eventParams.he != IntPtr.Zero ? SciterElement.Attach(eventParams.he) : null; Element = eventParams.cmd switch { SciterBehaviors.BEHAVIOR_EVENTS.DOCUMENT_CREATED => targetElement, SciterBehaviors.BEHAVIOR_EVENTS.DOCUMENT_CLOSE => null, _ => Element }; return(OnEvent(sourceElement: sourceElement, targetElement: targetElement, eventType: (BehaviorEvents)(int)eventParams.cmd, reason: eventParams.reason, data: SciterValue.Attach(eventParams.data), eventName: eventParams.name)); } case SciterBehaviors.EVENT_GROUPS.HANDLE_METHOD_CALL: { var methodParams = Marshal.PtrToStructure <SciterXDom.METHOD_PARAMS>(prms); return(OnMethodCall(sourceElement, methodParams.methodID)); } case SciterBehaviors.EVENT_GROUPS.HANDLE_DATA_ARRIVED: { var arrivedParams = Marshal.PtrToStructure <SciterBehaviors.DATA_ARRIVED_PARAMS>(prms); return(OnDataArrived(sourceElement, arrivedParams)); } case SciterBehaviors.EVENT_GROUPS.HANDLE_SCROLL: { var eventArgs = Marshal.PtrToStructure <SciterBehaviors.SCROLL_PARAMS>(prms).ToEventArgs(); return(OnScroll(element: sourceElement, args: eventArgs)); } case SciterBehaviors.EVENT_GROUPS.HANDLE_SIZE: return(OnSize(sourceElement)); case SciterBehaviors.EVENT_GROUPS.HANDLE_SCRIPTING_METHOD_CALL: { var resultOffset = Marshal.OffsetOf(typeof(SciterBehaviors.SCRIPTING_METHOD_PARAMS), nameof(SciterBehaviors.SCRIPTING_METHOD_PARAMS.result)); #if OSX if (IntPtr.Size == 4) { Debug.Assert(resultOffset.ToInt32() == 12); } #else if (IntPtr.Size == 4) { Debug.Assert(resultOffset.ToInt32() == 16); // yep 16, strange but is what VS C++ compiler says } #endif else if (IntPtr.Size == 8) { Debug.Assert(resultOffset.ToInt32() == 24); } var methodParams = Marshal.PtrToStructure <SciterBehaviors.SCRIPTING_METHOD_PARAMS>(prms); var methodParamsWrapper = new SciterBehaviors.SCRIPTING_METHOD_PARAMS_WRAPPER(methodParams); var scriptResult = OnScriptCall(sourceElement, methodParamsWrapper.name, methodParamsWrapper.args); if (!scriptResult.IsSuccessful) { var methodInfos = GetType().GetMethods() .Where(w => w.GetCustomAttributes <SciterFunctionNameAttribute>() .Any(a => a.FunctionName.Equals(methodParamsWrapper.name)) || w.Name.Equals(methodParamsWrapper.name)) .ToArray(); if (methodInfos?.Any() != true) { return(false); } MethodInfo methodInfo; if (methodInfos.Length == 1) { methodInfo = methodInfos.First(); } else { methodInfo = methodInfos.Where(w => (w.GetParameters().Count(c => c.ParameterType == typeof(SciterValue)) == methodParamsWrapper.args.Length) || w.GetParameters().Any(a => a.ParameterType == typeof(SciterValue[])) ).OrderByDescending(ob => ob.GetParameters().Count(c => c.ParameterType == typeof(SciterValue)) == methodParamsWrapper.args.Length).FirstOrDefault(); } if (methodInfo == null) { return(false); } scriptResult = OnScriptCall(sourceElement, methodInfo, methodParamsWrapper.args); if (scriptResult.IsSuccessful) { //pw.result = scriptResult.Value; var resultValue = (scriptResult.Value ?? SciterValue.Null).ToVALUE(); var resultValuePtr = IntPtr.Add(prms, resultOffset.ToInt32()); Marshal.StructureToPtr(resultValue, resultValuePtr, false); } } return(scriptResult.IsSuccessful); } case SciterBehaviors.EVENT_GROUPS.HANDLE_EXCHANGE: { var eventArgs = Marshal.PtrToStructure <SciterBehaviors.EXCHANGE_PARAMS>(prms).ToEventArgs(); return(OnExchange(element: sourceElement, args: eventArgs)); } case SciterBehaviors.EVENT_GROUPS.HANDLE_GESTURE: { var eventArgs = Marshal.PtrToStructure <SciterBehaviors.GESTURE_PARAMS>(prms).ToEventArgs(); return(OnGesture(element: sourceElement, args: eventArgs)); } #pragma warning disable 618 case SciterBehaviors.EVENT_GROUPS.HANDLE_TISCRIPT_METHOD_CALL: //Obsolete return(false); #pragma warning restore 618 default: Debug.Assert(false); return(false); } }
protected virtual bool OnGesture(SciterElement element, GestureArgs args) { return(false); }
protected virtual bool OnDataArrived(SciterElement element, SciterBehaviors.DATA_ARRIVED_PARAMS prms) { return(false); }
/// <summary> /// This method is typically used with WinForms applications /// </summary> /// <param name="element"></param> /// <param name="methodName"></param> /// <param name="args"></param> // TODO: Should be specific to WinForms? protected virtual ScriptEventResult OnScriptCall(SciterElement element, string methodName, SciterValue[] args) { return(ScriptEventResult.Failed()); }
protected virtual bool OnMethodCall(SciterElement element, SciterBehaviors.BEHAVIOR_METHOD_IDENTIFIERS methodId) { return(false); }
/// <summary> /// create text layout using explicit style declaration /// </summary> /// <param name="sciterText"></param> /// <param name="text"></param> /// <param name="element"></param> /// <param name="style"></param> /// <returns></returns> public static bool TryCreateForElementAndStyle(out SciterText sciterText, string text, SciterElement element, string style) { return(TryCreateForElementAndStyle(sciterText: out sciterText, text: text, elementHandle: element.Handle, style: style)); }
/// <summary> /// Searches this window DOM tree for element with the given UID /// </summary> /// <returns>The element, or null if it doesn't exists</returns> public static bool TryGetElementByUid(this SciterWindow window, out SciterElement element, uint uid) { element = default(SciterElement); return(window?.TryGetElementByUidInternal(value: out element, uid: uid) == true); }
/// <summary> /// Find element at the <see cref="SciterPoint"/> of the window, client area relative /// </summary> public static bool TryGetElementAtPoint(this SciterWindow window, out SciterElement element, SciterPoint point) { element = default(SciterElement); return(window?.TryGetElementAtPointInternal(value: out element, point: point) == true); }
/// <summary> /// Find element at point x/y of the window, client area relative /// </summary> public static bool TryGetElementAtPoint(this SciterWindow window, out SciterElement element, int x, int y) { element = default(SciterElement); return(window?.TryGetElementAtPointInternal(value: out element, x: x, y: y) == true); }
public static bool TryGetRootElement(this SciterWindow window, out SciterElement element) { element = default(SciterElement); return(window?.TryGetRootElementInternal(out element) == true); }
protected virtual bool OnSize(SciterElement element) { return(false); }
protected virtual bool OnDraw(SciterElement element, DrawArgs args) { return(false); }
public static SciterText CreateForElement(string text, SciterElement element, string className = null) { return(CreateForElement(text: text, elementHandle: element?.Handle ?? IntPtr.Zero, className: className)); }
protected virtual ScriptEventResult OnScriptCall(SciterElement element, MethodInfo method, SciterValue[] args) { return(ScriptExecutioner .Create(this, element, method, args) .Execute()); }
public static bool TryCreateForElement(out SciterText sciterText, string text, SciterElement element, string className = null) { return(TryCreateForElement(out sciterText, text: text, elementHandle: element?.Handle ?? IntPtr.Zero, className: className)); }
/// <summary> /// /// </summary> /// <param name="sourceElement"><para>Source element e.g. in SELECTION_CHANGED it is new selected <option>, in MENU_ITEM_CLICK it is menu item (LI) element</para></param> /// <param name="targetElement"><para>Target element, in MENU_ITEM_CLICK this is owner element that caused this menu - e.g. context menu owner<br/>In scripting this field named as Event.owner</para></param> /// <param name="eventType"></param> /// <param name="reason"><para>CLICK_REASON or EDIT_CHANGED_REASON - UI action causing change.<br/>In case of custom event notifications this may be any application specific value.</para></param> /// <param name="data"><para>Auxiliary data accompanied with the event. E.g. FORM_SUBMIT event is using this field to pass collection of values.</para></param> /// <param name="eventName"><para>name of custom event (when <paramref name="eventType"/> == <see cref="SciterBehaviors.BEHAVIOR_EVENTS.CUSTOM"/>)</para></param> /// <returns></returns> protected virtual bool OnEvent(SciterElement sourceElement, SciterElement targetElement, BehaviorEvents eventType, IntPtr reason, SciterValue data, string eventName) { return(false); }
/// <summary> /// create text layout using explicit style declaration /// </summary> /// <param name="text"></param> /// <param name="element"></param> /// <param name="style"></param> /// <returns></returns> public static SciterText CreateForElementAndStyle(string text, SciterElement element, string style) { return(CreateForElementAndStyle(text: text, elementHandle: element.Handle, style: style)); }
protected virtual bool OnScroll(SciterElement element, ScrollEventArgs args) { return(false); }
protected virtual bool OnMouse(SciterElement element, MouseArgs args) { return(false); }
protected virtual bool OnExchange(SciterElement element, ExchangeArgs args) { return(false); }
protected virtual bool OnKey(SciterElement element, KeyArgs args) { return(false); }
/// <summary> /// /// </summary> /// <param name="element"></param> /// <returns></returns> protected virtual EventGroups SubscriptionsRequest(SciterElement element) { return(EventGroups.HandleAll); }
protected virtual bool OnFocus(SciterElement element, FocusArgs args) { return(false); }
protected virtual bool OnTimer(SciterElement element, IntPtr?extTimerId) { return(false); }
private uint NotificationHandler(IntPtr ptrNotification, IntPtr callbackParam) { var callbackNotification = Marshal.PtrToStructure <SciterXDef.SCITER_CALLBACK_NOTIFICATION>(ptrNotification); switch (callbackNotification.code) { case SciterXDef.SCITER_CALLBACK_CODE.SC_LOAD_DATA: var sld = Marshal.PtrToStructure <SciterXDef.SCN_LOAD_DATA>(ptrNotification); return((uint)_sciterHost.OnLoadDataInternal(sender: this, args: sld.ToEventArgs())); case SciterXDef.SCITER_CALLBACK_CODE.SC_DATA_LOADED: var sdl = Marshal.PtrToStructure <SciterXDef.SCN_DATA_LOADED>(ptrNotification); _sciterHost.OnDataLoadedInternal(sender: this, args: sdl.ToEventArgs()); return(0); case SciterXDef.SCITER_CALLBACK_CODE.SC_ATTACH_BEHAVIOR: var attachBehavior = Marshal.PtrToStructure <SciterXDef.SCN_ATTACH_BEHAVIOR>(ptrNotification); var behaviorName = Marshal.PtrToStringAnsi(attachBehavior.behaviorName); var attachResult = _sciterHost.OnAttachBehaviorInternal(SciterElement.Attach(attachBehavior.elem), behaviorName, out var eventHandler); if (!attachResult) { return(0); } var proc = eventHandler.EventProc; var ptrProc = Marshal.GetFunctionPointerForDelegate(proc); var elementProcOffset = Marshal.OffsetOf <SciterXDef.SCN_ATTACH_BEHAVIOR>(nameof(SciterXDef.SCN_ATTACH_BEHAVIOR .elementProc)); var elementTagOffset = Marshal.OffsetOf <SciterXDef.SCN_ATTACH_BEHAVIOR>(nameof(SciterXDef.SCN_ATTACH_BEHAVIOR .elementTag)); Marshal.WriteIntPtr(ptrNotification, elementProcOffset.ToInt32(), ptrProc); Marshal.WriteInt32(ptrNotification, elementTagOffset.ToInt32(), 0); return(1); case SciterXDef.SCITER_CALLBACK_CODE.SC_ENGINE_DESTROYED: HostCallbackRegistry.Instance.TryRemove(this._sciterHost, out _); if (_sciterHost.WindowEventHandler != null) { Sciter.SciterApi.SciterWindowDetachEventHandler(_sciterHost.WindowHandle, _sciterHost.WindowEventHandler.EventProc, IntPtr.Zero); _sciterHost.WindowEventHandler = null; } var engineDestroyed = Marshal.PtrToStructure <SciterXDef.SCN_ENGINE_DESTROYED>(ptrNotification); _sciterHost.OnEngineDestroyedInternal(sender: this, args: new EngineDestroyedArgs(engineDestroyed.hwnd, engineDestroyed.code)); return(0); case SciterXDef.SCITER_CALLBACK_CODE.SC_POSTED_NOTIFICATION: var spn = Marshal.PtrToStructure <SciterXDef.SCN_POSTED_NOTIFICATION>(ptrNotification); var lReturnPtr = IntPtr.Zero; if (spn.wparam.ToInt32() == InvokeNotification) { var handle = GCHandle.FromIntPtr(spn.lparam); var cbk = (Action)handle.Target; cbk?.Invoke(); handle.Free(); } else { lReturnPtr = _sciterHost.OnPostedNotificationInternal(spn.wparam, spn.lparam); } var lReturnOffset = Marshal.OffsetOf <SciterXDef.SCN_POSTED_NOTIFICATION>(nameof(SciterXDef.SCN_POSTED_NOTIFICATION .lreturn)); Marshal.WriteIntPtr(ptrNotification, lReturnOffset.ToInt32(), lReturnPtr); return(0); case SciterXDef.SCITER_CALLBACK_CODE.SC_GRAPHICS_CRITICAL_FAILURE: var cgf = Marshal.PtrToStructure <SciterXDef.SCN_GRAPHICS_CRITICAL_FAILURE>(ptrNotification); _sciterHost.OnGraphicsCriticalFailureInternal(handle: cgf.hwnd, code: cgf.code); return(0); default: Debug.Assert(false); break; } return(0); }