UIMLView.cpp 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315
  1. #include "UIMLView.h"
  2. #include "Bild.h"
  3. #include "Bildschirm.h"
  4. #include "Fenster.h"
  5. #include "Knopf.h"
  6. #include "Rahmen.h"
  7. #include "Schrift.h"
  8. #include "Scroll.h"
  9. #include "Tabelle.h"
  10. #include "TextFeld.h"
  11. #include "XML.h"
  12. using namespace Framework;
  13. UIMLElement::UIMLElement()
  14. : ReferenceCounter()
  15. {}
  16. UIMLElement::~UIMLElement() {}
  17. //! wendet die layout parameter zu einer Zeichnung an
  18. void UIMLElement::layout(XML::Element& element,
  19. Zeichnung& z,
  20. int pWidth,
  21. int pHeight,
  22. UIMLContainer& generalLayouter)
  23. {
  24. int width = z.getBreite();
  25. int height = z.getHeight();
  26. if (element.hasAttribute("width"))
  27. {
  28. Text w = element.getAttributeValue("width");
  29. if (!w.istGleich("auto"))
  30. {
  31. width = (int)w;
  32. if (w.getText()[w.getLength() - 1] == '%')
  33. width = (int)((pWidth / 100.0) * width);
  34. }
  35. }
  36. if (element.hasAttribute("height"))
  37. {
  38. Text h = element.getAttributeValue("height");
  39. if (!h.istGleich("auto"))
  40. {
  41. height = (int)h;
  42. if (h.getText()[h.getLength() - 1] == '%')
  43. height = (int)((pHeight / 100.0) * height);
  44. }
  45. }
  46. z.setSize(width, height);
  47. if (element.hasAttribute("align-left"))
  48. {
  49. Text la = element.getAttributeValue("align-left");
  50. int x = 0;
  51. if (la.istGleich("start"))
  52. x = 0;
  53. else if (la.istGleich("end"))
  54. x = pWidth;
  55. else if (la.istGleich("center"))
  56. x = pWidth / 2 - width / 2;
  57. else
  58. {
  59. XML::Editor ed
  60. = element.zParent()->selectChildsByAttribute("id", la);
  61. generalLayouter.layout(*ed.begin().val(),
  62. *generalLayouter.zZeichnungById(la),
  63. pWidth,
  64. pHeight,
  65. generalLayouter);
  66. Zeichnung* laz = generalLayouter.zZeichnungById(la);
  67. if (laz) x = laz->getX() + laz->getBreite();
  68. }
  69. if (element.hasAttribute("margin-left"))
  70. {
  71. Text mt = element.getAttributeValue("margin-left");
  72. int m = (int)mt;
  73. if (mt.getText()[mt.getLength() - 1] == '%')
  74. m = (int)((pWidth / 100.0) * m);
  75. x += m;
  76. }
  77. z.setX(x);
  78. }
  79. else if (element.hasAttribute("align-right"))
  80. {
  81. Text ra = element.getAttributeValue("align-right");
  82. int x = 0;
  83. if (ra.istGleich("start"))
  84. x = -z.getBreite();
  85. else if (ra.istGleich("end"))
  86. x = pWidth - z.getBreite();
  87. else if (ra.istGleich("center"))
  88. x = pWidth / 2 - width / 2;
  89. else
  90. {
  91. XML::Editor ed
  92. = element.zParent()->selectChildsByAttribute("id", ra);
  93. generalLayouter.layout(*ed.begin().val(),
  94. *generalLayouter.zZeichnungById(ra),
  95. pWidth,
  96. pHeight,
  97. generalLayouter);
  98. Zeichnung* raz = generalLayouter.zZeichnungById(ra);
  99. if (raz) x = raz->getX() - z.getBreite();
  100. }
  101. if (element.hasAttribute("margin-right"))
  102. {
  103. Text mt = element.getAttributeValue("margin-right");
  104. int m = (int)mt;
  105. if (mt.getText()[mt.getLength() - 1] == '%')
  106. m = (int)((pWidth / 100.0) * m);
  107. x -= m;
  108. }
  109. z.setX(x);
  110. }
  111. if (element.hasAttribute("align-top"))
  112. {
  113. Text ta = element.getAttributeValue("align-top");
  114. int y = 0;
  115. if (ta.istGleich("start"))
  116. y = 0;
  117. else if (ta.istGleich("end"))
  118. y = pHeight;
  119. else if (ta.istGleich("center"))
  120. y = pHeight / 2 - height / 2;
  121. else
  122. {
  123. XML::Editor ed
  124. = element.zParent()->selectChildsByAttribute("id", ta);
  125. generalLayouter.layout(*ed.begin().val(),
  126. *generalLayouter.zZeichnungById(ta),
  127. pWidth,
  128. pHeight,
  129. generalLayouter);
  130. Zeichnung* taz = generalLayouter.zZeichnungById(ta);
  131. if (taz) y = taz->getY() + taz->getHeight();
  132. }
  133. if (element.hasAttribute("margin-top"))
  134. {
  135. Text mt = element.getAttributeValue("margin-top");
  136. int m = (int)mt;
  137. if (mt.getText()[mt.getLength() - 1] == '%')
  138. m = (int)((pHeight / 100.0) * m);
  139. y += m;
  140. }
  141. z.setY(y);
  142. }
  143. else if (element.hasAttribute("align-bottom"))
  144. {
  145. Text ba = element.getAttributeValue("align-bottom");
  146. int y = 0;
  147. if (ba.istGleich("start"))
  148. y = -z.getHeight();
  149. else if (ba.istGleich("end"))
  150. y = pHeight - z.getHeight();
  151. else if (ba.istGleich("center"))
  152. y = pHeight / 2 - height / 2;
  153. else
  154. {
  155. XML::Editor ed
  156. = element.zParent()->selectChildsByAttribute("id", ba);
  157. generalLayouter.layout(*ed.begin().val(),
  158. *generalLayouter.zZeichnungById(ba),
  159. pWidth,
  160. pHeight,
  161. generalLayouter);
  162. Zeichnung* baz = generalLayouter.zZeichnungById(ba);
  163. if (baz) y = baz->getY() - z.getHeight();
  164. }
  165. if (element.hasAttribute("margin-bottom"))
  166. {
  167. Text mt = element.getAttributeValue("margin-bottom");
  168. int m = (int)mt;
  169. if (mt.getText()[mt.getLength() - 1] == '%')
  170. m = (int)((pHeight / 100.0) * m);
  171. y -= m;
  172. }
  173. z.setY(y);
  174. }
  175. int x = z.getX();
  176. int y = z.getY();
  177. if (element.hasAttribute("x"))
  178. {
  179. Text xt = element.getAttributeValue("x");
  180. x = (int)xt;
  181. if (xt.getText()[xt.getLength() - 1] == '%')
  182. x = (int)((pWidth / 100.0) * x);
  183. }
  184. if (element.hasAttribute("y"))
  185. {
  186. Text yt = element.getAttributeValue("y");
  187. y = (int)yt;
  188. if (yt.getText()[yt.getLength() - 1] == '%')
  189. y = (int)((pHeight / 100.0) * y);
  190. }
  191. z.setPosition(x, y);
  192. pWidth = z.getInnenBreite();
  193. pHeight = z.getInnenHeight();
  194. // recursive layout
  195. for (auto i = element.getChilds(); i; i++)
  196. {
  197. Zeichnung* z = 0;
  198. if (i->hasAttribute("id"))
  199. {
  200. z = generalLayouter.zZeichnungById(i->getAttributeValue("id"));
  201. }
  202. if (z)
  203. {
  204. generalLayouter.layout(
  205. *i.val(), *z, pWidth, pHeight, generalLayouter);
  206. }
  207. }
  208. }
  209. UIMLContainer::UIMLContainer()
  210. : UIMLElement()
  211. {}
  212. UIMLContainer::~UIMLContainer() {}
  213. UIMLTextField::UIMLTextField()
  214. : UIMLElement()
  215. {}
  216. bool UIMLTextField::isApplicableFor(XML::Element& element)
  217. {
  218. return element.getName().istGleich("textfield");
  219. }
  220. Zeichnung* UIMLTextField::parseElement(
  221. XML::Element& element, UIMLContainer& generalFactory)
  222. {
  223. TextFeld* t = generalFactory.getFactory().createTextFeld(
  224. generalFactory.getFactory().initParam);
  225. updateElement(element, *t, generalFactory);
  226. return t;
  227. }
  228. bool Framework::UIMLTextField::updateElement(
  229. XML::Element& element, Zeichnung& z, UIMLContainer& generalFactory)
  230. {
  231. TextFeld* t = dynamic_cast<TextFeld*>(&z);
  232. if (!t) return false;
  233. if (element.hasAttribute("style"))
  234. {
  235. Text style = element.getAttributeValue("style");
  236. if (!style.hatAt(0, "0x"))
  237. {
  238. style.insert(0, "0x");
  239. }
  240. t->setStyle((int)style);
  241. }
  242. else
  243. {
  244. TextFeld* tmp = generalFactory.getFactory().createTextFeld(
  245. generalFactory.getFactory().initParam);
  246. tmp->addStyle(TextFeld::Style::TextFeld);
  247. t->setStyle(tmp->getStyles());
  248. tmp->release();
  249. }
  250. return true;
  251. }
  252. void UIMLTextField::layout(XML::Element& element,
  253. Zeichnung& z,
  254. int pWidth,
  255. int pHeight,
  256. UIMLContainer& generalLayouter)
  257. {
  258. if (element.hasAttribute("text-align-horizontal"))
  259. z.setStyle(TextFeld::Style::HCenter,
  260. element.getAttributeValue("text-align-horizontal")
  261. .istGleich("center"));
  262. if (element.hasAttribute("text-align-vertical"))
  263. z.setStyle(TextFeld::Style::VCenter,
  264. element.getAttributeValue("text-align-vertical")
  265. .istGleich("center"));
  266. if (element.hasAttribute("font-size"))
  267. ((TextFeld*)&z)
  268. ->setSchriftSize(
  269. (unsigned char)(int)element.getAttributeValue("font-size"));
  270. if (element.hasAttribute("disabled"))
  271. z.removeStyle(TextFeld::Style::Editierbar);
  272. ((TextFeld*)&z)->setText(element.getText());
  273. if (element.hasAttribute("width"))
  274. {
  275. Text w = element.getAttributeValue("width");
  276. if (w.istGleich("auto"))
  277. {
  278. z.setWidth(((TextFeld*)&z)->getNeededWidth());
  279. }
  280. }
  281. if (element.hasAttribute("height"))
  282. {
  283. Text h = element.getAttributeValue("height");
  284. if (h.istGleich("auto"))
  285. {
  286. z.setHeight(((TextFeld*)&z)->getNeededHeight());
  287. }
  288. }
  289. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  290. }
  291. UIMLButton::UIMLButton()
  292. : UIMLElement()
  293. {}
  294. bool UIMLButton::isApplicableFor(XML::Element& element)
  295. {
  296. return element.getName().istGleich("button");
  297. }
  298. Zeichnung* UIMLButton::parseElement(
  299. XML::Element& element, UIMLContainer& generalFactory)
  300. {
  301. Knopf* k = generalFactory.getFactory().createKnopf(
  302. generalFactory.getFactory().initParam);
  303. updateElement(element, *k, generalFactory);
  304. return k;
  305. }
  306. bool Framework::UIMLButton::updateElement(
  307. XML::Element& element, Zeichnung& z, UIMLContainer& generalFactory)
  308. {
  309. Knopf* k = dynamic_cast<Knopf*>(&z);
  310. if (!k) return false;
  311. if (element.hasAttribute("style"))
  312. {
  313. Text style = element.getAttributeValue("style");
  314. if (!style.hatAt(0, "0x"))
  315. {
  316. style.insert(0, "0x");
  317. }
  318. k->setStyle((int)style);
  319. }
  320. else
  321. {
  322. Knopf* tmp = generalFactory.getFactory().createKnopf(
  323. generalFactory.getFactory().initParam);
  324. k->setStyle(tmp->getStyles());
  325. tmp->release();
  326. }
  327. return true;
  328. }
  329. void UIMLButton::layout(XML::Element& element,
  330. Zeichnung& z,
  331. int pWidth,
  332. int pHeight,
  333. UIMLContainer& generalLayouter)
  334. {
  335. if (element.hasAttribute("font-size"))
  336. ((Knopf*)&z)
  337. ->setSchriftSize(
  338. (unsigned char)(int)element.getAttributeValue("font-size"));
  339. ((Knopf*)&z)->setText(element.getText());
  340. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  341. }
  342. UIMLCheck::UIMLCheck()
  343. : UIMLElement()
  344. {}
  345. bool UIMLCheck::isApplicableFor(XML::Element& element)
  346. {
  347. return element.getName().istGleich("check");
  348. }
  349. Zeichnung* UIMLCheck::parseElement(
  350. XML::Element& element, UIMLContainer& generalFactory)
  351. {
  352. KontrollKnopf* k = generalFactory.getFactory().createKontrollKnopf(
  353. generalFactory.getFactory().initParam);
  354. updateElement(element, *k, generalFactory);
  355. return k;
  356. }
  357. bool Framework::UIMLCheck::updateElement(
  358. XML::Element& element, Zeichnung& z, UIMLContainer& generalFactory)
  359. {
  360. KontrollKnopf* k = dynamic_cast<KontrollKnopf*>(&z);
  361. if (!k) return false;
  362. if (element.hasAttribute("style"))
  363. {
  364. Text style = element.getAttributeValue("style");
  365. if (!style.hatAt(0, "0x"))
  366. {
  367. style.insert(0, "0x");
  368. }
  369. k->setStyle((int)style);
  370. }
  371. else
  372. {
  373. KontrollKnopf* tmp = generalFactory.getFactory().createKontrollKnopf(
  374. generalFactory.getFactory().initParam);
  375. k->setStyle(tmp->getStyles());
  376. tmp->release();
  377. }
  378. return true;
  379. }
  380. void UIMLCheck::layout(XML::Element& element,
  381. Zeichnung& z,
  382. int pWidth,
  383. int pHeight,
  384. UIMLContainer& generalLayouter)
  385. {
  386. ((KontrollKnopf*)&z)->setText(element.getText());
  387. ((KontrollKnopf*)&z)->setSText(element.getText());
  388. z.setStyle(
  389. KontrollKnopf::Style::Selected, element.hasAttribute("selected"));
  390. if (element.hasAttribute("font-size"))
  391. ((KontrollKnopf*)&z)
  392. ->setSSize(
  393. (unsigned char)(int)element.getAttributeValue("font-size"));
  394. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  395. }
  396. UIMLText::UIMLText()
  397. : UIMLElement()
  398. {}
  399. bool UIMLText::isApplicableFor(XML::Element& element)
  400. {
  401. return element.getName().istGleich("text");
  402. }
  403. Zeichnung* UIMLText::parseElement(
  404. XML::Element& element, UIMLContainer& generalFactory)
  405. {
  406. TextFeld* t = generalFactory.getFactory().createTextFeld(
  407. generalFactory.getFactory().initParam);
  408. updateElement(element, *t, generalFactory);
  409. return t;
  410. }
  411. bool Framework::UIMLText::updateElement(
  412. XML::Element& element, Zeichnung& z, UIMLContainer& generalFactory)
  413. {
  414. TextFeld* t = dynamic_cast<TextFeld*>(&z);
  415. if (!t) return false;
  416. if (element.hasAttribute("style"))
  417. {
  418. Text style = element.getAttributeValue("style");
  419. if (!style.hatAt(0, "0x"))
  420. {
  421. style.insert(0, "0x");
  422. }
  423. t->setStyle((int)style);
  424. }
  425. else
  426. {
  427. TextFeld* tmp = generalFactory.getFactory().createTextFeld(
  428. generalFactory.getFactory().initParam);
  429. tmp->addStyle(TextFeld::Style::Text);
  430. t->setStyle(tmp->getStyles());
  431. tmp->release();
  432. }
  433. return true;
  434. }
  435. void UIMLText::layout(XML::Element& element,
  436. Zeichnung& z,
  437. int pWidth,
  438. int pHeight,
  439. UIMLContainer& generalLayouter)
  440. {
  441. if (element.hasAttribute("text-align-horizontal"))
  442. z.setStyle(TextFeld::Style::HCenter,
  443. element.getAttributeValue("text-align-horizontal")
  444. .istGleich("center"));
  445. if (element.hasAttribute("text-align-vertical"))
  446. z.setStyle(TextFeld::Style::VCenter,
  447. element.getAttributeValue("text-align-vertical")
  448. .istGleich("center"));
  449. if (element.hasAttribute("font-size"))
  450. ((TextFeld*)&z)
  451. ->setSchriftSize(
  452. (unsigned char)(int)element.getAttributeValue("font-size"));
  453. if (element.hasAttribute("disabled"))
  454. z.removeStyle(TextFeld::Style::Editierbar);
  455. ((TextFeld*)&z)->setText(element.getText());
  456. if (element.hasAttribute("width"))
  457. {
  458. Text w = element.getAttributeValue("width");
  459. if (w.istGleich("auto"))
  460. {
  461. z.setWidth(((TextFeld*)&z)->getNeededWidth());
  462. }
  463. }
  464. if (element.hasAttribute("height"))
  465. {
  466. Text h = element.getAttributeValue("height");
  467. if (h.istGleich("auto"))
  468. {
  469. z.setHeight(((TextFeld*)&z)->getNeededHeight());
  470. }
  471. }
  472. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  473. }
  474. UIMLTextArea::UIMLTextArea()
  475. : UIMLElement()
  476. {}
  477. bool UIMLTextArea::isApplicableFor(XML::Element& element)
  478. {
  479. return element.getName().istGleich("textarea");
  480. }
  481. Zeichnung* UIMLTextArea::parseElement(
  482. XML::Element& element, UIMLContainer& generalFactory)
  483. {
  484. TextFeld* t = generalFactory.getFactory().createTextFeld(
  485. generalFactory.getFactory().initParam);
  486. updateElement(element, *t, generalFactory);
  487. return t;
  488. }
  489. bool Framework::UIMLTextArea::updateElement(
  490. XML::Element& element, Zeichnung& z, UIMLContainer& generalFactory)
  491. {
  492. TextFeld* t = dynamic_cast<TextFeld*>(&z);
  493. if (!t) return false;
  494. if (element.hasAttribute("style"))
  495. {
  496. Text style = element.getAttributeValue("style");
  497. if (!style.hatAt(0, "0x"))
  498. {
  499. style.insert(0, "0x");
  500. }
  501. t->setStyle((int)style);
  502. }
  503. else
  504. {
  505. TextFeld* tmp = generalFactory.getFactory().createTextFeld(
  506. generalFactory.getFactory().initParam);
  507. tmp->addStyle(TextFeld::Style::TextGebiet);
  508. t->setStyle(tmp->getStyles());
  509. tmp->release();
  510. }
  511. return true;
  512. }
  513. void UIMLTextArea::layout(XML::Element& element,
  514. Zeichnung& z,
  515. int pWidth,
  516. int pHeight,
  517. UIMLContainer& generalLayouter)
  518. {
  519. if (element.hasAttribute("text-align-horizontal"))
  520. z.setStyle(TextFeld::Style::HCenter,
  521. element.getAttributeValue("text-align-horizontal")
  522. .istGleich("center"));
  523. if (element.hasAttribute("text-align-vertical"))
  524. z.setStyle(TextFeld::Style::VCenter,
  525. element.getAttributeValue("text-align-vertical")
  526. .istGleich("center"));
  527. if (element.hasAttribute("font-size"))
  528. ((TextFeld*)&z)
  529. ->setSchriftSize(
  530. (unsigned char)(int)element.getAttributeValue("font-size"));
  531. if (element.hasAttribute("disabled"))
  532. z.removeStyle(TextFeld::Style::Editierbar);
  533. ((TextFeld*)&z)->setText(element.getText());
  534. ((TextFeld*)&z)
  535. ->zTextRenderer()
  536. ->textFormatieren(((TextFeld*)&z)->zText(), z.getInnenBreite());
  537. if (element.hasAttribute("width"))
  538. {
  539. Text w = element.getAttributeValue("width");
  540. if (w.istGleich("auto"))
  541. {
  542. z.setWidth(((TextFeld*)&z)->getNeededWidth());
  543. }
  544. }
  545. if (element.hasAttribute("height"))
  546. {
  547. Text h = element.getAttributeValue("height");
  548. if (h.istGleich("auto"))
  549. {
  550. z.setHeight(((TextFeld*)&z)->getNeededHeight());
  551. }
  552. }
  553. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  554. }
  555. UIMLTable::UIMLTable()
  556. : UIMLElement()
  557. {}
  558. bool UIMLTable::isApplicableFor(XML::Element& element)
  559. {
  560. return element.getName().istGleich("table");
  561. }
  562. Zeichnung* UIMLTable::parseElement(
  563. XML::Element& element, UIMLContainer& generalFactory)
  564. {
  565. ObjTabelle* t = generalFactory.getFactory().createObjTabelle(
  566. generalFactory.getFactory().initParam);
  567. updateElement(element, *t, generalFactory);
  568. return t;
  569. }
  570. DLLEXPORT bool Framework::UIMLTable::updateElement(
  571. XML::Element& element, Zeichnung& z, UIMLContainer& generalFactory)
  572. {
  573. ObjTabelle* t = dynamic_cast<ObjTabelle*>(&z);
  574. if (!t) return false;
  575. int index = 0;
  576. int linePos = 0;
  577. int numCols = 0;
  578. for (auto i = element.getChilds(); i; i++)
  579. {
  580. Text id;
  581. if (i->hasAttribute("id"))
  582. id = i->getAttributeValue("id");
  583. else
  584. {
  585. id = Text("_") += index++;
  586. i->setAttribute("id", id);
  587. }
  588. if (i->getName().istGleich("tr"))
  589. {
  590. if (t->getZeilenNummer(id) == -1) t->addZeile(id);
  591. t->setZeilePosition(id, linePos);
  592. int c = 1;
  593. for (auto j = i->getChilds(); j; j++)
  594. {
  595. if (t->getSpaltenAnzahl() < c) t->addSpalte(Text(c - 1));
  596. if (numCols < c) numCols = c;
  597. Zeichnung* z = t->zZeichnung(Text(c - 1), id);
  598. if (!z
  599. || !generalFactory.updateElement(
  600. element, *z, generalFactory))
  601. {
  602. if (z) generalFactory.removeZeichnung(*z);
  603. z = generalFactory.parseElement(*i.val(), generalFactory);
  604. if (z) t->setZeichnungZ(Text(c - 1), id, z);
  605. }
  606. c++;
  607. }
  608. }
  609. linePos++;
  610. }
  611. for (int i = 0; i < t->getZeilenAnzahl(); i++)
  612. { // remove all lines that are not in the xml
  613. if (!element.selectChildsByName("tr")
  614. .whereAttributeEquals("id", *t->zZeilenName(i))
  615. .exists())
  616. {
  617. for (int j = 0; j < t->getSpaltenAnzahl(); j++)
  618. {
  619. Zeichnung* z = t->zZeichnung(j, i);
  620. if (z) generalFactory.removeZeichnung(*z);
  621. }
  622. t->removeZeile(i);
  623. i--;
  624. }
  625. }
  626. for (int i = numCols; i < t->getSpaltenAnzahl(); i++)
  627. { // remove all columns that are not in the xml
  628. for (int j = 0; j < t->getZeilenAnzahl(); j++)
  629. {
  630. Zeichnung* z = t->zZeichnung(i, j);
  631. if (z) generalFactory.removeZeichnung(*z);
  632. }
  633. t->removeSpalte(i);
  634. i--;
  635. }
  636. if (element.hasAttribute("style"))
  637. {
  638. Text style = element.getAttributeValue("style");
  639. if (!style.hatAt(0, "0x"))
  640. {
  641. style.insert(0, "0x");
  642. }
  643. t->setStyle((int)style);
  644. }
  645. else
  646. {
  647. ObjTabelle* tmp = generalFactory.getFactory().createObjTabelle(
  648. generalFactory.getFactory().initParam);
  649. t->setStyle(tmp->getStyles());
  650. tmp->release();
  651. }
  652. return true;
  653. }
  654. void UIMLTable::layout(XML::Element& element,
  655. Zeichnung& z,
  656. int pWidth,
  657. int pHeight,
  658. UIMLContainer& generalLayouter)
  659. {
  660. if (element.hasAttribute("scroll"))
  661. {
  662. z.setStyle(ObjTabelle::Style::HScroll,
  663. element.getAttributeValue("scroll").istGleich("horizontal"));
  664. z.setStyle(ObjTabelle::Style::VScroll,
  665. element.getAttributeValue("scroll").istGleich("vertical"));
  666. z.setStyle(ObjTabelle::Style::scroll,
  667. element.getAttributeValue("scroll").istGleich("both"));
  668. }
  669. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  670. ObjTabelle* objT = (ObjTabelle*)&z;
  671. if (objT->getZeilenAnzahl() > 0)
  672. {
  673. if (element.hasAttribute("line-height"))
  674. {
  675. int height = (int)element.getAttributeValue("line-height");
  676. for (int i = 0; i < objT->getZeilenAnzahl(); i++)
  677. objT->setZeilenHeight(i, height);
  678. }
  679. for (int i = 0; i < objT->getSpaltenAnzahl(); i++)
  680. {
  681. if (objT->zZeichnung(i, 0))
  682. objT->setSpaltenBreite(i, objT->zZeichnung(i, 0)->getBreite());
  683. }
  684. }
  685. }
  686. UIMLFrame::UIMLFrame()
  687. : UIMLElement()
  688. {}
  689. bool UIMLFrame::isApplicableFor(XML::Element& element)
  690. {
  691. return element.getName().istGleich("frame");
  692. }
  693. Zeichnung* UIMLFrame::parseElement(
  694. XML::Element& element, UIMLContainer& generalFactory)
  695. {
  696. Fenster* f = generalFactory.getFactory().createFenster(
  697. generalFactory.getFactory().initParam);
  698. updateElement(element, *f, generalFactory);
  699. return f;
  700. }
  701. bool Framework::UIMLFrame::updateElement(
  702. XML::Element& element, Zeichnung& z, UIMLContainer& generalFactory)
  703. {
  704. Fenster* f = dynamic_cast<Fenster*>(&z);
  705. if (!f) return false;
  706. for (auto member = f->getMembers().begin(); member; member++)
  707. { // remove all members that are not in the xml
  708. if (!element
  709. .selectChildsByAttribute(
  710. "id", generalFactory.getZeichnungId(*member.val()))
  711. .exists())
  712. {
  713. member.remove();
  714. f->setRender();
  715. }
  716. }
  717. int index = 0;
  718. for (auto i = element.getChilds(); i; i++)
  719. {
  720. Text id = element.getAttributeValue("id");
  721. Zeichnung* z = generalFactory.zZeichnungById(id);
  722. if (!id.getLength() || !z || f->getMembers().indexOf(z) < 0
  723. || !generalFactory.updateElement(*i.val(), *z, generalFactory))
  724. {
  725. if (z) generalFactory.removeZeichnung(*z);
  726. z = generalFactory.parseElement(*i.val(), generalFactory);
  727. if (z) f->addMember(z);
  728. }
  729. if (z) f->setMemberIndex(z, index++);
  730. }
  731. if (element.hasAttribute("style"))
  732. {
  733. Text style = element.getAttributeValue("style");
  734. if (!style.hatAt(0, "0x"))
  735. {
  736. style.insert(0, "0x");
  737. }
  738. f->setStyle((int)style);
  739. }
  740. else
  741. {
  742. Fenster* tmp = generalFactory.getFactory().createFenster(
  743. generalFactory.getFactory().initParam);
  744. f->setStyle(tmp->getStyles());
  745. tmp->release();
  746. }
  747. return true;
  748. }
  749. void UIMLFrame::layout(XML::Element& element,
  750. Zeichnung& z,
  751. int pWidth,
  752. int pHeight,
  753. UIMLContainer& generalLayouter)
  754. {
  755. if (element.hasAttribute("title"))
  756. ((Fenster*)&z)->setTitel(element.getAttributeValue("title"));
  757. if (element.hasAttribute("title-height"))
  758. ((Fenster*)&z)
  759. ->zTTextFeld()
  760. ->setSize(((Fenster*)&z)->zTTextFeld()->getBreite(),
  761. (int)element.getAttributeValue("title-height"));
  762. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  763. }
  764. // Erstellt eine UIML View
  765. UIMLView::UIMLView()
  766. : ZeichnungHintergrund()
  767. {
  768. style = Style::MEIgnoreInside | Style::MEIgnoreParentInside
  769. | Style::MEIgnoreSichtbar | Style::MEIgnoreVerarbeitet;
  770. members = new RCTrie<Zeichnung>();
  771. dom = 0;
  772. nextId = 0;
  773. memset(&init, 0, sizeof(UIInit));
  774. addKnownElement(new UIMLTextField());
  775. addKnownElement(new UIMLButton());
  776. addKnownElement(new UIMLCheck());
  777. addKnownElement(new UIMLText());
  778. addKnownElement(new UIMLTextArea());
  779. addKnownElement(new UIMLTable());
  780. addKnownElement(new UIMLFrame());
  781. }
  782. // Erstellt eine UIML View zu einem UIML Text
  783. // uiml: Ein xml element gemät des ksg uiml standarts
  784. UIMLView::UIMLView(XML::Element* uiml, UIInit& init)
  785. : UIMLView()
  786. {
  787. this->init = init;
  788. setUIML(uiml);
  789. }
  790. // Erstellt eine UIML View zu einem UIML Text
  791. // uiml: Ein xml text gemät des ksg uiml standarts
  792. UIMLView::UIMLView(Text uiml, UIInit& init)
  793. : UIMLView()
  794. {
  795. this->init = init;
  796. setUIML(uiml);
  797. }
  798. UIMLView::~UIMLView()
  799. {
  800. if (dom) dom->release();
  801. members->release();
  802. }
  803. // Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch aufgerufen.
  804. // me: Das Ereignis
  805. void UIMLView::doMausEreignis(MausEreignis& me, bool userRet)
  806. {
  807. if (dom)
  808. {
  809. bool verarbeitet = me.verarbeitet;
  810. me.verarbeitet |= hatStyleNicht(Style::Sichtbar);
  811. bool insideParent = me.insideParent;
  812. if (!hatStyle(Style::Sichtbar) || !me.insideParent || me.verarbeitet
  813. || me.mx < 0 || me.my < 0 || me.mx >= gr.x || me.my >= gr.y
  814. || !userRet)
  815. me.insideParent = 0;
  816. int rbr = 0;
  817. if (hatStyle(Style::Rahmen) && rahmen) rbr = rahmen->getRBreite();
  818. me.mx -= rbr;
  819. me.my -= rbr;
  820. if (hatStyle(Style::VScroll) && vertikalScrollBar)
  821. me.my += vertikalScrollBar->getScroll();
  822. if (hatStyle(Style::HScroll) && horizontalScrollBar)
  823. me.mx += horizontalScrollBar->getScroll();
  824. if (dom)
  825. {
  826. for (auto i = dom->getChilds(); i; i++)
  827. { // TODO render elements backwards
  828. Zeichnung* z = members->z(i->getAttributeValue("id"),
  829. i->getAttributeValue("id").getLength());
  830. if (z) z->doPublicMausEreignis(me);
  831. }
  832. }
  833. me.mx += rbr;
  834. me.my += rbr;
  835. if (hatStyle(Style::VScroll) && vertikalScrollBar)
  836. me.my -= vertikalScrollBar->getScroll();
  837. if (hatStyle(Style::HScroll) && horizontalScrollBar)
  838. me.mx -= horizontalScrollBar->getScroll();
  839. if (!hatStyle(Style::Sichtbar) || !me.insideParent || me.verarbeitet
  840. || me.mx < 0 || me.my < 0 || me.mx >= gr.x || me.my >= gr.y
  841. || !userRet)
  842. me.insideParent = insideParent;
  843. else
  844. me.verarbeitet = 1;
  845. if (hatStyleNicht(Style::Sichtbar)) me.verarbeitet = verarbeitet;
  846. }
  847. }
  848. //! entfernt alle bekannten elemente, die im uiml verwendet werden können
  849. void UIMLView::removeAllKnownElements()
  850. {
  851. knownElements.leeren();
  852. }
  853. //! fügt ein neues bekanntes element hinzu, dass danach im uiml verwendet werden
  854. //! kann.
  855. void UIMLView::addKnownElement(UIMLElement* element)
  856. {
  857. knownElements.add(element);
  858. }
  859. //! prüft, ob ein xml Element ein bekanntes uiml Element ist;
  860. bool UIMLView::isKnownElement(XML::Element* zElement)
  861. {
  862. for (UIMLElement* element : knownElements)
  863. {
  864. if (element->isApplicableFor(*zElement)) return 1;
  865. }
  866. return 0;
  867. }
  868. // setzt den inhalt der view
  869. // uiml: Ein xml element gemät des ksg uiml standarts
  870. void UIMLView::setUIML(XML::Element* uiml)
  871. {
  872. if (dom)
  873. { // update dom and members
  874. dom = uiml;
  875. update();
  876. }
  877. else
  878. { // initialize dom and members
  879. dom = uiml;
  880. for (auto i = dom->getChilds(); i; i++)
  881. {
  882. Zeichnung* z = parseElement(*i.val(), *this);
  883. if (z) z->release();
  884. }
  885. }
  886. }
  887. // setzt den inhalt der view
  888. // uiml: Ein xml text gemät des ksg uiml standarts
  889. void UIMLView::setUIML(Text uiml)
  890. {
  891. setUIML(new XML::Element(uiml));
  892. }
  893. // Gibt eine zeichnung zurück, welche in uiml eine bestimmte id hat
  894. // id: die id der Zeichnung
  895. Zeichnung* UIMLView::zZeichnungById(const char* id)
  896. {
  897. return members->z(id, textLength(id));
  898. }
  899. // Gibt eine zeichnung zurück, welche in uiml eine bestimmte id hat
  900. // id: die id der Zeichnung
  901. Zeichnung* UIMLView::getZeichnungById(const char* id)
  902. {
  903. return members->get(id, textLength(id));
  904. }
  905. void Framework::UIMLView::update()
  906. {
  907. for (auto i = dom->getChilds(); i; i++)
  908. {
  909. Text id = i->getAttributeValue("id");
  910. Zeichnung* z = zZeichnungById(id);
  911. if (!id.getLength() || !z || !updateElement(*i.val(), *z, *this))
  912. {
  913. if (z) removeZeichnung(*z);
  914. z = parseElement(*i.val(), *this);
  915. if (z) z->release();
  916. }
  917. }
  918. }
  919. // aktualisiert größe und position aller Zeichnungen gemäß den spezifikationen
  920. // in UIML
  921. void UIMLView::layout()
  922. {
  923. if (dom)
  924. {
  925. for (auto i = dom->getChilds(); i; i++)
  926. {
  927. Text id = i->getAttributeValue("id");
  928. Zeichnung* z = zZeichnungById(id);
  929. if (z)
  930. {
  931. layout(*i.val(),
  932. *z,
  933. this->getInnenBreite(),
  934. this->getInnenHeight(),
  935. *this);
  936. }
  937. }
  938. }
  939. }
  940. // fügt ein element hinzu
  941. // uiml: Ein xml text gemät des KSG UIML standarts, welcher das neue Objekt
  942. // darstellt
  943. Text UIMLView::addMember(Text uiml)
  944. {
  945. XML::Element* e = new XML::Element(uiml);
  946. Zeichnung* z = parseElement(*e, *this);
  947. if (z)
  948. {
  949. dom->addChildAtFront(e);
  950. z->release();
  951. }
  952. return e->getAttributeValue("id");
  953. }
  954. // fügt ein element zu einem Elternelement hinzu (funktioniert momentan nur mit
  955. // frame Objekten)
  956. // uiml: Ein xml text gemät des KSG UIML standarts, welcher das neue Objekt
  957. // darstellt
  958. Text UIMLView::addMember(Text uiml, Text parentId)
  959. {
  960. XML::Element* e = new XML::Element(uiml);
  961. XML::Editor ed = dom->selectChildren();
  962. while (ed.begin())
  963. {
  964. XML::Editor ed2 = ed.whereAttributeEquals("id", parentId);
  965. if (ed2.begin())
  966. {
  967. if (ed2.begin()->getName().istGleich("frame"))
  968. {
  969. Zeichnung* z = parseElement(*e, *this);
  970. if (z)
  971. {
  972. dynamic_cast<Fenster*>(
  973. members->z(parentId, parentId.getLength()))
  974. ->addMember(z);
  975. ed2.begin()->addChild(e);
  976. }
  977. return e->getAttributeValue("id");
  978. }
  979. }
  980. ed = ed.selectChildren();
  981. }
  982. e->release();
  983. return "";
  984. }
  985. // entfernt ein element
  986. // id: id des Elements
  987. void UIMLView::removeMember(Text id)
  988. {
  989. XML::Editor e = dom->selectChildsByAttribute("id", id);
  990. e.remove();
  991. members->remove(id, id.getLength());
  992. }
  993. // Verarbeitet ein Tastatur Ereignis. Wird vom Framework automatisch aufgerufen
  994. // te: Das Ereignis
  995. void UIMLView::doTastaturEreignis(TastaturEreignis& te)
  996. {
  997. bool verarbeitet = te.verarbeitet;
  998. ZeichnungHintergrund::doTastaturEreignis(te);
  999. te.verarbeitet = verarbeitet;
  1000. if (dom)
  1001. {
  1002. for (auto i = dom->getChilds(); i; i++)
  1003. { // TODO render elements backwards
  1004. Zeichnung* z = members->z(i->getAttributeValue("id"),
  1005. i->getAttributeValue("id").getLength());
  1006. if (z) z->doTastaturEreignis(te);
  1007. }
  1008. }
  1009. }
  1010. // Updated den Zeichenhintergrund
  1011. // tickVal: Die vergangene Zeit in Sekunden, die seit dem Letzten Aufruf dieser
  1012. // Funktion verstrichen ist return: 1, wenn das Bild neu gezeichnet werden
  1013. // muss. 0 sonnst
  1014. bool UIMLView::tick(double tickVal)
  1015. {
  1016. if (dom)
  1017. {
  1018. for (auto i = dom->getChilds(); i; i++)
  1019. { // TODO render elements backwards
  1020. Zeichnung* z = members->z(i->getAttributeValue("id"),
  1021. i->getAttributeValue("id").getLength());
  1022. if (z) rend |= z->tick(tickVal);
  1023. }
  1024. }
  1025. return ZeichnungHintergrund::tick(tickVal);
  1026. }
  1027. // Zeichnet den Hintergrund eines Zeichnunges nach rObj
  1028. void UIMLView::render(Bild& rObj)
  1029. {
  1030. if (hatStyle(Zeichnung::Style::Sichtbar))
  1031. {
  1032. ZeichnungHintergrund::render(rObj);
  1033. if (dom)
  1034. {
  1035. if (!rObj.setDrawOptions(pos.x + getRahmenBreite(),
  1036. pos.y + getRahmenBreite(),
  1037. gr.x + getRahmenBreite() * 2,
  1038. gr.y + getRahmenBreite() * 2))
  1039. return;
  1040. bool vSc = hatStyle(Style::VScroll) && vertikalScrollBar;
  1041. bool hSc = hatStyle(Style::HScroll) && horizontalScrollBar;
  1042. rObj.addScrollOffset(hSc ? horizontalScrollBar->getScroll() : 0,
  1043. vSc ? vertikalScrollBar->getScroll() : 0);
  1044. for (int i = dom->getChildCount() - 1; i >= 0; i--)
  1045. { // TODO render elements backwards
  1046. XML::Element* e = dom->zChild(i);
  1047. Zeichnung* z = members->z(e->getAttributeValue("id"),
  1048. e->getAttributeValue("id").getLength());
  1049. if (z) z->render(rObj);
  1050. }
  1051. rObj.releaseDrawOptions();
  1052. }
  1053. }
  1054. }
  1055. // Gibt den Dom Tree ohne erhöhten reference counter zurück
  1056. // Änderungen am Dom Tree sollten vermieden werden (nur änderungen von
  1057. // attributen einzelner elemente sind erlaubt)
  1058. XML::Element* UIMLView::zDom() const
  1059. {
  1060. return dom;
  1061. }
  1062. // Gibt den Dom Tree zurück
  1063. // Änderungen am Dom Tree sollten vermieden werden (nur änderungen von
  1064. // attributen einzelner elemente sind erlaubt)
  1065. XML::Element* UIMLView::getDom() const
  1066. {
  1067. return dom ? dynamic_cast<XML::Element*>(dom->getThis()) : 0;
  1068. }
  1069. bool UIMLView::isApplicableFor(XML::Element& element)
  1070. {
  1071. for (UIMLElement* e : knownElements)
  1072. {
  1073. if (e->isApplicableFor(element)) return 1;
  1074. }
  1075. return 0;
  1076. }
  1077. Zeichnung* UIMLView::parseElement(
  1078. XML::Element& element, UIMLContainer& generalFactory)
  1079. {
  1080. Text id;
  1081. if (element.hasAttribute("id"))
  1082. id = element.getAttributeValue("id");
  1083. else
  1084. {
  1085. id = Text("_") += nextId++;
  1086. element.setAttribute("id", id);
  1087. }
  1088. Zeichnung* z = members->z(id, id.getLength());
  1089. if (!z)
  1090. {
  1091. // precompute attributes
  1092. if (element.hasAttribute("margin"))
  1093. {
  1094. Text m = element.getAttributeValue("margin");
  1095. if (!element.hasAttribute("margin-left"))
  1096. element.setAttribute("margin-left", m);
  1097. if (!element.hasAttribute("margin-top"))
  1098. element.setAttribute("margin-top", m);
  1099. if (!element.hasAttribute("margin-right"))
  1100. element.setAttribute("margin-right", m);
  1101. if (!element.hasAttribute("margin-bottom"))
  1102. element.setAttribute("margin-bottom", m);
  1103. }
  1104. if (element.hasAttribute("class"))
  1105. {
  1106. Text c = element.getAttributeValue("class");
  1107. while (1)
  1108. {
  1109. Text* t;
  1110. if (c.hat(","))
  1111. t = c.getTeilText(0, c.positionVon(','));
  1112. else
  1113. t = new Text(c);
  1114. XML::Editor ce
  1115. = dom->selectChildsByName("class").whereAttributeEquals(
  1116. "id", *t);
  1117. for (auto i = ce.begin(); i; i++)
  1118. {
  1119. for (auto j = i->getAttributeNames(),
  1120. k = i->getAttributeValues();
  1121. j && k;
  1122. j++, k++)
  1123. {
  1124. if (!element.hasAttribute(j->getText()))
  1125. element.setAttribute(j->getText(), i->getText());
  1126. }
  1127. }
  1128. t->release();
  1129. if (c.hat(","))
  1130. c.remove(0, c.positionVon(',' + 1));
  1131. else
  1132. break;
  1133. }
  1134. }
  1135. if (element.hasAttribute("text-align"))
  1136. {
  1137. if (!element.hasAttribute("text-align-horizontal"))
  1138. element.setAttribute("text-align-horizontal",
  1139. element.getAttributeValue("text-align"));
  1140. if (!element.hasAttribute("text-align-vertical"))
  1141. element.setAttribute("text-align-vertical",
  1142. element.getAttributeValue("text-align"));
  1143. }
  1144. // create objects
  1145. for (UIMLElement* e : knownElements)
  1146. {
  1147. if (e->isApplicableFor(element))
  1148. {
  1149. z = e->parseElement(element, *this);
  1150. break;
  1151. }
  1152. }
  1153. if (z)
  1154. {
  1155. members->set(
  1156. id, id.getLength(), dynamic_cast<Zeichnung*>(z->getThis()));
  1157. idList.add(new Text(id));
  1158. memberList.add(z);
  1159. }
  1160. }
  1161. else
  1162. z->getThis();
  1163. return z;
  1164. }
  1165. bool Framework::UIMLView::updateElement(
  1166. XML::Element& element, Zeichnung& z, UIMLContainer& generalFactory)
  1167. {
  1168. for (UIMLElement* e : knownElements)
  1169. {
  1170. if (e->isApplicableFor(element))
  1171. {
  1172. return e->updateElement(element, z, *this);
  1173. }
  1174. }
  1175. return false;
  1176. }
  1177. void UIMLView::layout(XML::Element& element,
  1178. Zeichnung& z,
  1179. int pWidth,
  1180. int pHeight,
  1181. UIMLContainer& generalLayouter)
  1182. {
  1183. for (UIMLElement* e : knownElements)
  1184. {
  1185. if (e->isApplicableFor(element))
  1186. {
  1187. e->layout(element, z, pWidth, pHeight, *this);
  1188. break;
  1189. }
  1190. }
  1191. }
  1192. Text Framework::UIMLView::getZeichnungId(Zeichnung& z)
  1193. {
  1194. int index = memberList.getWertIndex(&z);
  1195. if (index >= 0) return *idList.z(index);
  1196. return "";
  1197. }
  1198. void Framework::UIMLView::removeZeichnung(Zeichnung& z)
  1199. {
  1200. int index = memberList.getWertIndex(&z);
  1201. if (index >= 0)
  1202. {
  1203. Text id = *idList.z(index);
  1204. idList.remove(index);
  1205. memberList.remove(index);
  1206. members->remove(id, id.getLength());
  1207. }
  1208. }
  1209. bool Framework::UIMLView::registerZeichnung(const char* id, Zeichnung* z)
  1210. {
  1211. Zeichnung* existing = members->z(id, textLength(id));
  1212. if (existing)
  1213. {
  1214. z->release();
  1215. return 0;
  1216. }
  1217. members->set(id, textLength(id), z);
  1218. return 1;
  1219. }
  1220. const UIInit& UIMLView::getFactory()
  1221. {
  1222. return init;
  1223. }
  1224. //! calculates the needed size for all content elements to be visible
  1225. Punkt UIMLView::calculateContentSize()
  1226. {
  1227. Punkt maxP(0, 0);
  1228. for (int i = dom->getChildCount() - 1; i >= 0; i--)
  1229. { // TODO render elements backwards
  1230. XML::Element* e = dom->zChild(i);
  1231. Zeichnung* z = members->z(
  1232. e->getAttributeValue("id"), e->getAttributeValue("id").getLength());
  1233. if (z)
  1234. {
  1235. maxP.x = MAX(maxP.x, z->getPosition().x + z->getBreite());
  1236. maxP.y = MAX(maxP.y, z->getPosition().y + z->getHeight());
  1237. }
  1238. }
  1239. maxP.x += 2 * getRahmenBreite();
  1240. maxP.y += 2 * getRahmenBreite();
  1241. return maxP;
  1242. }