Element.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. #include "LuaType.h"
  2. #include "precompiled.h"
  3. #include "Element.h"
  4. #include <ElementStyle.h>
  5. namespace Rocket {
  6. namespace Core {
  7. namespace Lua {
  8. typedef ElementDocument Document;
  9. //methods
  10. int ElementAddEventListener(lua_State* L, Element* obj)
  11. {
  12. int top = lua_gettop(L);
  13. bool capture;
  14. //default false if they didn't pass it in
  15. if (top < 3) capture = false;
  16. else capture = CHECK_BOOL(L,3);
  17. const char* event = luaL_checkstring(L,1);
  18. EventListener* listener = NULL; //LuaType<EventListener>::check(L,2);
  19. obj->AddEventListener(event,listener,capture);
  20. return 0;
  21. }
  22. int ElementAppendChild(lua_State* L, Element* obj)
  23. {
  24. Element* ele = LuaType<Element>::check(L,1);
  25. obj->AppendChild(ele);
  26. return 0;
  27. }
  28. int ElementBlur(lua_State* L, Element* obj)
  29. {
  30. obj->Blur();
  31. return 0;
  32. }
  33. int ElementClick(lua_State* L, Element* obj)
  34. {
  35. obj->Click();
  36. return 0;
  37. }
  38. int ElementDispatchEvent(lua_State* L, Element* obj)
  39. {
  40. const char* event = luaL_checkstring(L,1);
  41. Dictionary params;
  42. lua_pushnil(L); //becauase lua_next pops a key from the stack first, we don't want to pop the table
  43. while(lua_next(L,2) != 0)
  44. {
  45. //[-1] is value, [-2] is key
  46. int type = lua_type(L,-1);
  47. const char* key = luaL_checkstring(L,-2); //key HAS to be a string, or things will go bad
  48. switch(type)
  49. {
  50. case LUA_TNUMBER:
  51. params.Set(key,(float)lua_tonumber(L,-1));
  52. break;
  53. case LUA_TBOOLEAN:
  54. params.Set(key,CHECK_BOOL(L,-1));
  55. break;
  56. case LUA_TSTRING:
  57. params.Set(key,luaL_checkstring(L,-1));
  58. break;
  59. case LUA_TUSERDATA:
  60. case LUA_TLIGHTUSERDATA:
  61. params.Set(key,lua_touserdata(L,-1));
  62. break;
  63. default:
  64. break;
  65. }
  66. }
  67. obj->DispatchEvent(event,params,false);
  68. return 0;
  69. }
  70. int ElementFocus(lua_State* L, Element* obj)
  71. {
  72. obj->Focus();
  73. return 0;
  74. }
  75. int ElementGetAttribute(lua_State* L, Element* obj)
  76. {
  77. const char* name = luaL_checkstring(L,1);
  78. Variant* var = obj->GetAttribute(name);
  79. Variant::Type type = var->GetType();
  80. switch(type)
  81. {
  82. case Variant::BYTE:
  83. case Variant::CHAR:
  84. case Variant::INT:
  85. lua_pushinteger(L,*(int*)var);
  86. break;
  87. case Variant::FLOAT:
  88. lua_pushnumber(L,*(float*)var);
  89. break;
  90. case Variant::COLOURB:
  91. LuaType<Colourb>::push(L,(Colourb*)var,false);
  92. break;
  93. case Variant::COLOURF:
  94. LuaType<Colourf>::push(L,(Colourf*)var,false);
  95. break;
  96. case Variant::STRING:
  97. lua_pushstring(L,((String*)var)->CString());
  98. break;
  99. case Variant::VECTOR2:
  100. //according to Variant.inl, it is going to be a Vector2f
  101. LuaType<Vector2f>::push(L,((Vector2f*)var),false);
  102. break;
  103. case Variant::VOIDPTR:
  104. lua_pushlightuserdata(L,(void*)var);
  105. break;
  106. default:
  107. lua_pushnil(L);
  108. break;
  109. }
  110. return 1;
  111. }
  112. int ElementGetElementById(lua_State* L, Element* obj)
  113. {
  114. const char* id = luaL_checkstring(L,1);
  115. Element* ele = obj->GetElementById(id);
  116. LuaType<Element>::push(L,ele,false);
  117. return 1;
  118. }
  119. int ElementGetElementsByTagName(lua_State* L, Element* obj)
  120. {
  121. const char* tag = luaL_checkstring(L,1);
  122. ElementList list;
  123. obj->GetElementsByTagName(list,tag);
  124. lua_newtable(L);
  125. for(unsigned int i = 0; i < list.size(); i++)
  126. {
  127. lua_pushinteger(L,i);
  128. LuaType<Element>::push(L,list[i],false);
  129. lua_settable(L,-3); //-3 is the table
  130. }
  131. return 1;
  132. }
  133. int ElementHasAttribute(lua_State* L, Element* obj)
  134. {
  135. const char* name = luaL_checkstring(L,1);
  136. lua_pushboolean(L,obj->HasAttribute(name));
  137. return 1;
  138. }
  139. int ElementHasChildNodes(lua_State* L, Element* obj)
  140. {
  141. lua_pushboolean(L,obj->HasChildNodes());
  142. return 1;
  143. }
  144. int ElementInsertBefore(lua_State* L, Element* obj)
  145. {
  146. Element* element = LuaType<Element>::check(L,1);
  147. Element* adjacent = LuaType<Element>::check(L,2);
  148. obj->InsertBefore(element,adjacent);
  149. return 0;
  150. }
  151. int ElementIsClassSet(lua_State* L, Element* obj)
  152. {
  153. const char* name = luaL_checkstring(L,1);
  154. lua_pushboolean(L,obj->IsClassSet(name));
  155. return 1;
  156. }
  157. int ElementRemoveAttribute(lua_State* L, Element* obj)
  158. {
  159. const char* name = luaL_checkstring(L,1);
  160. obj->RemoveAttribute(name);
  161. return 0;
  162. }
  163. int ElementRemoveChild(lua_State* L, Element* obj)
  164. {
  165. Element* element = LuaType<Element>::check(L,1);
  166. lua_pushboolean(L,obj->RemoveChild(element));
  167. return 1;
  168. }
  169. int ElementReplaceChild(lua_State* L, Element* obj)
  170. {
  171. Element* inserted = LuaType<Element>::check(L,1);
  172. Element* replaced = LuaType<Element>::check(L,2);
  173. lua_pushboolean(L,obj->ReplaceChild(inserted,replaced));
  174. return 1;
  175. }
  176. int ElementScrollIntoView(lua_State* L, Element* obj)
  177. {
  178. bool align = CHECK_BOOL(L,1);
  179. obj->ScrollIntoView(align);
  180. return 0;
  181. }
  182. int ElementSetAttribute(lua_State* L, Element* obj)
  183. {
  184. LUACHECKOBJ(obj);
  185. const char* name = luaL_checkstring(L,1);
  186. const char* value = luaL_checkstring(L,2);
  187. obj->SetAttribute(name,String(value));
  188. return 0;
  189. }
  190. int ElementSetClass(lua_State* L, Element* obj)
  191. {
  192. const char* name = luaL_checkstring(L,1);
  193. bool value = CHECK_BOOL(L,2);
  194. obj->SetClass(name,value);
  195. return 0;
  196. }
  197. //getters
  198. int ElementGetAttrattributes(lua_State* L)
  199. {
  200. Element* ele = LuaType<Element>::check(L,1);
  201. int index;
  202. String key;
  203. Variant* var;
  204. Variant::Type type;
  205. lua_newtable(L);
  206. while(ele->IterateAttributes(index,key,var))
  207. {
  208. lua_pushstring(L,key.CString());
  209. type = var->GetType();
  210. switch(type)
  211. {
  212. case Variant::BYTE:
  213. case Variant::CHAR:
  214. case Variant::INT:
  215. lua_pushinteger(L,*(int*)var);
  216. break;
  217. case Variant::FLOAT:
  218. lua_pushnumber(L,*(float*)var);
  219. break;
  220. case Variant::COLOURB:
  221. LuaType<Colourb>::push(L,(Colourb*)var,false);
  222. break;
  223. case Variant::COLOURF:
  224. LuaType<Colourf>::push(L,(Colourf*)var,false);
  225. break;
  226. case Variant::STRING:
  227. lua_pushstring(L,((String*)var)->CString());
  228. break;
  229. case Variant::VECTOR2:
  230. //according to Variant.inl, it is going to be a Vector2f
  231. LuaType<Vector2f>::push(L,((Vector2f*)var),false);
  232. break;
  233. case Variant::VOIDPTR:
  234. lua_pushlightuserdata(L,(void*)var);
  235. break;
  236. default:
  237. lua_pushnil(L);
  238. break;
  239. }
  240. lua_settable(L,-3);
  241. }
  242. return 1;
  243. }
  244. int ElementGetAttrchild_nodes(lua_State* L)
  245. {
  246. Element* ele = LuaType<Element>::check(L,1);
  247. if(!ele->HasChildNodes())
  248. lua_pushnil(L);
  249. else
  250. {
  251. lua_newtable(L);
  252. int index = 0;
  253. int num_of_children = ele->GetNumChildren();
  254. while(index < num_of_children)
  255. {
  256. lua_pushinteger(L,index);
  257. LuaType<Element>::push(L,ele->GetChild(index),false);
  258. lua_settable(L,-3);
  259. ++index;
  260. }
  261. }
  262. return 1;
  263. }
  264. int ElementGetAttrclass_name(lua_State* L)
  265. {
  266. Element* ele = LuaType<Element>::check(L,1);
  267. const char* classnames = ele->GetClassNames().CString();
  268. lua_pushstring(L,classnames);
  269. return 1;
  270. }
  271. int ElementGetAttrclient_left(lua_State* L)
  272. {
  273. Element* ele = LuaType<Element>::check(L,1);
  274. lua_pushnumber(L,ele->GetClientLeft());
  275. return 1;
  276. }
  277. int ElementGetAttrclient_height(lua_State* L)
  278. {
  279. Element* ele = LuaType<Element>::check(L,1);
  280. lua_pushnumber(L,ele->GetClientHeight());
  281. return 1;
  282. }
  283. int ElementGetAttrclient_top(lua_State* L)
  284. {
  285. Element* ele = LuaType<Element>::check(L,1);
  286. lua_pushnumber(L,ele->GetClientTop());
  287. return 1;
  288. }
  289. int ElementGetAttrclient_width(lua_State* L)
  290. {
  291. Element* ele = LuaType<Element>::check(L,1);
  292. lua_pushnumber(L,ele->GetClientWidth());
  293. return 1;
  294. }
  295. int ElementGetAttrfirst_child(lua_State* L)
  296. {
  297. Element* ele = LuaType<Element>::check(L,1);
  298. Element* child = ele->GetFirstChild();
  299. if(child == NULL)
  300. lua_pushnil(L);
  301. else
  302. LuaType<Element>::push(L,child,false);
  303. return 1;
  304. }
  305. int ElementGetAttrid(lua_State* L)
  306. {
  307. Element* ele = LuaType<Element>::check(L,1);
  308. lua_pushstring(L,ele->GetId().CString());
  309. return 1;
  310. }
  311. int ElementGetAttrinner_rml(lua_State* L)
  312. {
  313. Element* ele = LuaType<Element>::check(L,1);
  314. lua_pushstring(L,ele->GetInnerRML().CString());
  315. return 1;
  316. }
  317. int ElementGetAttrlast_child(lua_State* L)
  318. {
  319. Element* ele = LuaType<Element>::check(L,1);
  320. Element* child = ele->GetLastChild();
  321. if(child == NULL)
  322. lua_pushnil(L);
  323. else
  324. LuaType<Element>::push(L,child,false);
  325. return 1;
  326. }
  327. int ElementGetAttrnext_sibling(lua_State* L)
  328. {
  329. Element* ele = LuaType<Element>::check(L,1);
  330. Element* sibling = ele->GetNextSibling();
  331. if(sibling == NULL)
  332. lua_pushnil(L);
  333. else
  334. LuaType<Element>::push(L,sibling,false);
  335. return 1;
  336. }
  337. int ElementGetAttroffset_height(lua_State* L)
  338. {
  339. Element* ele = LuaType<Element>::check(L,1);
  340. lua_pushnumber(L,ele->GetOffsetHeight());
  341. return 1;
  342. }
  343. int ElementGetAttroffset_left(lua_State* L)
  344. {
  345. Element* ele = LuaType<Element>::check(L,1);
  346. lua_pushnumber(L,ele->GetOffsetLeft());
  347. return 1;
  348. }
  349. int ElementGetAttroffset_parent(lua_State* L)
  350. {
  351. Element* ele = LuaType<Element>::check(L,1);
  352. Element* parent = ele->GetOffsetParent();
  353. LuaType<Element>::push(L,parent,false);
  354. return 1;
  355. }
  356. int ElementGetAttroffset_top(lua_State* L)
  357. {
  358. Element* ele = LuaType<Element>::check(L,1);
  359. lua_pushnumber(L, ele->GetOffsetTop());
  360. return 1;
  361. }
  362. int ElementGetAttroffset_width(lua_State* L)
  363. {
  364. Element* ele = LuaType<Element>::check(L,1);
  365. lua_pushnumber(L,ele->GetOffsetWidth());
  366. return 1;
  367. }
  368. int ElementGetAttrowner_document(lua_State* L)
  369. {
  370. Element* ele = LuaType<Element>::check(L,1);
  371. Document* doc = ele->GetOwnerDocument();
  372. LuaType<Document>::push(L,doc,false);
  373. return 1;
  374. }
  375. int ElementGetAttrparent_node(lua_State* L)
  376. {
  377. Element* ele = LuaType<Element>::check(L,1);
  378. Element* parent = ele->GetParentNode();
  379. if(parent == NULL)
  380. lua_pushnil(L);
  381. else
  382. LuaType<Element>::push(L,parent,false);
  383. return 1;
  384. }
  385. int ElementGetAttrprevious_sibling(lua_State* L)
  386. {
  387. Element* ele = LuaType<Element>::check(L,1);
  388. Element* sibling = ele->GetPreviousSibling();
  389. if(sibling == NULL)
  390. lua_pushnil(L);
  391. else
  392. LuaType<Element>::push(L,sibling,false);
  393. return 1;
  394. }
  395. int ElementGetAttrscroll_height(lua_State* L)
  396. {
  397. Element* ele = LuaType<Element>::check(L,1);
  398. lua_pushnumber(L,ele->GetScrollHeight());
  399. return 1;
  400. }
  401. int ElementGetAttrscroll_left(lua_State* L)
  402. {
  403. Element* ele = LuaType<Element>::check(L,1);
  404. lua_pushnumber(L,ele->GetScrollLeft());
  405. return 1;
  406. }
  407. int ElementGetAttrscroll_top(lua_State* L)
  408. {
  409. Element* ele = LuaType<Element>::check(L,1);
  410. lua_pushnumber(L,ele->GetScrollTop());
  411. return 1;
  412. }
  413. int ElementGetAttrscroll_width(lua_State* L)
  414. {
  415. Element* ele = LuaType<Element>::check(L,1);
  416. lua_pushnumber(L,ele->GetScrollWidth());
  417. return 1;
  418. }
  419. int ElementGetAttrstyle(lua_State* L)
  420. {
  421. Element* ele = LuaType<Element>::check(L,1);
  422. LuaType<ElementStyle>::push(L,ele->GetStyle(),false);
  423. return 1;
  424. }
  425. int ElementGetAttrtag_name(lua_State* L)
  426. {
  427. Element* ele = LuaType<Element>::check(L,1);
  428. lua_pushstring(L,ele->GetTagName().CString());
  429. return 0;
  430. }
  431. //setters
  432. int ElementSetAttrclass_name(lua_State* L)
  433. {
  434. Element* ele = LuaType<Element>::check(L,1);
  435. const char* name = luaL_checkstring(L,2);
  436. ele->SetClassNames(name);
  437. return 0;
  438. }
  439. int ElementSetAttrid(lua_State* L)
  440. {
  441. Element* ele = LuaType<Element>::check(L,1);
  442. const char* id = luaL_checkstring(L,2);
  443. ele->SetId(id);
  444. return 0;
  445. }
  446. int ElementSetAttrinner_rml(lua_State* L)
  447. {
  448. Element* ele = LuaType<Element>::check(L,1);
  449. const char* rml = luaL_checkstring(L,2);
  450. ele->SetInnerRML(rml);
  451. return 0;
  452. }
  453. int ElementSetAttrscroll_left(lua_State* L)
  454. {
  455. Element* ele = LuaType<Element>::check(L,1);
  456. float scroll = (float)luaL_checknumber(L,2);
  457. ele->SetScrollLeft(scroll);
  458. return 0;
  459. }
  460. int ElementSetAttrscroll_top(lua_State* L)
  461. {
  462. Element* ele = LuaType<Element>::check(L,1);
  463. float scroll = (float)luaL_checknumber(L,2);
  464. ele->SetScrollTop(scroll);
  465. return 0;
  466. }
  467. RegType<Element> ElementMethods[] =
  468. {
  469. LUAMETHOD(Element,AddEventListener)
  470. LUAMETHOD(Element,AppendChild)
  471. LUAMETHOD(Element,Blur)
  472. LUAMETHOD(Element,Click)
  473. LUAMETHOD(Element,DispatchEvent)
  474. LUAMETHOD(Element,Focus)
  475. LUAMETHOD(Element,GetAttribute)
  476. LUAMETHOD(Element,GetElementById)
  477. LUAMETHOD(Element,GetElementsByTagName)
  478. LUAMETHOD(Element,HasAttribute)
  479. LUAMETHOD(Element,HasChildNodes)
  480. LUAMETHOD(Element,InsertBefore)
  481. LUAMETHOD(Element,IsClassSet)
  482. LUAMETHOD(Element,RemoveAttribute)
  483. LUAMETHOD(Element,RemoveChild)
  484. LUAMETHOD(Element,ReplaceChild)
  485. LUAMETHOD(Element,ScrollIntoView)
  486. LUAMETHOD(Element,SetAttribute)
  487. LUAMETHOD(Element,SetClass)
  488. { NULL, NULL },
  489. };
  490. luaL_reg ElementGetters[] =
  491. {
  492. LUAGETTER(Element,attributes)
  493. LUAGETTER(Element,child_nodes)
  494. LUAGETTER(Element,class_name)
  495. LUAGETTER(Element,client_left)
  496. LUAGETTER(Element,client_height)
  497. LUAGETTER(Element,client_top)
  498. LUAGETTER(Element,client_width)
  499. LUAGETTER(Element,first_child)
  500. LUAGETTER(Element,id)
  501. LUAGETTER(Element,inner_rml)
  502. LUAGETTER(Element,last_child)
  503. LUAGETTER(Element,next_sibling)
  504. LUAGETTER(Element,offset_height)
  505. LUAGETTER(Element,offset_left)
  506. LUAGETTER(Element,offset_parent)
  507. LUAGETTER(Element,offset_top)
  508. LUAGETTER(Element,offset_width)
  509. LUAGETTER(Element,owner_document)
  510. LUAGETTER(Element,parent_node)
  511. LUAGETTER(Element,previous_sibling)
  512. LUAGETTER(Element,scroll_height)
  513. LUAGETTER(Element,scroll_left)
  514. LUAGETTER(Element,scroll_top)
  515. LUAGETTER(Element,scroll_width)
  516. LUAGETTER(Element,style)
  517. LUAGETTER(Element,tag_name)
  518. { NULL, NULL },
  519. };
  520. luaL_reg ElementSetters[] =
  521. {
  522. LUASETTER(Element,class_name)
  523. LUASETTER(Element,id)
  524. LUASETTER(Element,inner_rml)
  525. LUASETTER(Element,scroll_left)
  526. LUASETTER(Element,scroll_top)
  527. { NULL, NULL },
  528. };
  529. template<> const char* GetTClassName<Element>() { return "Element"; }
  530. template<> RegType<Element>* GetMethodTable<Element>() { return ElementMethods; }
  531. template<> luaL_reg* GetAttrTable<Element>() { return ElementGetters; }
  532. template<> luaL_reg* SetAttrTable<Element>() { return ElementSetters; }
  533. }
  534. }
  535. }