Element.cpp 15 KB

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