Element.cpp 17 KB

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