Example #1
0
        internal bool TryCastToElementInternal(out SciterElement value)
        {
            var result = SciterApi.SciterNodeCastToElement(this.Handle, out var elementHandle).IsOk();

            value = result ? SciterElement.Attach(elementHandle) : default;
            return(result);
        }
Example #2
0
        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);
        }
Example #3
0
        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();
        }
Example #4
0
 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());
 }
Example #10
0
 protected virtual bool OnMethodCall(SciterElement element, SciterBehaviors.BEHAVIOR_METHOD_IDENTIFIERS methodId)
 {
     return(false);
 }
Example #11
0
 /// <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));
 }
Example #12
0
 /// <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);
 }
Example #13
0
 /// <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);
 }
Example #14
0
 /// <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);
 }
Example #15
0
 public static bool TryGetRootElement(this SciterWindow window, out SciterElement element)
 {
     element = default(SciterElement);
     return(window?.TryGetRootElementInternal(out element) == true);
 }
Example #16
0
 protected virtual bool OnSize(SciterElement element)
 {
     return(false);
 }
Example #17
0
 protected virtual bool OnDraw(SciterElement element, DrawArgs args)
 {
     return(false);
 }
Example #18
0
 public static SciterText CreateForElement(string text, SciterElement element, string className = null)
 {
     return(CreateForElement(text: text, elementHandle: element?.Handle ?? IntPtr.Zero, className: className));
 }
Example #19
0
 protected virtual ScriptEventResult OnScriptCall(SciterElement element, MethodInfo method, SciterValue[] args)
 {
     return(ScriptExecutioner
            .Create(this, element, method, args)
            .Execute());
 }
Example #20
0
 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));
 }
Example #21
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="sourceElement"><para>Source element e.g. in SELECTION_CHANGED it is new selected &lt;option&gt;, 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);
 }
Example #22
0
 /// <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));
 }
Example #23
0
 protected virtual bool OnScroll(SciterElement element, ScrollEventArgs args)
 {
     return(false);
 }
Example #24
0
 protected virtual bool OnMouse(SciterElement element, MouseArgs args)
 {
     return(false);
 }
Example #25
0
 protected virtual bool OnExchange(SciterElement element, ExchangeArgs args)
 {
     return(false);
 }
Example #26
0
 protected virtual bool OnKey(SciterElement element, KeyArgs args)
 {
     return(false);
 }
Example #27
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="element"></param>
 /// <returns></returns>
 protected virtual EventGroups SubscriptionsRequest(SciterElement element)
 {
     return(EventGroups.HandleAll);
 }
Example #28
0
 protected virtual bool OnFocus(SciterElement element, FocusArgs args)
 {
     return(false);
 }
Example #29
0
 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);
        }