unit LuaStructureFrm; {$mode delphi} interface uses Classes, SysUtils, lua, lualib, lauxlib, LuaHandler, LuaCaller, symbolhandler, cefuncproc, newkernelhandler, Dialogs, LuaClass, LuaClassArray, commonTypeDefs, Forms, StructuresFrm2, LuaStructure; procedure initializeLuaStructureFrm; procedure structureFrm_addMetaData(L: PLua_state; metatable: integer; userdata: integer ); procedure structGroup_addMetaData(L: PLua_state; metatable: integer; userdata: integer ); procedure structColumn_addMetaData(L: PLua_state; metatable: integer; userdata: integer ); implementation uses LuaForm, LuaObject, DotNetPipe; resourcestring rsGroup1 = 'Group 1'; rsGroupD = 'Group %d'; function createStructureForm(L: PLua_State): integer; cdecl; var parameters: integer; address: string; form: TfrmStructures2; column: TStructColumn; metatable: integer; m: tmethod; i: integer; userdata: integer; structname: string; groupname: string; struct: TDissectedStruct; group: TStructGroup; begin result:=0; parameters:=lua_gettop(L); structname:=''; address:=''; groupname:=rsGroup1; if parameters>=3 then structname:=lua_tostring(L,3); if parameters>=2 then groupname:=lua_tostring(L,2); if parameters>=1 then address:=lua_tostring(L,1); lua_pop(L, parameters); form:=TfrmStructures2.create(application); luaclass_newclass(L, form); if parameters>=1 then begin group:=TStructGroup.create(form,groupname); column:=form.addColumn; column.AddressText:=address; column.SetProperEditboxPosition; if parameters>=3 then begin for i:=0 to DissectedStructs.count-1 do begin struct:=TDissectedStruct(DissectedStructs[i]); if CompareText(struct.Name,structname) = 0 then begin form.mainStruct:=struct; form.onFullStructChange(struct); break; end; end; end; group.setPositions; form.show; luaclass_newClass(L, form); result:=1; end; end; function structureForm_addColumn(L: PLua_State): integer; cdecl; var frm: TFrmStructures2; column: TStructColumn; begin result:=0; frm:=luaclass_getClassObject(L); column:=frm.addColumn; luaclass_newclass(L, column); result:=1; end; function structureForm_addGroup(L: PLua_State): integer; cdecl; var frm: TFrmStructures2; group: TStructGroup; groupname: string; parameters: integer; begin result:=0; frm:=luaclass_getClassObject(L); groupname:=Format(rsGroupD,[frm.groupCount+1]); parameters:=lua_gettop(L); if parameters>=1 then if not lua_isnil(L,-1) then groupname:=lua_ToString(L, -1); lua_pop(L, parameters); group:=TStructGroup.create(frm,groupname); luaclass_newclass(L, group, structGroup_addMetaData); result:=1; end; function structureForm_structChange(L: PLua_State): integer; cdecl; var frm: TFrmStructures2; begin frm:=luaclass_getClassObject(L); frm.onFullStructChange(nil); result:=0; end; function structureForm_getColumn(L: PLua_State): integer; cdecl; var parameters: integer; frm: TFrmStructures2; index: integer; begin result:=0; frm:=luaclass_getClassObject(L); parameters:=lua_gettop(L); if parameters>=1 then begin index:=lua_tointeger(L,-1); luaclass_newclass(L, frm.columns[index]); result:=1; end else lua_pop(L, parameters); end; function structureForm_getGroup(L: PLua_State): integer; cdecl; var parameters: integer; frm: TFrmStructures2; index: integer; begin result:=0; frm:=luaclass_getClassObject(L); parameters:=lua_gettop(L); if parameters>=1 then begin index:=lua_tointeger(L,-1); luaclass_newclass(L, frm.group[index]); result:=1; end else lua_pop(L, parameters); end; function structColumn_focus(L: PLua_State): integer; cdecl; var column: TStructColumn; begin result:=0; column:=luaclass_getClassObject(L); column.focus; end; function structGroup_addColumn(L: PLua_State): integer; cdecl; var frm: TFrmStructures2; group: TStructGroup; column: TStructColumn; begin result:=0; group:=luaclass_getClassObject(L); column:=TStructColumn.create(group); frm:=group.getParent(); frm.RefreshVisibleNodes(); luaclass_newclass(L, column); result:=1; end; function structGroup_getColumn(L: PLua_State): integer; cdecl; var parameters: integer; group: TStructGroup; index: integer; begin result:=0; group:=luaclass_getClassObject(L); parameters:=lua_gettop(L); if parameters>=1 then begin index:=lua_tointeger(L,-1); luaclass_newclass(L, group.columns[index]); result:=1; end else lua_pop(L, parameters); end; procedure structGroup_addMetaData(L: PLua_state; metatable: integer; userdata: integer ); var i: integer; begin object_addMetaData(L, metatable, userdata); luaclass_addClassFunctionToTable(L, metatable, userdata, 'addColumn', structGroup_addColumn); luaclass_addArrayPropertyToTable(L, metatable, userdata, 'Column', structgroup_getColumn, nil); end; procedure structColumn_addMetaData(L: PLua_state; metatable: integer; userdata: integer ); var i: integer; begin object_addMetaData(L, metatable, userdata); luaclass_addClassFunctionToTable(L, metatable, userdata, 'focus', structColumn_focus); end; procedure structureFrm_addMetaData(L: PLua_state; metatable: integer; userdata: integer ); var i: integer; begin customForm_addMetaData(L, metatable, userdata); luaclass_addClassFunctionToTable(L, metatable, userdata, 'addColumn', structureForm_addColumn); luaclass_addClassFunctionToTable(L, metatable, userdata, 'addGroup', structureForm_addGroup); luaclass_addClassFunctionToTable(L, metatable, userdata, 'structChange', structureForm_structChange); luaclass_addArrayPropertyToTable(L, metatable, userdata, 'Column', structureForm_getColumn, nil); luaclass_addArrayPropertyToTable(L, metatable, userdata, 'Group', structureForm_getGroup, nil); end; procedure initializeLuaStructureFrm; begin lua_register(LuaVM, 'createStructureForm', createStructureForm); end; initialization luaclass_register(TfrmStructures2, structureFrm_addMetaData); luaclass_register(TStructGroup, structGroup_addMetaData); luaclass_register(TStructColumn, structColumn_addMetaData); end.