Exemple #1
0
        private bool TryToValuePrivate(out SciterValue sciterValue, bool ignoreResult)
        {
            var result = GraphicsApi.ValueWrapPath(this.Handle, out var value)
                         .IsOk();

            sciterValue = (result || ignoreResult) ? SciterValue.Attach(value) : default;
            return(result);
        }
Exemple #2
0
        internal bool TryToValueInternal(out SciterValue sciterValue)
        {
            var result = GraphicsApi.ValueWrapText(this.Handle, out var value)
                         .IsOk();

            sciterValue = result ? SciterValue.Attach(value) : default;
            return(result);
        }
Exemple #3
0
        public bool TryToSciterValue(out SciterValue sciterValue)
        {
            var result = GraphicsApi.ValueWrapImage(this.Handle, out var value)
                         .IsOk();

            sciterValue = result ? SciterValue.Attach(value: value) : default;
            return(result);
        }
        // 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);
            }
        }