/// <summary> /// Registers scripting class /// </summary> public static bool RegisterClass <TType>(SciterView view) { Debug.Assert(view != null && view.HandleInternal != IntPtr.Zero, "View cannot be null"); var result = false; var hvm = SciterHostApi.SciterGetVM(view.HandleInternal); if (hvm != IntPtr.Zero) { var scripting = GetScriptingClasses(view, hvm); var sciterClassDef = GetClassDef(typeof(TType)); if (!scripting.IsExists(sciterClassDef)) { var nativeClass = sciterClassDef.ToNative(); try { result = SciterHostApi.SciterNativeDefineClass(hvm, nativeClass); scripting.ClassDefs.Add(sciterClassDef); } finally { SciterClassDef.FreeNative(nativeClass); } } else { throw new ArgumentException("Class already registered", "TType"); } } return(result); }
/// <summary> /// Returns class definition by specified type /// </summary> private static SciterClassDef GetClassDef(Type type) { var scriptingClass = GetScriptingClass(type); var classDef = new SciterClassDef() { name = scriptingClass.Name, methods = new List <SciterNativeMethodDef>(GetMethods(type, scriptingClass.IsStatic)).ToArray(), properties = new List <SciterNativePropertyDef>(GetProperties(type)).ToArray(), dtor = ScriptingDtor }; return(classDef); }
/// <summary> /// Locates class definition by its name /// </summary> public bool IsExists(SciterClassDef classDef) { return(ClassDefs.FindIndex(c => c.name == classDef.name) >= 0); }