UIMLView.cpp 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019
  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. generalLayouter.layout(*i.val(),
  197. *generalLayouter.zZeichnungById(i->getAttributeValue("id")),
  198. pWidth,
  199. pHeight,
  200. generalLayouter);
  201. }
  202. UIMLContainer::UIMLContainer()
  203. : UIMLElement()
  204. {}
  205. UIMLContainer::~UIMLContainer() {}
  206. UIMLTextField::UIMLTextField()
  207. : UIMLElement()
  208. {}
  209. bool UIMLTextField::isApplicableFor(XML::Element& element)
  210. {
  211. return element.getName().istGleich("textfield");
  212. }
  213. Zeichnung* UIMLTextField::parseElement(
  214. XML::Element& element, UIMLContainer& generalFactory)
  215. {
  216. TextFeld* t = generalFactory.getFactory().createTextFeld(
  217. generalFactory.getFactory().initParam);
  218. t->addStyle(TextFeld::Style::TextFeld);
  219. return t;
  220. }
  221. void UIMLTextField::layout(XML::Element& element,
  222. Zeichnung& z,
  223. int pWidth,
  224. int pHeight,
  225. UIMLContainer& generalLayouter)
  226. {
  227. z.setStyle(TextFeld::Style::HCenter,
  228. element.hasAttribute("text-align-horizontal")
  229. && element.getAttributeValue("text-align-horizontal")
  230. .istGleich("center"));
  231. z.setStyle(TextFeld::Style::VCenter,
  232. element.hasAttribute("text-align-vertical")
  233. && element.getAttributeValue("text-align-vertical")
  234. .istGleich("center"));
  235. if (element.hasAttribute("font-size"))
  236. ((TextFeld*)&z)
  237. ->setSchriftSize(
  238. (unsigned char)(int)element.getAttributeValue("font-size"));
  239. z.setStyle(TextFeld::Style::Editierbar,
  240. !element.hasAttribute("disabled")
  241. || (element.getAttributeValue("disabled").getLength() != 0
  242. && !element.getAttributeValue("disabled").istGleich("true")));
  243. ((TextFeld*)&z)->setText(element.getText());
  244. if (element.hasAttribute("width"))
  245. {
  246. Text w = element.getAttributeValue("width");
  247. if (w.istGleich("auto"))
  248. {
  249. z.setWidth(((TextFeld*)&z)->getNeededWidth());
  250. }
  251. }
  252. if (element.hasAttribute("height"))
  253. {
  254. Text h = element.getAttributeValue("height");
  255. if (h.istGleich("auto"))
  256. {
  257. z.setHeight(((TextFeld*)&z)->getNeededHeight());
  258. }
  259. }
  260. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  261. }
  262. UIMLButton::UIMLButton()
  263. : UIMLElement()
  264. {}
  265. bool UIMLButton::isApplicableFor(XML::Element& element)
  266. {
  267. return element.getName().istGleich("button");
  268. }
  269. Zeichnung* UIMLButton::parseElement(
  270. XML::Element& element, UIMLContainer& generalFactory)
  271. {
  272. Knopf* k = generalFactory.getFactory().createKnopf(
  273. generalFactory.getFactory().initParam);
  274. return k;
  275. }
  276. void UIMLButton::layout(XML::Element& element,
  277. Zeichnung& z,
  278. int pWidth,
  279. int pHeight,
  280. UIMLContainer& generalLayouter)
  281. {
  282. if (element.hasAttribute("font-size"))
  283. ((Knopf*)&z)
  284. ->setSchriftSize(
  285. (unsigned char)(int)element.getAttributeValue("font-size"));
  286. ((Knopf*)&z)->setText(element.getText());
  287. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  288. }
  289. UIMLCheck::UIMLCheck()
  290. : UIMLElement()
  291. {}
  292. bool UIMLCheck::isApplicableFor(XML::Element& element)
  293. {
  294. return element.getName().istGleich("check");
  295. }
  296. Zeichnung* UIMLCheck::parseElement(
  297. XML::Element& element, UIMLContainer& generalFactory)
  298. {
  299. KontrollKnopf* k = generalFactory.getFactory().createKontrollKnopf(
  300. generalFactory.getFactory().initParam);
  301. return k;
  302. }
  303. void UIMLCheck::layout(XML::Element& element,
  304. Zeichnung& z,
  305. int pWidth,
  306. int pHeight,
  307. UIMLContainer& generalLayouter)
  308. {
  309. ((KontrollKnopf*)&z)->setText(element.getText());
  310. ((KontrollKnopf*)&z)->setSText(element.getText());
  311. z.setStyle(
  312. KontrollKnopf::Style::Selected, element.hasAttribute("selected"));
  313. if (element.hasAttribute("font-size"))
  314. ((KontrollKnopf*)&z)
  315. ->setSSize(
  316. (unsigned char)(int)element.getAttributeValue("font-size"));
  317. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  318. }
  319. UIMLText::UIMLText()
  320. : UIMLElement()
  321. {}
  322. bool UIMLText::isApplicableFor(XML::Element& element)
  323. {
  324. return element.getName().istGleich("text");
  325. }
  326. Zeichnung* UIMLText::parseElement(
  327. XML::Element& element, UIMLContainer& generalFactory)
  328. {
  329. TextFeld* t = generalFactory.getFactory().createTextFeld(
  330. generalFactory.getFactory().initParam);
  331. t->addStyle(TextFeld::Style::Text);
  332. return t;
  333. }
  334. void UIMLText::layout(XML::Element& element,
  335. Zeichnung& z,
  336. int pWidth,
  337. int pHeight,
  338. UIMLContainer& generalLayouter)
  339. {
  340. z.setStyle(TextFeld::Style::HCenter,
  341. element.hasAttribute("text-align-horizontal")
  342. && element.getAttributeValue("text-align-horizontal")
  343. .istGleich("center"));
  344. z.setStyle(TextFeld::Style::VCenter,
  345. element.hasAttribute("text-align-vertical")
  346. && element.getAttributeValue("text-align-vertical")
  347. .istGleich("center"));
  348. if (element.hasAttribute("font-size"))
  349. ((TextFeld*)&z)
  350. ->setSchriftSize(
  351. (unsigned char)(int)element.getAttributeValue("font-size"));
  352. z.setStyle(TextFeld::Style::Editierbar,
  353. !element.hasAttribute("disabled")
  354. || (element.getAttributeValue("disabled").getLength() != 0
  355. && !element.getAttributeValue("disabled").istGleich("true")));
  356. ((TextFeld*)&z)->setText(element.getText());
  357. if (element.hasAttribute("width"))
  358. {
  359. Text w = element.getAttributeValue("width");
  360. if (w.istGleich("auto"))
  361. {
  362. z.setWidth(((TextFeld*)&z)->getNeededWidth());
  363. }
  364. }
  365. if (element.hasAttribute("height"))
  366. {
  367. Text h = element.getAttributeValue("height");
  368. if (h.istGleich("auto"))
  369. {
  370. z.setHeight(((TextFeld*)&z)->getNeededHeight());
  371. }
  372. }
  373. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  374. }
  375. UIMLTextArea::UIMLTextArea()
  376. : UIMLElement()
  377. {}
  378. bool UIMLTextArea::isApplicableFor(XML::Element& element)
  379. {
  380. return element.getName().istGleich("textarea");
  381. }
  382. Zeichnung* UIMLTextArea::parseElement(
  383. XML::Element& element, UIMLContainer& generalFactory)
  384. {
  385. TextFeld* t = generalFactory.getFactory().createTextFeld(
  386. generalFactory.getFactory().initParam);
  387. t->addStyle(TextFeld::Style::TextGebiet);
  388. return t;
  389. }
  390. void UIMLTextArea::layout(XML::Element& element,
  391. Zeichnung& z,
  392. int pWidth,
  393. int pHeight,
  394. UIMLContainer& generalLayouter)
  395. {
  396. z.setStyle(TextFeld::Style::HCenter,
  397. element.hasAttribute("text-align-horizontal")
  398. && element.getAttributeValue("text-align-horizontal")
  399. .istGleich("center"));
  400. z.setStyle(TextFeld::Style::VCenter,
  401. element.hasAttribute("text-align-vertical")
  402. && element.getAttributeValue("text-align-vertical")
  403. .istGleich("center"));
  404. if (element.hasAttribute("font-size"))
  405. ((TextFeld*)&z)
  406. ->setSchriftSize(
  407. (unsigned char)(int)element.getAttributeValue("font-size"));
  408. z.setStyle(TextFeld::Style::Editierbar,
  409. !element.hasAttribute("disabled")
  410. || (element.getAttributeValue("disabled").getLength() != 0
  411. && !element.getAttributeValue("disabled").istGleich("true")));
  412. ((TextFeld*)&z)->setText(element.getText());
  413. ((TextFeld*)&z)
  414. ->zTextRenderer()
  415. ->textFormatieren(((TextFeld*)&z)->zText(), z.getInnenBreite());
  416. if (element.hasAttribute("width"))
  417. {
  418. Text w = element.getAttributeValue("width");
  419. if (w.istGleich("auto"))
  420. {
  421. z.setWidth(((TextFeld*)&z)->getNeededWidth());
  422. }
  423. }
  424. if (element.hasAttribute("height"))
  425. {
  426. Text h = element.getAttributeValue("height");
  427. if (h.istGleich("auto"))
  428. {
  429. z.setHeight(((TextFeld*)&z)->getNeededHeight());
  430. }
  431. }
  432. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  433. }
  434. UIMLTable::UIMLTable()
  435. : UIMLElement()
  436. {}
  437. bool UIMLTable::isApplicableFor(XML::Element& element)
  438. {
  439. return element.getName().istGleich("table");
  440. }
  441. Zeichnung* UIMLTable::parseElement(
  442. XML::Element& element, UIMLContainer& generalFactory)
  443. {
  444. ObjTabelle* t = generalFactory.getFactory().createObjTabelle(
  445. generalFactory.getFactory().initParam);
  446. int index = 0;
  447. for (auto i = element.getChilds(); i; i++)
  448. {
  449. Text id;
  450. if (i->hasAttribute("id"))
  451. id = i->getAttributeValue("id");
  452. else
  453. {
  454. id = Text("_") += index++;
  455. i->setAttribute("id", id);
  456. }
  457. if (i->getName().istGleich("tr"))
  458. {
  459. t->addZeile(id);
  460. Text line = id;
  461. int c = 1;
  462. for (auto j = i->getChilds(); j; j++)
  463. {
  464. Zeichnung* z
  465. = generalFactory.parseElement(*i.val(), generalFactory);
  466. if (t->getSpaltenAnzahl() < c) t->addSpalte(Text(c - 1));
  467. if (z) t->setZeichnungZ(Text(c - 1), line, z);
  468. c++;
  469. }
  470. }
  471. }
  472. return t;
  473. }
  474. void UIMLTable::layout(XML::Element& element,
  475. Zeichnung& z,
  476. int pWidth,
  477. int pHeight,
  478. UIMLContainer& generalLayouter)
  479. {
  480. z.setStyle(ObjTabelle::Style::HScroll,
  481. element.hasAttribute("scroll")
  482. && element.getAttributeValue("scroll").istGleich("horizontal"));
  483. z.setStyle(ObjTabelle::Style::VScroll,
  484. element.hasAttribute("scroll")
  485. && element.getAttributeValue("scroll").istGleich("vertical"));
  486. z.setStyle(ObjTabelle::Style::scroll,
  487. element.hasAttribute("scroll")
  488. && element.getAttributeValue("scroll").istGleich("both"));
  489. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  490. ObjTabelle* objT = (ObjTabelle*)&z;
  491. if (objT->getZeilenAnzahl() > 0)
  492. {
  493. if (element.hasAttribute("line-height"))
  494. {
  495. int height = (int)element.getAttributeValue("line-height");
  496. for (int i = 0; i < objT->getZeilenAnzahl(); i++)
  497. objT->setZeilenHeight(i, height);
  498. }
  499. for (int i = 0; i < objT->getSpaltenAnzahl(); i++)
  500. {
  501. if (objT->zZeichnung(i, 0))
  502. objT->setSpaltenBreite(i, objT->zZeichnung(i, 0)->getBreite());
  503. }
  504. }
  505. }
  506. UIMLFrame::UIMLFrame()
  507. : UIMLElement()
  508. {}
  509. bool UIMLFrame::isApplicableFor(XML::Element& element)
  510. {
  511. return element.getName().istGleich("frame");
  512. }
  513. Zeichnung* UIMLFrame::parseElement(
  514. XML::Element& element, UIMLContainer& generalFactory)
  515. {
  516. Fenster* f = generalFactory.getFactory().createFenster(
  517. generalFactory.getFactory().initParam);
  518. for (auto i = element.getChilds(); i; i++)
  519. {
  520. Zeichnung* z = generalFactory.parseElement(*i.val(), generalFactory);
  521. if (z) f->addMember(z);
  522. }
  523. return f;
  524. }
  525. void UIMLFrame::layout(XML::Element& element,
  526. Zeichnung& z,
  527. int pWidth,
  528. int pHeight,
  529. UIMLContainer& generalLayouter)
  530. {
  531. if (element.hasAttribute("title"))
  532. ((Fenster*)&z)->setTitel(element.getAttributeValue("title"));
  533. if (element.hasAttribute("title-height"))
  534. ((Fenster*)&z)
  535. ->zTTextFeld()
  536. ->setSize(((Fenster*)&z)->zTTextFeld()->getBreite(),
  537. (int)element.getAttributeValue("title-height"));
  538. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  539. }
  540. // Erstellt eine UIML View
  541. UIMLView::UIMLView()
  542. : ZeichnungHintergrund()
  543. {
  544. style = Style::MEIgnoreInside | Style::MEIgnoreParentInside
  545. | Style::MEIgnoreSichtbar | Style::MEIgnoreVerarbeitet;
  546. members = new Trie<Zeichnung>();
  547. dom = 0;
  548. nextId = 0;
  549. memset(&init, 0, sizeof(UIInit));
  550. addKnownElement(new UIMLTextField());
  551. addKnownElement(new UIMLButton());
  552. addKnownElement(new UIMLCheck());
  553. addKnownElement(new UIMLText());
  554. addKnownElement(new UIMLTextArea());
  555. addKnownElement(new UIMLTable());
  556. addKnownElement(new UIMLFrame());
  557. }
  558. // Erstellt eine UIML View zu einem UIML Text
  559. // uiml: Ein xml element gemät des ksg uiml standarts
  560. UIMLView::UIMLView(XML::Element* uiml, UIInit& init)
  561. : UIMLView()
  562. {
  563. this->init = init;
  564. setUIML(uiml);
  565. }
  566. // Erstellt eine UIML View zu einem UIML Text
  567. // uiml: Ein xml text gemät des ksg uiml standarts
  568. UIMLView::UIMLView(Text uiml, UIInit& init)
  569. : UIMLView()
  570. {
  571. this->init = init;
  572. setUIML(uiml);
  573. }
  574. UIMLView::~UIMLView()
  575. {
  576. if (dom) dom->release();
  577. members->release();
  578. }
  579. // Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch aufgerufen.
  580. // me: Das Ereignis
  581. void UIMLView::doMausEreignis(MausEreignis& me, bool userRet)
  582. {
  583. if (dom)
  584. {
  585. bool verarbeitet = me.verarbeitet;
  586. me.verarbeitet |= hatStyleNicht(Style::Sichtbar);
  587. bool insideParent = me.insideParent;
  588. if (!hatStyle(Style::Sichtbar) || !me.insideParent || me.verarbeitet
  589. || me.mx < 0 || me.my < 0 || me.mx >= gr.x || me.my >= gr.y
  590. || !userRet)
  591. me.insideParent = 0;
  592. int rbr = 0;
  593. if (hatStyle(Style::Rahmen) && rahmen) rbr = rahmen->getRBreite();
  594. me.mx -= rbr;
  595. me.my -= rbr;
  596. if (hatStyle(Style::VScroll) && vertikalScrollBar)
  597. me.my += vertikalScrollBar->getScroll();
  598. if (hatStyle(Style::HScroll) && horizontalScrollBar)
  599. me.mx += horizontalScrollBar->getScroll();
  600. if (dom)
  601. {
  602. for (auto i = dom->getChilds(); i; i++)
  603. { // TODO render elements backwards
  604. Zeichnung* z = members->z(i->getAttributeValue("id"),
  605. i->getAttributeValue("id").getLength());
  606. if (z) z->doPublicMausEreignis(me);
  607. }
  608. }
  609. me.mx += rbr;
  610. me.my += rbr;
  611. if (hatStyle(Style::VScroll) && vertikalScrollBar)
  612. me.my -= vertikalScrollBar->getScroll();
  613. if (hatStyle(Style::HScroll) && horizontalScrollBar)
  614. me.mx -= horizontalScrollBar->getScroll();
  615. if (!hatStyle(Style::Sichtbar) || !me.insideParent || me.verarbeitet
  616. || me.mx < 0 || me.my < 0 || me.mx >= gr.x || me.my >= gr.y
  617. || !userRet)
  618. me.insideParent = insideParent;
  619. else
  620. me.verarbeitet = 1;
  621. if (hatStyleNicht(Style::Sichtbar)) me.verarbeitet = verarbeitet;
  622. }
  623. }
  624. //! entfernt alle bekannten elemente, die im uiml verwendet werden können
  625. void UIMLView::removeAllKnownElements()
  626. {
  627. knownElements.leeren();
  628. }
  629. //! fügt ein neues bekanntes element hinzu, dass danach im uiml verwendet werden
  630. //! kann.
  631. void UIMLView::addKnownElement(UIMLElement* element)
  632. {
  633. knownElements.add(element);
  634. }
  635. //! prüft, ob ein xml Element ein bekanntes uiml Element ist;
  636. bool UIMLView::isKnownElement(XML::Element* zElement)
  637. {
  638. for (UIMLElement* element : knownElements)
  639. {
  640. if (element->isApplicableFor(*zElement)) return 1;
  641. }
  642. return 0;
  643. }
  644. // setzt den inhalt der view
  645. // uiml: Ein xml element gemät des ksg uiml standarts
  646. void UIMLView::setUIML(XML::Element* uiml)
  647. {
  648. if (dom) dom->release();
  649. dom = uiml;
  650. members->leeren();
  651. nextId = 0;
  652. if (dom)
  653. {
  654. for (auto i = dom->getChilds(); i; i++)
  655. {
  656. Zeichnung* z = parseElement(*i.val(), *this);
  657. if (z) z->release();
  658. }
  659. }
  660. }
  661. // setzt den inhalt der view
  662. // uiml: Ein xml text gemät des ksg uiml standarts
  663. void UIMLView::setUIML(Text uiml)
  664. {
  665. setUIML(new XML::Element(uiml));
  666. }
  667. // Gibt eine zeichnung zurück, welche in uiml eine bestimmte id hat
  668. // id: die id der Zeichnung
  669. Zeichnung* UIMLView::zZeichnungById(const char* id)
  670. {
  671. return members->z(id, textLength(id));
  672. }
  673. // Gibt eine zeichnung zurück, welche in uiml eine bestimmte id hat
  674. // id: die id der Zeichnung
  675. Zeichnung* UIMLView::getZeichnungById(const char* id)
  676. {
  677. return members->get(id, textLength(id));
  678. }
  679. // aktualisiert größe und position aller Zeichnungen gemäß den spezifikationen
  680. // in UIML
  681. void UIMLView::layout()
  682. {
  683. if (dom)
  684. {
  685. for (auto i = dom->getChilds(); i; i++)
  686. {
  687. Text id = i->getAttributeValue("id");
  688. Zeichnung* z = zZeichnungById(id);
  689. if (z)
  690. {
  691. layout(*i.val(),
  692. *z,
  693. this->getInnenBreite(),
  694. this->getInnenHeight(),
  695. *this);
  696. }
  697. }
  698. }
  699. }
  700. // fügt ein element hinzu
  701. // uiml: Ein xml text gemät des KSG UIML standarts, welcher das neue Objekt
  702. // darstellt
  703. Text UIMLView::addMember(Text uiml)
  704. {
  705. XML::Element* e = new XML::Element(uiml);
  706. Zeichnung* z = parseElement(*e, *this);
  707. if (z)
  708. {
  709. dom->addChildAtFront(e);
  710. z->release();
  711. }
  712. return e->getAttributeValue("id");
  713. }
  714. // fügt ein element zu einem Elternelement hinzu (funktioniert momentan nur mit
  715. // frame Objekten)
  716. // uiml: Ein xml text gemät des KSG UIML standarts, welcher das neue Objekt
  717. // darstellt
  718. Text UIMLView::addMember(Text uiml, Text parentId)
  719. {
  720. XML::Element* e = new XML::Element(uiml);
  721. XML::Editor ed = dom->selectChildren();
  722. while (ed.begin())
  723. {
  724. XML::Editor ed2 = ed.whereAttributeEquals("id", parentId);
  725. if (ed2.begin())
  726. {
  727. if (ed2.begin()->getName().istGleich("frame"))
  728. {
  729. Zeichnung* z = parseElement(*e, *this);
  730. if (z)
  731. {
  732. dynamic_cast<Fenster*>(
  733. members->z(parentId, parentId.getLength()))
  734. ->addMember(z);
  735. ed2.begin()->addChild(e);
  736. }
  737. return e->getAttributeValue("id");
  738. }
  739. }
  740. ed = ed.selectChildren();
  741. }
  742. e->release();
  743. return "";
  744. }
  745. // entfernt ein element
  746. // id: id des Elements
  747. void UIMLView::removeMember(Text id)
  748. {
  749. XML::Editor e = dom->selectChildsByAttribute("id", id);
  750. e.remove();
  751. members->remove(id, id.getLength());
  752. }
  753. // Verarbeitet ein Tastatur Ereignis. Wird vom Framework automatisch aufgerufen
  754. // te: Das Ereignis
  755. void UIMLView::doTastaturEreignis(TastaturEreignis& te)
  756. {
  757. bool verarbeitet = te.verarbeitet;
  758. ZeichnungHintergrund::doTastaturEreignis(te);
  759. te.verarbeitet = verarbeitet;
  760. if (dom)
  761. {
  762. for (auto i = dom->getChilds(); i; i++)
  763. { // TODO render elements backwards
  764. Zeichnung* z = members->z(i->getAttributeValue("id"),
  765. i->getAttributeValue("id").getLength());
  766. if (z) z->doTastaturEreignis(te);
  767. }
  768. }
  769. }
  770. // Updated den Zeichenhintergrund
  771. // tickVal: Die vergangene Zeit in Sekunden, die seit dem Letzten Aufruf dieser
  772. // Funktion verstrichen ist return: 1, wenn das Bild neu gezeichnet werden
  773. // muss. 0 sonnst
  774. bool UIMLView::tick(double tickVal)
  775. {
  776. if (dom)
  777. {
  778. for (auto i = dom->getChilds(); i; i++)
  779. { // TODO render elements backwards
  780. Zeichnung* z = members->z(i->getAttributeValue("id"),
  781. i->getAttributeValue("id").getLength());
  782. if (z) rend |= z->tick(tickVal);
  783. }
  784. }
  785. return ZeichnungHintergrund::tick(tickVal);
  786. }
  787. // Zeichnet den Hintergrund eines Zeichnunges nach rObj
  788. void UIMLView::render(Bild& rObj)
  789. {
  790. if (hatStyle(Zeichnung::Style::Sichtbar))
  791. {
  792. ZeichnungHintergrund::render(rObj);
  793. if (dom)
  794. {
  795. if (!rObj.setDrawOptions(pos.x + getRahmenBreite(),
  796. pos.y + getRahmenBreite(),
  797. gr.x + getRahmenBreite() * 2,
  798. gr.y + getRahmenBreite() * 2))
  799. return;
  800. bool vSc = hatStyle(Style::VScroll) && vertikalScrollBar;
  801. bool hSc = hatStyle(Style::HScroll) && horizontalScrollBar;
  802. rObj.addScrollOffset(hSc ? horizontalScrollBar->getScroll() : 0,
  803. vSc ? vertikalScrollBar->getScroll() : 0);
  804. for (int i = dom->getChildCount() - 1; i >= 0; i--)
  805. { // TODO render elements backwards
  806. XML::Element* e = dom->zChild(i);
  807. Zeichnung* z = members->z(e->getAttributeValue("id"),
  808. e->getAttributeValue("id").getLength());
  809. if (z) z->render(rObj);
  810. }
  811. rObj.releaseDrawOptions();
  812. }
  813. }
  814. }
  815. // Gibt den Dom Tree ohne erhöhten reference counter zurück
  816. // Änderungen am Dom Tree sollten vermieden werden (nur änderungen von
  817. // attributen einzelner elemente sind erlaubt)
  818. XML::Element* UIMLView::zDom() const
  819. {
  820. return dom;
  821. }
  822. // Gibt den Dom Tree zurück
  823. // Änderungen am Dom Tree sollten vermieden werden (nur änderungen von
  824. // attributen einzelner elemente sind erlaubt)
  825. XML::Element* UIMLView::getDom() const
  826. {
  827. return dom ? dynamic_cast<XML::Element*>(dom->getThis()) : 0;
  828. }
  829. bool UIMLView::isApplicableFor(XML::Element& element)
  830. {
  831. for (UIMLElement* e : knownElements)
  832. {
  833. if (e->isApplicableFor(element)) return 1;
  834. }
  835. return 0;
  836. }
  837. Zeichnung* UIMLView::parseElement(
  838. XML::Element& element, UIMLContainer& generalFactory)
  839. {
  840. Text id;
  841. if (element.hasAttribute("id"))
  842. id = element.getAttributeValue("id");
  843. else
  844. {
  845. id = Text("_") += nextId++;
  846. element.setAttribute("id", id);
  847. }
  848. Zeichnung* z = members->z(id, id.getLength());
  849. if (!z)
  850. {
  851. // precompute attributes
  852. if (element.hasAttribute("margin"))
  853. {
  854. Text m = element.getAttributeValue("margin");
  855. if (!element.hasAttribute("margin-left"))
  856. element.setAttribute("margin-left", m);
  857. if (!element.hasAttribute("margin-top"))
  858. element.setAttribute("margin-top", m);
  859. if (!element.hasAttribute("margin-right"))
  860. element.setAttribute("margin-right", m);
  861. if (!element.hasAttribute("margin-bottom"))
  862. element.setAttribute("margin-bottom", m);
  863. }
  864. if (element.hasAttribute("class"))
  865. {
  866. Text c = element.getAttributeValue("class");
  867. while (1)
  868. {
  869. Text* t;
  870. if (c.hat(","))
  871. t = c.getTeilText(0, c.positionVon(','));
  872. else
  873. t = new Text(c);
  874. XML::Editor ce
  875. = dom->selectChildsByName("class").whereAttributeEquals(
  876. "id", *t);
  877. for (auto i = ce.begin(); i; i++)
  878. {
  879. for (auto j = i->getAttributeNames(),
  880. k = i->getAttributeValues();
  881. j && k;
  882. j++, k++)
  883. {
  884. if (!element.hasAttribute(j->getText()))
  885. element.setAttribute(j->getText(), i->getText());
  886. }
  887. }
  888. t->release();
  889. if (c.hat(","))
  890. c.remove(0, c.positionVon(',' + 1));
  891. else
  892. break;
  893. }
  894. }
  895. if (element.hasAttribute("text-align"))
  896. {
  897. if (!element.hasAttribute("text-align-horizontal"))
  898. element.setAttribute("text-align-horizontal",
  899. element.getAttributeValue("text-align"));
  900. if (!element.hasAttribute("text-align-vertical"))
  901. element.setAttribute("text-align-vertical",
  902. element.getAttributeValue("text-align"));
  903. }
  904. // create objects
  905. for (UIMLElement* e : knownElements)
  906. {
  907. if (e->isApplicableFor(element))
  908. {
  909. z = e->parseElement(element, *this);
  910. break;
  911. }
  912. }
  913. if (z)
  914. members->set(
  915. id, id.getLength(), dynamic_cast<Zeichnung*>(z->getThis()));
  916. }
  917. else
  918. z->getThis();
  919. return z;
  920. }
  921. void UIMLView::layout(XML::Element& element,
  922. Zeichnung& z,
  923. int pWidth,
  924. int pHeight,
  925. UIMLContainer& generalLayouter)
  926. {
  927. for (UIMLElement* e : knownElements)
  928. {
  929. if (e->isApplicableFor(element))
  930. {
  931. e->layout(element, z, pWidth, pHeight, *this);
  932. break;
  933. }
  934. }
  935. }
  936. const UIInit& UIMLView::getFactory()
  937. {
  938. return init;
  939. }
  940. //! calculates the needed size for all content elements to be visible
  941. Punkt UIMLView::calculateContentSize()
  942. {
  943. Punkt maxP(0, 0);
  944. for (int i = dom->getChildCount() - 1; i >= 0; i--)
  945. { // TODO render elements backwards
  946. XML::Element* e = dom->zChild(i);
  947. Zeichnung* z = members->z(
  948. e->getAttributeValue("id"), e->getAttributeValue("id").getLength());
  949. if (z)
  950. {
  951. maxP.x = MAX(maxP.x, z->getPosition().x + z->getBreite());
  952. maxP.y = MAX(maxP.y, z->getPosition().y + z->getHeight());
  953. }
  954. }
  955. maxP.x += 2 * getRahmenBreite();
  956. maxP.y += 2 * getRahmenBreite();
  957. return maxP;
  958. }