Element.cpp 15 KB

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