Element.cpp 15 KB

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