Element.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  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 != 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. //do this later
  185. return 0;
  186. }
  187. int ElementSetClass(lua_State* L, Element* obj)
  188. {
  189. const char* name = luaL_checkstring(L,1);
  190. bool value = CHECK_BOOL(L,2);
  191. obj->SetClass(name,value);
  192. return 0;
  193. }
  194. //getters
  195. int ElementGetAttrattributes(lua_State* L)
  196. {
  197. Element* ele = LuaType<Element>::check(L,1);
  198. int index;
  199. String key;
  200. Variant* var;
  201. Variant::Type type;
  202. lua_newtable(L);
  203. while(ele->IterateAttributes(index,key,var))
  204. {
  205. lua_pushstring(L,key.CString());
  206. type = var->GetType();
  207. switch(type)
  208. {
  209. case Variant::BYTE:
  210. case Variant::CHAR:
  211. case Variant::INT:
  212. lua_pushinteger(L,*(int*)var);
  213. break;
  214. case Variant::FLOAT:
  215. lua_pushnumber(L,*(float*)var);
  216. break;
  217. case Variant::COLOURB:
  218. LuaType<Colourb>::push(L,(Colourb*)var,false);
  219. break;
  220. case Variant::COLOURF:
  221. LuaType<Colourf>::push(L,(Colourf*)var,false);
  222. break;
  223. case Variant::STRING:
  224. lua_pushstring(L,((String*)var)->CString());
  225. break;
  226. case Variant::VECTOR2:
  227. //according to Variant.inl, it is going to be a Vector2f
  228. LuaType<Vector2f>::push(L,((Vector2f*)var),false);
  229. break;
  230. case Variant::VOIDPTR:
  231. lua_pushlightuserdata(L,(void*)var);
  232. break;
  233. default:
  234. lua_pushnil(L);
  235. break;
  236. }
  237. lua_settable(L,-3);
  238. }
  239. return 1;
  240. }
  241. int ElementGetAttrchild_nodes(lua_State* L)
  242. {
  243. Element* ele = LuaType<Element>::check(L,1);
  244. if(!ele->HasChildNodes())
  245. lua_pushnil(L);
  246. else
  247. {
  248. lua_newtable(L);
  249. int index = 0;
  250. int num_of_children = ele->GetNumChildren();
  251. while(index < num_of_children)
  252. {
  253. lua_pushinteger(L,index);
  254. LuaType<Element>::push(L,ele->GetChild(index),false);
  255. lua_settable(L,-3);
  256. ++index;
  257. }
  258. }
  259. return 1;
  260. }
  261. int ElementGetAttrclass_name(lua_State* L)
  262. {
  263. Element* ele = LuaType<Element>::check(L,1);
  264. const char* classnames = ele->GetClassNames().CString();
  265. lua_pushstring(L,classnames);
  266. return 1;
  267. }
  268. int ElementGetAttrclient_left(lua_State* L)
  269. {
  270. Element* ele = LuaType<Element>::check(L,1);
  271. lua_pushnumber(L,ele->GetClientLeft());
  272. return 1;
  273. }
  274. int ElementGetAttrclient_height(lua_State* L)
  275. {
  276. Element* ele = LuaType<Element>::check(L,1);
  277. lua_pushnumber(L,ele->GetClientHeight());
  278. return 1;
  279. }
  280. int ElementGetAttrclient_top(lua_State* L)
  281. {
  282. Element* ele = LuaType<Element>::check(L,1);
  283. lua_pushnumber(L,ele->GetClientTop());
  284. return 1;
  285. }
  286. int ElementGetAttrclient_width(lua_State* L)
  287. {
  288. Element* ele = LuaType<Element>::check(L,1);
  289. lua_pushnumber(L,ele->GetClientWidth());
  290. return 1;
  291. }
  292. int ElementGetAttrfirst_child(lua_State* L)
  293. {
  294. Element* ele = LuaType<Element>::check(L,1);
  295. Element* child = ele->GetFirstChild();
  296. if(child == NULL)
  297. lua_pushnil(L);
  298. else
  299. LuaType<Element>::push(L,child,false);
  300. return 1;
  301. }
  302. int ElementGetAttrid(lua_State* L)
  303. {
  304. Element* ele = LuaType<Element>::check(L,1);
  305. lua_pushstring(L,ele->GetId().CString());
  306. return 1;
  307. }
  308. int ElementGetAttrinner_rml(lua_State* L)
  309. {
  310. Element* ele = LuaType<Element>::check(L,1);
  311. lua_pushstring(L,ele->GetInnerRML().CString());
  312. return 1;
  313. }
  314. int ElementGetAttrlast_child(lua_State* L)
  315. {
  316. Element* ele = LuaType<Element>::check(L,1);
  317. Element* child = ele->GetLastChild();
  318. if(child == NULL)
  319. lua_pushnil(L);
  320. else
  321. LuaType<Element>::push(L,child,false);
  322. return 1;
  323. }
  324. int ElementGetAttrnext_sibling(lua_State* L)
  325. {
  326. Element* ele = LuaType<Element>::check(L,1);
  327. Element* sibling = ele->GetNextSibling();
  328. if(sibling == NULL)
  329. lua_pushnil(L);
  330. else
  331. LuaType<Element>::push(L,sibling,false);
  332. return 1;
  333. }
  334. int ElementGetAttroffset_height(lua_State* L)
  335. {
  336. Element* ele = LuaType<Element>::check(L,1);
  337. lua_pushnumber(L,ele->GetOffsetHeight());
  338. return 1;
  339. }
  340. int ElementGetAttroffset_left(lua_State* L)
  341. {
  342. Element* ele = LuaType<Element>::check(L,1);
  343. lua_pushnumber(L,ele->GetOffsetLeft());
  344. return 1;
  345. }
  346. int ElementGetAttroffset_parent(lua_State* L)
  347. {
  348. Element* ele = LuaType<Element>::check(L,1);
  349. Element* parent = ele->GetOffsetParent();
  350. LuaType<Element>::push(L,parent,false);
  351. return 1;
  352. }
  353. int ElementGetAttroffset_top(lua_State* L)
  354. {
  355. Element* ele = LuaType<Element>::check(L,1);
  356. lua_pushnumber(L, ele->GetOffsetTop());
  357. return 1;
  358. }
  359. int ElementGetAttroffset_width(lua_State* L)
  360. {
  361. Element* ele = LuaType<Element>::check(L,1);
  362. lua_pushnumber(L,ele->GetOffsetWidth());
  363. return 1;
  364. }
  365. int ElementGetAttrowner_document(lua_State* L)
  366. {
  367. Element* ele = LuaType<Element>::check(L,1);
  368. Document* doc = ele->GetOwnerDocument();
  369. LuaType<Document>::push(L,doc,false);
  370. return 1;
  371. }
  372. int ElementGetAttrparent_node(lua_State* L)
  373. {
  374. Element* ele = LuaType<Element>::check(L,1);
  375. Element* parent = ele->GetParentNode();
  376. if(parent == NULL)
  377. lua_pushnil(L);
  378. else
  379. LuaType<Element>::push(L,parent,false);
  380. return 1;
  381. }
  382. int ElementGetAttrprevious_sibling(lua_State* L)
  383. {
  384. Element* ele = LuaType<Element>::check(L,1);
  385. Element* sibling = ele->GetPreviousSibling();
  386. if(sibling == NULL)
  387. lua_pushnil(L);
  388. else
  389. LuaType<Element>::push(L,sibling,false);
  390. return 1;
  391. }
  392. int ElementGetAttrscroll_height(lua_State* L)
  393. {
  394. Element* ele = LuaType<Element>::check(L,1);
  395. lua_pushnumber(L,ele->GetScrollHeight());
  396. return 1;
  397. }
  398. int ElementGetAttrscroll_left(lua_State* L)
  399. {
  400. Element* ele = LuaType<Element>::check(L,1);
  401. lua_pushnumber(L,ele->GetScrollLeft());
  402. return 1;
  403. }
  404. int ElementGetAttrscroll_top(lua_State* L)
  405. {
  406. Element* ele = LuaType<Element>::check(L,1);
  407. lua_pushnumber(L,ele->GetScrollTop());
  408. return 1;
  409. }
  410. int ElementGetAttrscroll_width(lua_State* L)
  411. {
  412. Element* ele = LuaType<Element>::check(L,1);
  413. lua_pushnumber(L,ele->GetScrollWidth());
  414. return 1;
  415. }
  416. int ElementGetAttrstyle(lua_State* L)
  417. {
  418. Element* ele = LuaType<Element>::check(L,1);
  419. LuaType<ElementStyle>::push(L,ele->GetStyle(),false);
  420. return 1;
  421. }
  422. int ElementGetAttrtag_name(lua_State* L)
  423. {
  424. Element* ele = LuaType<Element>::check(L,1);
  425. lua_pushstring(L,ele->GetTagName().CString());
  426. return 0;
  427. }
  428. //setters
  429. int ElementSetAttrclass_name(lua_State* L)
  430. {
  431. Element* ele = LuaType<Element>::check(L,1);
  432. const char* name = luaL_checkstring(L,2);
  433. ele->SetClassNames(name);
  434. return 0;
  435. }
  436. int ElementSetAttrid(lua_State* L)
  437. {
  438. Element* ele = LuaType<Element>::check(L,1);
  439. const char* id = luaL_checkstring(L,2);
  440. ele->SetId(id);
  441. return 0;
  442. }
  443. int ElementSetAttrinner_rml(lua_State* L)
  444. {
  445. Element* ele = LuaType<Element>::check(L,1);
  446. const char* rml = luaL_checkstring(L,2);
  447. ele->SetInnerRML(rml);
  448. return 0;
  449. }
  450. int ElementSetAttrscroll_left(lua_State* L)
  451. {
  452. Element* ele = LuaType<Element>::check(L,1);
  453. float scroll = (float)luaL_checknumber(L,2);
  454. ele->SetScrollLeft(scroll);
  455. return 0;
  456. }
  457. int ElementSetAttrscroll_top(lua_State* L)
  458. {
  459. Element* ele = LuaType<Element>::check(L,1);
  460. float scroll = (float)luaL_checknumber(L,2);
  461. ele->SetScrollTop(scroll);
  462. return 0;
  463. }
  464. RegType<Element> ElementMethods[] =
  465. {
  466. LUAMETHOD(Element,AddEventListener)
  467. LUAMETHOD(Element,AppendChild)
  468. LUAMETHOD(Element,Blur)
  469. LUAMETHOD(Element,Click)
  470. LUAMETHOD(Element,DispatchEvent)
  471. LUAMETHOD(Element,Focus)
  472. LUAMETHOD(Element,GetAttribute)
  473. LUAMETHOD(Element,GetElementById)
  474. LUAMETHOD(Element,GetElementsByTagName)
  475. LUAMETHOD(Element,HasAttribute)
  476. LUAMETHOD(Element,HasChildNodes)
  477. LUAMETHOD(Element,InsertBefore)
  478. LUAMETHOD(Element,IsClassSet)
  479. LUAMETHOD(Element,RemoveAttribute)
  480. LUAMETHOD(Element,RemoveChild)
  481. LUAMETHOD(Element,ReplaceChild)
  482. LUAMETHOD(Element,ScrollIntoView)
  483. LUAMETHOD(Element,SetAttribute)
  484. LUAMETHOD(Element,SetClass)
  485. { NULL, NULL },
  486. };
  487. luaL_reg ElementGetters[] =
  488. {
  489. LUAGETTER(Element,attributes)
  490. LUAGETTER(Element,child_nodes)
  491. LUAGETTER(Element,class_name)
  492. LUAGETTER(Element,client_left)
  493. LUAGETTER(Element,client_height)
  494. LUAGETTER(Element,client_top)
  495. LUAGETTER(Element,client_width)
  496. LUAGETTER(Element,first_child)
  497. LUAGETTER(Element,id)
  498. LUAGETTER(Element,inner_rml)
  499. LUAGETTER(Element,last_child)
  500. LUAGETTER(Element,next_sibling)
  501. LUAGETTER(Element,offset_height)
  502. LUAGETTER(Element,offset_left)
  503. LUAGETTER(Element,offset_parent)
  504. LUAGETTER(Element,offset_top)
  505. LUAGETTER(Element,offset_width)
  506. LUAGETTER(Element,owner_document)
  507. LUAGETTER(Element,parent_node)
  508. LUAGETTER(Element,previous_sibling)
  509. LUAGETTER(Element,scroll_height)
  510. LUAGETTER(Element,scroll_left)
  511. LUAGETTER(Element,scroll_top)
  512. LUAGETTER(Element,scroll_width)
  513. LUAGETTER(Element,style)
  514. LUAGETTER(Element,tag_name)
  515. { NULL, NULL },
  516. };
  517. luaL_reg ElementSetters[] =
  518. {
  519. LUASETTER(Element,class_name)
  520. LUASETTER(Element,id)
  521. LUASETTER(Element,inner_rml)
  522. LUASETTER(Element,scroll_left)
  523. LUASETTER(Element,scroll_top)
  524. { NULL, NULL },
  525. };
  526. template<> const char* GetTClassName<Element>() { return "Element"; }
  527. template<> RegType<Element>* GetMethodTable<Element>() { return ElementMethods; }
  528. template<> luaL_reg* GetAttrTable<Element>() { return ElementGetters; }
  529. template<> luaL_reg* SetAttrTable<Element>() { return ElementSetters; }
  530. }
  531. }
  532. }