TextFeld.cpp 59 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871
  1. #include "TextFeld.h"
  2. #include <math.h>
  3. #include "AlphaFeld.h"
  4. #include "Bild.h"
  5. #include "Fenster.h"
  6. #include "Globals.h"
  7. #include "MausEreignis.h"
  8. #include "Rahmen.h"
  9. #include "Schrift.h"
  10. #include "Scroll.h"
  11. #include "TastaturEreignis.h"
  12. #include "Text.h"
  13. #include "ToolTip.h"
  14. using namespace Framework;
  15. #ifndef test
  16. # define test
  17. bool TextStyle::equals(const TextStyle& rhs)
  18. {
  19. return fontSize == rhs.fontSize && fontColor == rhs.fontColor
  20. && selectedColor == rhs.selectedColor
  21. && selectedBackcroundColor == rhs.selectedBackcroundColor
  22. && underlined == rhs.underlined && selected == rhs.selected
  23. && interactParam == rhs.interactParam
  24. && rendererIndex == rhs.rendererIndex;
  25. }
  26. #endif
  27. TextFeld::TextStyleManager::TextStyleManager()
  28. : ReferenceCounter(),
  29. renderer(new RCArray<TextRenderer>()),
  30. index(0),
  31. styleIndex(0),
  32. text(0)
  33. {
  34. current.beginIndex = 0;
  35. current.fontColor = 0xFFFFFFFF;
  36. current.fontSize = 12;
  37. current.selected = 0;
  38. current.selectedColor = 0xFFFFFFFF;
  39. current.selectedBackcroundColor = 0xFF0000FF;
  40. current.underlined = 0;
  41. current.interactParam = 0;
  42. current.rendererIndex = 0;
  43. textStyle.add(current);
  44. }
  45. TextFeld::TextStyleManager::~TextStyleManager()
  46. {
  47. if (renderer) renderer->release();
  48. if (text) text->release();
  49. }
  50. // Setzt den Style eines Textabschnittes
  51. // begin: die startposition des Abschnittes
  52. // end: die endposition des Abschnittes (nicht enthalten)
  53. void TextFeld::TextStyleManager::setTextStyle(
  54. int begin, int end, TextStyle style)
  55. {
  56. if (begin < 0 || begin > end || begin > text->getLength()) return;
  57. int sc = textStyle.getEintragAnzahl();
  58. int index = -1;
  59. TextStyle s = textStyle.get(0);
  60. // suche bis zur richtigen stelle im stylearray
  61. for (int i = 0; i < sc; i++)
  62. {
  63. if (textStyle.get(i).beginIndex >= begin)
  64. {
  65. index = i;
  66. if (textStyle.get(i).beginIndex > begin)
  67. s = textStyle.get(i - 1);
  68. else
  69. {
  70. s = textStyle.get(i);
  71. textStyle.remove(i);
  72. sc--;
  73. }
  74. break;
  75. }
  76. }
  77. style.beginIndex = begin;
  78. s.beginIndex = end;
  79. if (index < 0)
  80. { // hinten an styles anfügen
  81. textStyle.add(style);
  82. textStyle.add(s);
  83. }
  84. else
  85. { // in die mitte des style arrays einfügen
  86. textStyle.add(style, index);
  87. for (int i = index + 1; i < sc + 1; i++)
  88. { // styles entfernen die überschrieben wurden
  89. if (textStyle.get(i).beginIndex <= end
  90. && textStyle.get(i).beginIndex > begin)
  91. {
  92. s = textStyle.get(i);
  93. textStyle.remove(i);
  94. i--;
  95. sc--;
  96. }
  97. }
  98. s.beginIndex = end;
  99. textStyle.add(s, index + 1);
  100. }
  101. cleanupStyles();
  102. }
  103. // Entfernt einen Textabschnitt
  104. // begin: der index des ersten betroffenen zeichens
  105. // end: der index des ersten zeichens nach dem abschnitt
  106. void TextFeld::TextStyleManager::removeText(int begin, int end)
  107. {
  108. int sc = textStyle.getEintragAnzahl();
  109. for (int i = 1; i < sc; i++)
  110. {
  111. TextStyle s = textStyle.get(i);
  112. if (s.beginIndex >= begin && s.beginIndex < end)
  113. {
  114. textStyle.remove(i);
  115. i--;
  116. sc--;
  117. }
  118. if (s.beginIndex >= end)
  119. {
  120. s.beginIndex -= end - begin;
  121. textStyle.set(s, i);
  122. }
  123. }
  124. text->remove(begin, end);
  125. cleanupStyles();
  126. }
  127. // Fügt ein Text an einer bestimmten Position ein
  128. // pos: die position des neuen Textausschnitts
  129. // text: der neue Text
  130. void TextFeld::TextStyleManager::insertText(int pos, const char* text)
  131. {
  132. int len = textLength(text);
  133. this->text->insert(pos, text);
  134. int sc = textStyle.getEintragAnzahl();
  135. for (int i = 0; i < sc; i++)
  136. {
  137. TextStyle s = textStyle.get(i);
  138. if (s.beginIndex > pos)
  139. {
  140. s.beginIndex += len;
  141. textStyle.set(s, i);
  142. }
  143. }
  144. cleanupStyles();
  145. }
  146. // Entfernt nicht benötiegte gleiche styles
  147. void TextFeld::TextStyleManager::cleanupStyles()
  148. {
  149. int sc = textStyle.getEintragAnzahl();
  150. TextStyle last = textStyle.get(0);
  151. for (int i = 1; i < sc; i++)
  152. {
  153. if (textStyle.get(i).beginIndex == last.beginIndex)
  154. {
  155. last = textStyle.get(i);
  156. textStyle.remove(i - 1);
  157. i--;
  158. sc--;
  159. continue;
  160. }
  161. if (textStyle.get(i).equals(last)
  162. || (text && textStyle.get(i).beginIndex > text->getLength()))
  163. {
  164. textStyle.remove(i);
  165. i--;
  166. sc--;
  167. }
  168. else
  169. last = textStyle.get(i);
  170. }
  171. }
  172. // gibt eine referenz auf das style objekt zurück
  173. TextStyle& TextFeld::TextStyleManager::currentStyle()
  174. {
  175. return current;
  176. }
  177. // gibt den aktuellen text renderer zurück
  178. TextRenderer* TextFeld::TextStyleManager::zCurrentRenderer()
  179. {
  180. if (renderer->getEintragAnzahl() == 0) return 0;
  181. TextRenderer* tr = renderer->z(current.rendererIndex);
  182. if (!tr) tr = renderer->z(0);
  183. if (tr) tr->setSchriftSize(current.fontSize);
  184. return tr;
  185. }
  186. // ändert den inhalt des style objektes auf den style des nächsten zeichens
  187. bool TextFeld::TextStyleManager::nextStyle()
  188. {
  189. index++;
  190. if (textStyle.getEintragAnzahl() > styleIndex + 1
  191. && index >= textStyle.get(styleIndex + 1).beginIndex)
  192. current = textStyle.get(styleIndex++ + 1);
  193. return text && index < text->getLength();
  194. }
  195. // ändert den inhalt des style objektes auf den style des angegebenen zeichens
  196. // index: der Index des Zeichens zu dem gesprungen werden soll
  197. // gibt 0 zurück falls es das zeichen nicht gibt
  198. bool TextFeld::TextStyleManager::stepTo(int index)
  199. {
  200. resetIteration();
  201. while (this->index < index && nextStyle())
  202. ;
  203. return text && this->index == index;
  204. }
  205. // ändert den inhalt des style objektes auf den style des ersten zeichens
  206. void TextFeld::TextStyleManager::resetIteration()
  207. {
  208. index = 0;
  209. styleIndex = 0;
  210. current = textStyle.get(0);
  211. }
  212. // Gibt den Style eines bestimmten zeichens zurück
  213. // index: Der index des Zeichensf
  214. TextStyle TextFeld::TextStyleManager::getTextStyle(int index) const
  215. {
  216. TextStyle last = textStyle.get(0);
  217. int ind = 0;
  218. for (auto i = textStyle.begin(); i && ind <= index; ind++)
  219. {
  220. if (i._.beginIndex <= ind)
  221. {
  222. last = i;
  223. i++;
  224. }
  225. }
  226. return last;
  227. }
  228. // Inhalt der TextFeld Klasse aus TextFeld.h
  229. // Konstruktor
  230. TextFeld::TextFeld()
  231. : ZeichnungHintergrund(),
  232. tm(new TextStyleManager()),
  233. autoLineBreakSpacing(0),
  234. showChar(0),
  235. cpos(0),
  236. tickVal(0),
  237. mausKlick(0)
  238. {
  239. charEvent = 0;
  240. horizontalScrollBar = new HScrollBar();
  241. vertikalScrollBar = new VScrollBar();
  242. this->setMausEreignis(_ret1ME);
  243. this->setTastaturEreignis(_ret1TE);
  244. }
  245. // Destruktor
  246. TextFeld::~TextFeld()
  247. {
  248. tm->release();
  249. if (autoLineBreakSpacing) autoLineBreakSpacing->release();
  250. }
  251. void TextFeld::doMausEreignis(MausEreignis& me, bool userRet) // Maus Ereignis
  252. {
  253. if (!userRet) return;
  254. if (hatStyleNicht(Style::Editierbar))
  255. {
  256. int rbr = 0;
  257. if (rahmen) rbr = rahmen->getRBreite();
  258. if (((vertikalScrollBar && hatStyle(Style::VScroll))
  259. || (horizontalScrollBar && hatStyle(Style::HScroll)))
  260. && me.mx > rbr && me.mx < gr.x - rbr && me.my > rbr
  261. && me.my < gr.y - rbr)
  262. {
  263. me.verarbeitet |= vertikalScrollBar->doMausMessage(
  264. gr.x - rbr - 15, rbr, 15, gr.y - rbr * 2, me);
  265. me.verarbeitet |= horizontalScrollBar->doMausMessage(rbr,
  266. gr.y - rbr * 2 - 15,
  267. gr.x - rbr * 2
  268. - ((vertikalScrollBar && hatStyle(Style::VScroll)) ? 15
  269. : 0),
  270. 15,
  271. me);
  272. }
  273. if (me.mx >= 0 && me.mx <= gr.x && me.my >= 0 && me.my <= gr.y
  274. && !me.verarbeitet && hatStyle(Style::Sichtbar))
  275. {
  276. int scrollHi = (vertikalScrollBar && hatStyle(Style::VScroll))
  277. ? vertikalScrollBar->getScroll()
  278. : 0;
  279. int scrollBr = (horizontalScrollBar && hatStyle(Style::HScroll))
  280. ? horizontalScrollBar->getScroll()
  281. : 0;
  282. int xxx = me.mx - rbr + scrollBr;
  283. int yyy = me.my - rbr + scrollHi;
  284. int mausChar = getTextIndexAt(xxx, yyy);
  285. if (mausChar >= 0)
  286. {
  287. TextStyle s = tm->getTextStyle(mausChar);
  288. if (charEvent && s.interactParam)
  289. charEvent(mausChar, s.interactParam, me);
  290. }
  291. if (charEvent) me.verarbeitet = 1;
  292. }
  293. mausKlick = 0;
  294. return;
  295. }
  296. if (!me.verarbeitet)
  297. {
  298. if (hatStyleNicht(Style::Fokus))
  299. {
  300. mausKlick = 0;
  301. if (me.id == Framework::ME_PLinks) addStyle(Style::Fokus);
  302. }
  303. int rbr = 0;
  304. if (rahmen) rbr = rahmen->getRBreite();
  305. if (vertikalScrollBar && hatStyle(Style::VScroll))
  306. {
  307. if (vertikalScrollBar->doMausMessage(
  308. gr.x - rbr - 15, rbr, 15, gr.y - rbr * 2, me))
  309. {
  310. me.verarbeitet = 1;
  311. return;
  312. }
  313. }
  314. if (horizontalScrollBar && hatStyle(Style::HScroll))
  315. {
  316. if (horizontalScrollBar->doMausMessage(rbr,
  317. gr.y - rbr - 15,
  318. gr.x - rbr * 2
  319. - ((vertikalScrollBar && hatStyle(Style::VScroll)) ? 15
  320. : 0),
  321. 15,
  322. me))
  323. {
  324. me.verarbeitet = 1;
  325. return;
  326. }
  327. }
  328. bool shift = getTastenStand(T_Shift);
  329. bool strg = getTastenStand(T_Strg);
  330. int tbr = getTextWidth();
  331. int thi = getTextHeight();
  332. int scrollHi = (vertikalScrollBar && hatStyle(Style::VScroll))
  333. ? vertikalScrollBar->getScroll()
  334. : 0;
  335. int scrollBr = (horizontalScrollBar && hatStyle(Style::HScroll))
  336. ? horizontalScrollBar->getScroll()
  337. : 0;
  338. int xxx = me.mx - rbr + scrollBr;
  339. int yyy = me.my - rbr + scrollHi;
  340. int mausChar = getTextIndexAt(xxx, yyy);
  341. int scrollBreite = (vertikalScrollBar && hatStyle(Style::VScroll)) * 15;
  342. int scrollHeight
  343. = (horizontalScrollBar && hatStyle(Style::HScroll)) * 15;
  344. if (hatStyle(Style::HCenter))
  345. xxx -= (((gr.x - scrollBreite) / 2) - tbr / 2) - rbr;
  346. if (hatStyle(Style::VCenter) && hatStyleNicht(Style::VScroll))
  347. yyy -= (((gr.y - scrollHeight) / 2) - thi / 2) - rbr;
  348. if (mausChar >= 0)
  349. {
  350. TextStyle s = tm->getTextStyle(mausChar);
  351. if (charEvent) charEvent(mausChar, s.interactParam, me);
  352. }
  353. if (me.mx < gr.x - rbr - 15)
  354. {
  355. if (tm->renderer)
  356. {
  357. int ncpos = getCurserPosAt(xxx, yyy);
  358. if (me.id == Framework::ME_PLinks)
  359. {
  360. if (ncpos != -1)
  361. {
  362. if (shift && cpos != ncpos)
  363. addAuswahl(MIN(cpos, ncpos), MAX(cpos, ncpos));
  364. else if (!shift && !mausKlick && !strg)
  365. deselectAuswahl();
  366. cpos = ncpos;
  367. rend = 1;
  368. if (vertikalScrollBar && hatStyle(Style::VScroll))
  369. updateVScroll();
  370. if (horizontalScrollBar && hatStyle(Style::HScroll))
  371. updateHScroll();
  372. }
  373. mausKlick = 1;
  374. }
  375. if (me.id == ME_Bewegung && mausKlick)
  376. {
  377. if (ncpos != -1)
  378. {
  379. rend = 1;
  380. if (cpos != ncpos)
  381. invertAuswahl(MIN(cpos, ncpos), MAX(cpos, ncpos));
  382. cpos = ncpos;
  383. if (vertikalScrollBar && hatStyle(Style::VScroll))
  384. updateVScroll(cpos);
  385. if (horizontalScrollBar && hatStyle(Style::HScroll))
  386. updateHScroll(cpos);
  387. }
  388. }
  389. if (me.id == ME_RLinks)
  390. {
  391. if (ncpos != -1)
  392. {
  393. rend = 1;
  394. if (cpos != ncpos)
  395. invertAuswahl(MIN(cpos, ncpos), MAX(cpos, ncpos));
  396. cpos = ncpos;
  397. if (vertikalScrollBar && hatStyle(Style::VScroll))
  398. updateVScroll(cpos);
  399. if (horizontalScrollBar && hatStyle(Style::HScroll))
  400. updateHScroll(cpos);
  401. }
  402. mausKlick = 0;
  403. }
  404. }
  405. }
  406. }
  407. me.verarbeitet = 1;
  408. }
  409. int TextFeld::getTextHeight() const
  410. {
  411. if (!tm || !tm->text) return 0;
  412. tm->resetIteration();
  413. int th = 0;
  414. int len = tm->text->getLength();
  415. const char* text = tm->text->getText();
  416. Text txtWithLineBreaks;
  417. if (hatStyle(Style::AutoLineBreak))
  418. {
  419. txtWithLineBreaks = addLineBreaksToText(tm->text->getText(),
  420. autoLineBreakSpacing ? autoLineBreakSpacing->getText() : "");
  421. text = txtWithLineBreaks;
  422. len = txtWithLineBreaks.getLength();
  423. }
  424. int max = 0;
  425. int abstand = 0;
  426. for (int i = 0; i < len; i++)
  427. {
  428. if (text[i] == '\n')
  429. {
  430. th += max + abstand;
  431. abstand = 0;
  432. max = 0;
  433. tm->nextStyle();
  434. continue;
  435. }
  436. TextRenderer* r = tm->zCurrentRenderer();
  437. if (r)
  438. {
  439. int tmp = r->getZeilenHeight();
  440. max = max >= tmp ? max : tmp;
  441. if (max == tmp) abstand = r->getZeilenAbstand();
  442. }
  443. tm->nextStyle();
  444. }
  445. if (max > 0) th += max;
  446. return th;
  447. }
  448. int TextFeld::getTextWidth() const
  449. {
  450. if (!tm || !tm->text) return 0;
  451. tm->resetIteration();
  452. int maxBr = 0;
  453. int len = tm->text->getLength();
  454. const char* text = tm->text->getText();
  455. Text txtWithLineBreaks;
  456. if (hatStyle(Style::AutoLineBreak))
  457. {
  458. txtWithLineBreaks = addLineBreaksToText(tm->text->getText(),
  459. autoLineBreakSpacing ? autoLineBreakSpacing->getText() : "");
  460. text = txtWithLineBreaks;
  461. len = txtWithLineBreaks.getLength();
  462. }
  463. int lineBr = 0;
  464. char buff[] = {0, 0};
  465. for (int i = 0; i < len; i++)
  466. {
  467. buff[0] = text[i];
  468. if (text[i] == '\n')
  469. {
  470. maxBr = maxBr >= lineBr ? maxBr : lineBr;
  471. lineBr = 0;
  472. tm->nextStyle();
  473. continue;
  474. }
  475. TextRenderer* r = tm->zCurrentRenderer();
  476. if (r) lineBr += r->getTextBreite(buff);
  477. tm->nextStyle();
  478. }
  479. if (lineBr > 0) maxBr = maxBr >= lineBr ? maxBr : lineBr;
  480. return maxBr;
  481. }
  482. // charEvent: eine funktion die aufgerufen wird, wenn sich die maus auf einem
  483. // bestimmten zeichen befindet und der interactParam im style != 0 ist
  484. // aufruf: charEvent( charIndex, interactParam, mausEreignis );
  485. void TextFeld::setCharEvent(
  486. std::function<void(int, int, MausEreignis me)> charEvent)
  487. {
  488. this->charEvent = charEvent;
  489. }
  490. void TextFeld::setText(Text* txt) // setzt den angezeigten Text
  491. {
  492. lockZeichnung();
  493. if (!tm->text) tm->text = new Text();
  494. tm->text->setText(txt);
  495. if (hatStyle(Style::VScroll)) updateVScroll();
  496. if (hatStyle(Style::HScroll)) updateHScroll();
  497. unlockZeichnung();
  498. rend = 1;
  499. }
  500. void TextFeld::setTextZ(Text* txt) // setzt einen Zeiger zum angezeigten Text
  501. {
  502. lockZeichnung();
  503. if (tm->text) tm->text->release();
  504. tm->text = txt;
  505. if (hatStyle(Style::VScroll)) updateVScroll();
  506. if (hatStyle(Style::HScroll)) updateHScroll();
  507. rend = 1;
  508. unlockZeichnung();
  509. }
  510. void TextFeld::setText(const char* txt) // setzt den angezeigten Text
  511. {
  512. lockZeichnung();
  513. if (!tm->text) tm->text = new Text();
  514. tm->text->setText(txt);
  515. if (hatStyle(Style::VScroll)) updateVScroll();
  516. if (hatStyle(Style::HScroll)) updateHScroll();
  517. rend = 1;
  518. unlockZeichnung();
  519. }
  520. // setzt den Text mit styles
  521. // txt: der Text
  522. // format: \x1: aktiviert unterschtrich
  523. // \x2FF: setzt die schriftgröße für den folgenden text.
  524. // FF ist ein zweistelliger Hex Wert
  525. // \x3AARRGGBB: setzt die schriftfarbe.
  526. // AARRGGBB ist ein 8 stelliger hex wert mit jeweils zwei zeichen
  527. // für alpha, rot, grün n blau
  528. // \x4AARRGGBB: setzt die farbe des ausgewählten textes.
  529. // AARRGGBB ist ein 8 stelliger hex wert mit jeweils zwei zeichen
  530. // für alpha, rot, grün n blau
  531. // \x5AARRGGBB: setzt die hintergrundfarbe des ausgewählten textes.
  532. // AARRGGBB ist ein 8 stelliger hex wert mit jeweils zwei zeichen
  533. // für alpha, rot, grün n blau
  534. // \x6FF: setzt text renderer index.
  535. // FF ist ein zweistelliger Hex Wert
  536. // \x7: deaktiviert unterschtrich
  537. // \x8FFFFFFFF: set interact param.
  538. // FFFFFFFF ist ein 8 stelliger hex wert
  539. void TextFeld::setFormattedText(const char* txt)
  540. {
  541. lockZeichnung();
  542. if (!tm->text) tm->text = new Text();
  543. tm->textStyle.leeren();
  544. TextStyle current;
  545. current.beginIndex = 0;
  546. current.fontColor = 0xFFFFFFFF;
  547. current.fontSize = 12;
  548. current.selected = 0;
  549. current.selectedColor = 0xFFFFFFFF;
  550. current.selectedBackcroundColor = 0xFF0000FF;
  551. current.underlined = 0;
  552. current.interactParam = 0;
  553. current.rendererIndex = 0;
  554. tm->textStyle.add(current);
  555. Text result = "";
  556. for (int i = 0; 1; i++)
  557. {
  558. bool br = 0;
  559. current.beginIndex = result.getLength();
  560. switch (txt[i])
  561. {
  562. case 0:
  563. br = 1;
  564. break;
  565. case 1:
  566. current.underlined = 1;
  567. tm->textStyle.add(current);
  568. break;
  569. case 2:
  570. {
  571. Text p = "0x";
  572. p.append(txt + i + 1, 2);
  573. current.fontSize = (unsigned char)(int)p;
  574. tm->textStyle.add(current);
  575. i += 2;
  576. break;
  577. }
  578. case 3:
  579. {
  580. Text p = "0x";
  581. p.append(txt + i + 1, 8);
  582. current.fontColor = (int)p;
  583. tm->textStyle.add(current);
  584. i += 8;
  585. }
  586. break;
  587. case 4:
  588. {
  589. Text p = "0x";
  590. p.append(txt + i + 1, 8);
  591. current.selectedColor = (int)p;
  592. tm->textStyle.add(current);
  593. i += 8;
  594. break;
  595. }
  596. case 5:
  597. {
  598. Text p = "0x";
  599. p.append(txt + i + 1, 8);
  600. current.selectedBackcroundColor = (int)p;
  601. tm->textStyle.add(current);
  602. i += 8;
  603. break;
  604. }
  605. case 6:
  606. {
  607. Text p = "0x";
  608. p.append(txt + i + 1, 2);
  609. current.rendererIndex = (unsigned char)(int)p;
  610. tm->textStyle.add(current);
  611. i += 2;
  612. }
  613. break;
  614. case 7:
  615. current.underlined = 0;
  616. tm->textStyle.add(current);
  617. break;
  618. case 8:
  619. {
  620. Text p = "0x";
  621. p.append(txt + i + 1, 8);
  622. current.interactParam = (int)p;
  623. tm->textStyle.add(current);
  624. i += 8;
  625. }
  626. break;
  627. default:
  628. result.append(txt[i]);
  629. }
  630. if (br) break;
  631. }
  632. tm->text->setText(result);
  633. tm->cleanupStyles();
  634. if (hatStyle(Style::VScroll)) updateVScroll();
  635. if (hatStyle(Style::HScroll)) updateHScroll();
  636. rend = 1;
  637. unlockZeichnung();
  638. }
  639. // fügt zeilenumbrüche so ein, dass der text nicht die breite des textfeldes
  640. // überschreitet
  641. void TextFeld::addLineBreaks(const char* spacing)
  642. {
  643. if (!tm->text) return;
  644. setFormattedText(addLineBreaksToText(tm->text->getText(), spacing));
  645. }
  646. Text TextFeld::addLineBreaksToText(const char* txt, const char* spacing) const
  647. {
  648. int lastPos = -1;
  649. int lastPos2 = -1;
  650. int x = 0;
  651. Text result = "";
  652. int len = (int)strlen(txt);
  653. int maxBr = getBreite();
  654. if (hatStyle(Style::VScroll) && vertikalScrollBar) maxBr -= 15;
  655. tm->resetIteration();
  656. TextStyle last;
  657. last.beginIndex = 0;
  658. last.fontColor = 0xFFFFFFFF;
  659. last.fontSize = 12;
  660. last.selected = 0;
  661. last.selectedColor = 0xFFFFFFFF;
  662. last.selectedBackcroundColor = 0xFF0000FF;
  663. last.underlined = 0;
  664. last.interactParam = 0;
  665. last.rendererIndex = 0;
  666. for (int i = 0; i < len; ++i)
  667. {
  668. if (last.fontSize != tm->current.fontSize)
  669. {
  670. Text param("\x2");
  671. param.appendHex((char)tm->current.fontSize);
  672. result += param;
  673. last.fontSize = tm->current.fontSize;
  674. }
  675. if (last.fontColor != tm->current.fontColor)
  676. {
  677. Text param("\x3");
  678. param.appendHex(tm->current.fontColor);
  679. result += param;
  680. last.fontColor = tm->current.fontColor;
  681. }
  682. if (last.selectedColor != tm->current.selectedColor)
  683. {
  684. Text param("\x4");
  685. param.appendHex(tm->current.selectedColor);
  686. result += param;
  687. last.selectedColor = tm->current.selectedColor;
  688. }
  689. if (last.selectedBackcroundColor != tm->current.selectedBackcroundColor)
  690. {
  691. Text param("\x5");
  692. param.appendHex(tm->current.selectedBackcroundColor);
  693. result += param;
  694. last.selectedBackcroundColor = tm->current.selectedBackcroundColor;
  695. }
  696. if (last.underlined != tm->current.underlined)
  697. {
  698. char tmp[2] = {tm->current.underlined ? (char)1 : (char)7, 0};
  699. result += tmp;
  700. last.underlined = tm->current.underlined;
  701. }
  702. if (last.interactParam != tm->current.interactParam)
  703. {
  704. Text param("\x8");
  705. param.appendHex(tm->current.interactParam);
  706. result += param;
  707. last.interactParam = tm->current.interactParam;
  708. }
  709. if (last.rendererIndex != tm->current.rendererIndex)
  710. {
  711. Text param("\x6");
  712. param.appendHex((char)tm->current.rendererIndex);
  713. result += param;
  714. last.rendererIndex = tm->current.rendererIndex;
  715. }
  716. if (txt[i] == ' ')
  717. {
  718. lastPos = i;
  719. lastPos2 = result.getLength();
  720. x += tm->zCurrentRenderer()->getTextBreite(" ");
  721. result += " ";
  722. tm->nextStyle();
  723. continue;
  724. }
  725. if (txt[i] == '\t')
  726. {
  727. lastPos = i;
  728. lastPos2 = result.getLength();
  729. x += tm->zCurrentRenderer()->getTextBreite("\t");
  730. result += "\t";
  731. tm->nextStyle();
  732. continue;
  733. }
  734. if (txt[i] == '\n')
  735. {
  736. x = 0;
  737. lastPos = -1;
  738. lastPos2 = -1;
  739. result += "\n";
  740. tm->nextStyle();
  741. continue;
  742. }
  743. char buff[2] = {txt[i], 0};
  744. x += tm->zCurrentRenderer()->getTextBreite(buff);
  745. result += buff;
  746. if (x > maxBr && lastPos > -1)
  747. {
  748. result.remove(lastPos2, result.getLength());
  749. result += "\n";
  750. result += spacing;
  751. x = tm->zCurrentRenderer()->getTextBreite(spacing);
  752. i = lastPos;
  753. tm->stepTo(lastPos);
  754. lastPos = -1;
  755. lastPos2 = -1;
  756. last = tm->currentStyle();
  757. }
  758. tm->nextStyle();
  759. }
  760. return result;
  761. }
  762. void TextFeld::setAutoLineBreakSpacing(const char* spacing)
  763. {
  764. if (!autoLineBreakSpacing) autoLineBreakSpacing = new Text();
  765. autoLineBreakSpacing->setText(spacing);
  766. }
  767. // Setzt den Style eines Textabschnittes
  768. // begin: die startposition des Abschnittes
  769. // end: die endposition des Abschnittes (nicht enthalten)
  770. void TextFeld::setTextStyle(int begin, int end, TextStyle style)
  771. {
  772. tm->setTextStyle(begin, end, style);
  773. }
  774. void TextFeld::addZeile(const char* zeile) // fügt Zeile An
  775. {
  776. if (tm->text)
  777. {
  778. Text* txt = new Text(zeile);
  779. if (zeile[txt->getLength() - 1] != '\n') txt->append("\n");
  780. TextRenderer* r = tm->renderer->z(0);
  781. if (tm->textStyle.get(tm->textStyle.getEintragAnzahl() - 1)
  782. .rendererIndex
  783. < tm->renderer->getEintragAnzahl())
  784. r = tm->renderer->z(
  785. tm->textStyle.get(tm->textStyle.getEintragAnzahl() - 1)
  786. .rendererIndex);
  787. if (r)
  788. {
  789. bool vs = vertikalScrollBar && hatStyle(Style::VScroll);
  790. int rbr = (rahmen && hatStyle(Style::Rahmen)) ? rahmen->getRBreite()
  791. : 0;
  792. r->setSchriftSize(
  793. tm->textStyle.get(tm->textStyle.getEintragAnzahl() - 1)
  794. .fontSize);
  795. r->textFormatieren(txt, gr.x - ((int)vs * 15) - rbr * 2);
  796. }
  797. lockZeichnung();
  798. tm->text->append(txt->getText());
  799. unlockZeichnung();
  800. txt->release();
  801. if (hatStyle(Style::VScroll)) updateVScroll();
  802. if (hatStyle(Style::HScroll)) updateHScroll();
  803. rend = 1;
  804. }
  805. }
  806. // Fügt eine Zeile an den Text an
  807. // zeile: Die neue Zeile
  808. // color: Die Farbe der Zeile
  809. void TextFeld::addZeile(const char* zeile, int color)
  810. {
  811. if (tm->text)
  812. {
  813. Text* txt = new Text(zeile);
  814. if (zeile[txt->getLength() - 1] != '\n') txt->append("\n");
  815. TextRenderer* r = tm->renderer->z(0);
  816. if (tm->textStyle.get(tm->textStyle.getEintragAnzahl() - 1)
  817. .rendererIndex
  818. < tm->renderer->getEintragAnzahl())
  819. r = tm->renderer->z(
  820. tm->textStyle.get(tm->textStyle.getEintragAnzahl() - 1)
  821. .rendererIndex);
  822. if (r)
  823. {
  824. bool vs = vertikalScrollBar && hatStyle(Style::VScroll);
  825. int rbr = (rahmen && hatStyle(Style::Rahmen)) ? rahmen->getRBreite()
  826. : 0;
  827. r->setSchriftSize(
  828. tm->textStyle.get(tm->textStyle.getEintragAnzahl() - 1)
  829. .fontSize);
  830. r->textFormatieren(txt, gr.x - ((int)vs * 15) - rbr * 2);
  831. }
  832. lockZeichnung();
  833. tm->text->append(txt->getText());
  834. setSchriftFarbe(tm->text->getLength() - txt->getLength(),
  835. tm->text->getLength(),
  836. color);
  837. unlockZeichnung();
  838. txt->release();
  839. if (hatStyle(Style::VScroll)) updateVScroll();
  840. if (hatStyle(Style::HScroll)) updateHScroll();
  841. rend = 1;
  842. }
  843. }
  844. // Deselectiert alle textabschnitte
  845. void TextFeld::deselectAuswahl()
  846. {
  847. for (int i = 0; i < tm->textStyle.getEintragAnzahl(); i++)
  848. {
  849. TextStyle s = tm->textStyle.get(i);
  850. if (s.selected)
  851. {
  852. s.selected = 0;
  853. tm->textStyle.set(s, i);
  854. }
  855. }
  856. tm->cleanupStyles();
  857. }
  858. void TextFeld::setAuswahl(int pos1, int pos2) // setzt den Ausgewählten Text
  859. {
  860. deselectAuswahl();
  861. TextStyle s = tm->getTextStyle(pos1);
  862. s.selected = 1;
  863. tm->setTextStyle(pos1, pos2, s);
  864. }
  865. void TextFeld::setAuswahl(Punkt& auswahl)
  866. {
  867. deselectAuswahl();
  868. TextStyle s = tm->getTextStyle(auswahl.x);
  869. s.selected = 1;
  870. tm->setTextStyle(auswahl.x, auswahl.y, s);
  871. rend = 1;
  872. }
  873. void TextFeld::addAuswahl(int pos1, int pos2)
  874. {
  875. TextStyle s = tm->getTextStyle(pos1);
  876. s.selected = 1;
  877. tm->setTextStyle(pos1, pos2, s);
  878. }
  879. void TextFeld::addAuswahl(Punkt& auswahl)
  880. {
  881. TextStyle s = tm->getTextStyle(auswahl.x);
  882. s.selected = 1;
  883. tm->setTextStyle(auswahl.x, auswahl.y, s);
  884. rend = 1;
  885. }
  886. // Setzt den ausgewählten textabschnitt fest
  887. // begin: Die Cursorposition im Text
  888. // end: Die Position im Text, bis zu der der Text eingefärbt werden soll
  889. void TextFeld::invertAuswahl(int begin, int end)
  890. {
  891. for (int i = begin; i < end; i++)
  892. {
  893. TextStyle s = tm->getTextStyle(i);
  894. s.selected = !s.selected;
  895. tm->setTextStyle(i, i + 1, s);
  896. rend = 1;
  897. }
  898. }
  899. // ersetzt alle ausgewählten Textabschnitte mit einem text
  900. // text: der neue Text
  901. void TextFeld::replaceAuswahl(const char* text)
  902. {
  903. tm->cleanupStyles();
  904. int sa = tm->textStyle.getEintragAnzahl();
  905. int last = tm->text->getLength();
  906. int si = 0;
  907. for (int i = sa - 1; i >= 0; i--)
  908. {
  909. TextStyle s = tm->textStyle.get(i);
  910. si = i;
  911. if (s.selected)
  912. {
  913. if ((i > 0 && !tm->textStyle.get(i - 1).selected) || i == 0)
  914. {
  915. s.selected = false;
  916. tm->textStyle.set(s, si);
  917. tm->removeText(s.beginIndex, last);
  918. tm->insertText(s.beginIndex, text);
  919. }
  920. }
  921. else
  922. last = s.beginIndex;
  923. }
  924. }
  925. void TextFeld::setTextRendererZ(TextRenderer* textRd)
  926. {
  927. if (tm->renderer)
  928. tm->renderer->leeren();
  929. else
  930. tm->renderer = new RCArray<TextRenderer>();
  931. tm->renderer->add(textRd);
  932. rend = 1;
  933. }
  934. // Fügt einen TextRenderer hinzu
  935. // textRd: Der Textrenderer
  936. void TextFeld::addTextRendererZ(TextRenderer* textRd)
  937. {
  938. if (!tm->renderer) tm->renderer = new RCArray<TextRenderer>();
  939. tm->renderer->add(textRd);
  940. }
  941. // Setzt die verwendeten TextRenderer
  942. // textRd: Die Textrenderer
  943. void TextFeld::setTextRendererZ(RCArray<TextRenderer>* textRd)
  944. {
  945. if (tm->renderer) tm->renderer->release();
  946. tm->renderer = textRd;
  947. }
  948. void TextFeld::setSchriftZ(Schrift* schrift) // setzt einen Zeiger zur Schrift
  949. {
  950. if (!tm->renderer) tm->renderer = new RCArray<TextRenderer>();
  951. if (!tm->renderer->getEintragAnzahl())
  952. tm->renderer->add(new TextRenderer(schrift));
  953. else
  954. tm->renderer->z(0)->setSchriftZ(schrift);
  955. rend = 1;
  956. }
  957. // Setzt einen Zeiger zur Schrift
  958. // rendererIndex: Der Index des Renderers dessen Schrift gesetzt werden soll
  959. // schrift: Die Schrift, die zum Textzeichnen verwendet werden soll.
  960. void TextFeld::setSchriftZ(int rendererIndex, Schrift* schrift)
  961. {
  962. if (!tm->renderer) tm->renderer = new RCArray<TextRenderer>();
  963. if (tm->renderer->getEintragAnzahl() <= rendererIndex)
  964. tm->renderer->add(new TextRenderer(schrift), rendererIndex);
  965. else
  966. tm->renderer->z(rendererIndex)->setSchriftZ(schrift);
  967. }
  968. void TextFeld::setSchriftSize(unsigned char gr) // setzt die Schriftgröße
  969. {
  970. TextStyle s = tm->textStyle.get(0);
  971. s.fontSize = gr;
  972. tm->textStyle.set(s, 0);
  973. rend = 1;
  974. }
  975. // Setzt die Schriftgröße (Standart: 12)
  976. // begin: Der Index des ersten betroffenen Zeichens
  977. // end: Der Index des ersten nicht betroffenen Zeichens
  978. // gr: Die Schriftgröße, die zum Textzeichnen verwendet werden soll
  979. void TextFeld::setSchriftSize(int begin, int end, unsigned char gr)
  980. {
  981. TextStyle s = tm->getTextStyle(begin);
  982. s.fontSize = gr;
  983. tm->setTextStyle(begin, end, s);
  984. rend = 1;
  985. }
  986. void TextFeld::setSchriftFarbe(int fc) // setzt die Schrift Farbe
  987. {
  988. TextStyle s = tm->textStyle.get(0);
  989. s.fontColor = fc;
  990. tm->textStyle.set(s, 0);
  991. rend = 1;
  992. }
  993. // Setzt die Schrift Farbe
  994. // begin: Der Index des ersten betroffenen Zeichens
  995. // end: Der Index des ersten nicht betroffenen Zeichens
  996. // fc: Die Farbe, die zum Textzeichnen verwendet werden soll
  997. void TextFeld::setSchriftFarbe(int begin, int end, int fc)
  998. {
  999. TextStyle s = tm->getTextStyle(begin);
  1000. s.fontColor = fc;
  1001. tm->setTextStyle(begin, end, s);
  1002. rend = 1;
  1003. }
  1004. void TextFeld::setSchowChar(unsigned char c) // bei Passwortfeld *
  1005. {
  1006. showChar = c;
  1007. rend = 1;
  1008. }
  1009. void TextFeld::setVScrollZuZeile(int zeile) // scrollt zur Zeile
  1010. {
  1011. if (vertikalScrollBar && tm->renderer && tm->renderer->getEintragAnzahl()
  1012. && tm->text && hatStyle(Style::Mehrzeilig))
  1013. {
  1014. lockZeichnung();
  1015. tm->resetIteration();
  1016. int len = tm->text->getLength();
  1017. int y = 0;
  1018. int lnum = 0;
  1019. const char* text = tm->text->getText();
  1020. Text txtWithLineBreaks;
  1021. if (hatStyle(Style::AutoLineBreak))
  1022. {
  1023. txtWithLineBreaks = addLineBreaksToText(tm->text->getText(),
  1024. autoLineBreakSpacing ? autoLineBreakSpacing->getText() : "");
  1025. text = txtWithLineBreaks;
  1026. len = txtWithLineBreaks.getLength();
  1027. }
  1028. int max = 0;
  1029. for (int i = 0; i < len && lnum < zeile; i++)
  1030. {
  1031. if (text[i] == '\n')
  1032. {
  1033. lnum++;
  1034. y += max;
  1035. max = 0;
  1036. tm->nextStyle();
  1037. continue;
  1038. }
  1039. TextRenderer* r = tm->zCurrentRenderer();
  1040. if (r)
  1041. {
  1042. int tmp = r->getZeilenAbstand() + r->getZeilenHeight();
  1043. max = max >= tmp ? max : tmp;
  1044. }
  1045. tm->nextStyle();
  1046. }
  1047. unlockZeichnung();
  1048. vertikalScrollBar->scroll(y);
  1049. rend = 1;
  1050. }
  1051. }
  1052. void TextFeld::updateVScroll(int pos) // scrollt nach unten
  1053. {
  1054. if (pos == -1) pos = cpos;
  1055. if (vertikalScrollBar)
  1056. {
  1057. int sPos = 0;
  1058. int hi = 0;
  1059. int sPosZH = 0;
  1060. if (tm->text && tm->renderer)
  1061. {
  1062. if (hatStyleNicht(Style::Mehrzeilig)) tm->text->remove('\n');
  1063. hi = gr.y;
  1064. if (hatStyle(Style::Rahmen) && rahmen)
  1065. hi -= rahmen->getRBreite() * 2;
  1066. if (hatStyle(Style::HScroll) && horizontalScrollBar) hi -= 15;
  1067. int th = 0;
  1068. lockZeichnung();
  1069. tm->resetIteration();
  1070. int len = tm->text->getLength();
  1071. const char* text = tm->text->getText();
  1072. Text txtWithLineBreaks;
  1073. if (hatStyle(Style::AutoLineBreak))
  1074. {
  1075. txtWithLineBreaks = addLineBreaksToText(tm->text->getText(),
  1076. autoLineBreakSpacing ? autoLineBreakSpacing->getText()
  1077. : "");
  1078. text = txtWithLineBreaks;
  1079. len = txtWithLineBreaks.getLength();
  1080. }
  1081. int max = 0;
  1082. int lastMax = 0;
  1083. for (int i = 0; i < len; i++)
  1084. {
  1085. if (text[i] == '\n')
  1086. {
  1087. if (i <= pos)
  1088. {
  1089. sPos += max;
  1090. sPosZH = max;
  1091. }
  1092. th += max;
  1093. lastMax = max;
  1094. max = 0;
  1095. tm->nextStyle();
  1096. continue;
  1097. }
  1098. TextRenderer* r = tm->zCurrentRenderer();
  1099. if (r)
  1100. {
  1101. int tmp = r->getZeilenAbstand() + r->getZeilenHeight();
  1102. max = max >= tmp ? max : tmp;
  1103. }
  1104. tm->nextStyle();
  1105. }
  1106. if (max != lastMax && max > 0)
  1107. {
  1108. th += max;
  1109. lastMax = max;
  1110. }
  1111. th += lastMax;
  1112. unlockZeichnung();
  1113. vertikalScrollBar->update(th, hi);
  1114. }
  1115. if (sPos - sPosZH < vertikalScrollBar->getScroll())
  1116. vertikalScrollBar->scroll(sPos - sPosZH);
  1117. if (sPos + sPosZH > vertikalScrollBar->getScroll()
  1118. + vertikalScrollBar->getScrollData()->anzeige)
  1119. vertikalScrollBar->scroll(sPos + sPosZH * 2 - hi);
  1120. rend = 1;
  1121. }
  1122. }
  1123. void TextFeld::updateHScroll(int pos) // scrollt zur Curser Position
  1124. {
  1125. if (pos == -1) pos = cpos;
  1126. lockZeichnung();
  1127. if (horizontalScrollBar && tm->text && tm->renderer)
  1128. {
  1129. if (hatStyleNicht(Style::Mehrzeilig)) tm->text->remove('\n');
  1130. int br = gr.x;
  1131. if (hatStyle(Style::Rahmen) && rahmen) br -= rahmen->getRBreite() * 2;
  1132. if (hatStyle(Style::VScroll) && vertikalScrollBar) br -= 15;
  1133. tm->resetIteration();
  1134. int maxBr = 0;
  1135. int len = tm->text->getLength();
  1136. const char* text = tm->text->getText();
  1137. int lineBr = 0;
  1138. char buff[] = {0, 0};
  1139. int cbr = 0;
  1140. for (int i = 0; i < len; i++)
  1141. {
  1142. buff[0] = text[i];
  1143. if (text[i] == '\n')
  1144. {
  1145. maxBr = maxBr >= lineBr ? maxBr : lineBr;
  1146. lineBr = 0;
  1147. tm->nextStyle();
  1148. continue;
  1149. }
  1150. TextRenderer* r = tm->zCurrentRenderer();
  1151. if (r)
  1152. {
  1153. lineBr += r->getTextBreite(buff);
  1154. if (i <= pos) cbr = lineBr;
  1155. }
  1156. tm->nextStyle();
  1157. }
  1158. maxBr = maxBr >= lineBr ? maxBr : lineBr;
  1159. horizontalScrollBar->update(maxBr, br);
  1160. if (cbr > horizontalScrollBar->getScroll()
  1161. + horizontalScrollBar->getScrollData()->anzeige)
  1162. horizontalScrollBar->scroll(cbr - br);
  1163. if (cbr < horizontalScrollBar->getScroll())
  1164. horizontalScrollBar->scroll(cbr);
  1165. }
  1166. unlockZeichnung();
  1167. }
  1168. // Gibt die breite in pixeln zurück, die benötigt wird um den aktuellen text mit
  1169. // den aktuellen styles voll anzuzeigen
  1170. int TextFeld::getNeededWidth()
  1171. {
  1172. int maxBr = 0;
  1173. lockZeichnung();
  1174. if (tm->text && tm->renderer) maxBr = getTextWidth();
  1175. unlockZeichnung();
  1176. bool vs = vertikalScrollBar && hatStyle(Style::VScroll);
  1177. bool r = rahmen && hatStyle(Style::Rahmen);
  1178. return maxBr + (r ? rahmen->getRBreite() * 2 : 0) + (vs ? 15 : 0);
  1179. }
  1180. // Gibt die höhe in pixeln zurück, die benötigt wird um den aktuellen text mit
  1181. // den aktuellen styles voll anzuzeigen
  1182. int TextFeld::getNeededHeight()
  1183. {
  1184. int th = 0;
  1185. lockZeichnung();
  1186. if (tm->text && tm->renderer) th = getTextHeight();
  1187. unlockZeichnung();
  1188. bool hs = horizontalScrollBar && hatStyle(Style::HScroll);
  1189. bool r = rahmen && hatStyle(Style::Rahmen);
  1190. return th + (r ? rahmen->getRBreite() * 2 : 0) + (hs ? 15 : 0);
  1191. }
  1192. bool TextFeld::tick(double tickval) // tick
  1193. {
  1194. if (hatStyle(Style::Fokus))
  1195. {
  1196. if (tickVal < 0.5 && tickVal + tickval >= 0.5) rend = 1;
  1197. if (tickVal >= 0.5 && tickVal + tickval >= 1) rend = 1;
  1198. tickVal += tickval;
  1199. if (tickVal >= 1) tickVal -= 1;
  1200. }
  1201. return ZeichnungHintergrund::tick(tickval);
  1202. }
  1203. void TextFeld::doTastaturEreignis(TastaturEreignis& te)
  1204. {
  1205. bool ntakc = !te.verarbeitet;
  1206. if (te.verarbeitet || hatStyleNicht(Style::Fokus)) return;
  1207. if (!tak) return;
  1208. getThis();
  1209. if (tak(takParam, this, te))
  1210. {
  1211. if (hatStyleNicht(Style::Editierbar))
  1212. {
  1213. release();
  1214. return;
  1215. }
  1216. if (te.id == TE_Press)
  1217. {
  1218. bool shift = getTastenStand(T_Shift);
  1219. bool strg = getTastenStand(T_Strg);
  1220. switch (te.virtualKey)
  1221. {
  1222. case T_Entf:
  1223. if (!tm->getTextStyle(cpos).selected)
  1224. tm->removeText(cpos, cpos + 1);
  1225. else
  1226. {
  1227. cpos = tm->getTextStyle(cpos).beginIndex;
  1228. while (cpos > 0 && tm->getTextStyle(cpos - 1).selected)
  1229. cpos = tm->getTextStyle(cpos - 1).beginIndex;
  1230. }
  1231. replaceAuswahl("");
  1232. deselectAuswahl();
  1233. rend = 1;
  1234. break;
  1235. case T_BackSpace:
  1236. if (!tm->getTextStyle(cpos).selected)
  1237. {
  1238. tm->removeText(cpos - 1, cpos);
  1239. cpos--;
  1240. }
  1241. else
  1242. {
  1243. cpos = tm->getTextStyle(cpos).beginIndex;
  1244. while (cpos > 0 && tm->getTextStyle(cpos - 1).selected)
  1245. cpos = tm->getTextStyle(cpos - 1).beginIndex;
  1246. }
  1247. replaceAuswahl("");
  1248. deselectAuswahl();
  1249. rend = 1;
  1250. break;
  1251. case T_Enter:
  1252. if (hatStyle(TextFeld::Style::Mehrzeilig))
  1253. {
  1254. if (!tm->getTextStyle(cpos).selected)
  1255. tm->insertText(cpos, "\n");
  1256. else
  1257. {
  1258. cpos = tm->getTextStyle(cpos).beginIndex;
  1259. while (cpos > 0 && tm->getTextStyle(cpos - 1).selected)
  1260. cpos = tm->getTextStyle(cpos - 1).beginIndex;
  1261. }
  1262. replaceAuswahl("\n");
  1263. ++cpos;
  1264. rend = 1;
  1265. }
  1266. break;
  1267. case T_Links:
  1268. if (shift)
  1269. {
  1270. if (strg)
  1271. {
  1272. int tmp = tm->text->getLKick(cpos);
  1273. invertAuswahl(tmp, cpos);
  1274. cpos = tmp;
  1275. }
  1276. else
  1277. {
  1278. invertAuswahl(cpos - 1, cpos);
  1279. --cpos;
  1280. }
  1281. }
  1282. else
  1283. {
  1284. if (strg)
  1285. cpos = tm->text->getLKick(cpos);
  1286. else
  1287. --cpos;
  1288. deselectAuswahl();
  1289. }
  1290. rend = 1;
  1291. break;
  1292. case T_Oben:
  1293. {
  1294. int tmp = tm->text->getOKick(cpos);
  1295. invertAuswahl(tmp, cpos);
  1296. cpos = tmp;
  1297. if (!shift) deselectAuswahl();
  1298. rend = 1;
  1299. break;
  1300. }
  1301. case T_Rechts:
  1302. if (shift)
  1303. {
  1304. if (strg)
  1305. {
  1306. int tmp = tm->text->getRKick(cpos);
  1307. invertAuswahl(cpos, tmp);
  1308. cpos = tmp;
  1309. }
  1310. else
  1311. {
  1312. invertAuswahl(cpos, cpos + 1);
  1313. ++cpos;
  1314. }
  1315. }
  1316. else
  1317. {
  1318. if (strg)
  1319. cpos = tm->text->getRKick(cpos);
  1320. else
  1321. ++cpos;
  1322. deselectAuswahl();
  1323. }
  1324. rend = 1;
  1325. break;
  1326. case T_Unten:
  1327. {
  1328. int tmp = tm->text->getUKick(cpos);
  1329. invertAuswahl(cpos, tmp);
  1330. cpos = tmp;
  1331. if (!shift) deselectAuswahl();
  1332. rend = 1;
  1333. break;
  1334. }
  1335. default:
  1336. if (strg && te.id == TE_Press)
  1337. {
  1338. if (te.virtualKey == 'c' || te.virtualKey == 'C')
  1339. {
  1340. int sa = tm->textStyle.getEintragAnzahl();
  1341. int length = 0;
  1342. for (int i = 0; i < sa; i++)
  1343. {
  1344. TextStyle s = tm->textStyle.get(i);
  1345. if (s.selected)
  1346. {
  1347. int max = tm->text->getLength();
  1348. if (i < sa - 1)
  1349. max = tm->textStyle.get(i + 1).beginIndex;
  1350. length += max - s.beginIndex;
  1351. }
  1352. }
  1353. if (length)
  1354. {
  1355. char* txt = new char[length + 1];
  1356. txt[length] = 0;
  1357. int index = 0;
  1358. for (int i = 0; i < sa; i++)
  1359. {
  1360. TextStyle s = tm->textStyle.get(i);
  1361. if (s.selected)
  1362. {
  1363. int max = tm->text->getLength();
  1364. if (i < sa - 1)
  1365. max = tm->textStyle.get(i + 1)
  1366. .beginIndex;
  1367. memcpy(txt + index,
  1368. tm->text->getText() + s.beginIndex,
  1369. max - s.beginIndex);
  1370. index += max - s.beginIndex;
  1371. }
  1372. }
  1373. TextKopieren(txt);
  1374. delete[] txt;
  1375. }
  1376. else
  1377. TextKopieren(tm->text->getText());
  1378. }
  1379. if (te.virtualKey == 'v' || te.virtualKey == 'V')
  1380. {
  1381. const char* txt = TextInsert();
  1382. if (!tm->getTextStyle(cpos).selected)
  1383. tm->insertText(cpos, txt);
  1384. else
  1385. {
  1386. cpos = tm->getTextStyle(cpos).beginIndex;
  1387. while (
  1388. cpos > 0 && tm->getTextStyle(cpos - 1).selected)
  1389. cpos = tm->getTextStyle(cpos - 1).beginIndex;
  1390. }
  1391. replaceAuswahl(txt);
  1392. cpos += textLength(txt);
  1393. rend = 1;
  1394. }
  1395. break;
  1396. }
  1397. if (istSchreibbar(te.taste[0]))
  1398. {
  1399. if (!tm->getTextStyle(cpos).selected)
  1400. tm->insertText(cpos, te.taste);
  1401. else
  1402. {
  1403. cpos = tm->getTextStyle(cpos).beginIndex;
  1404. while (cpos > 0 && tm->getTextStyle(cpos - 1).selected)
  1405. cpos = tm->getTextStyle(cpos - 1).beginIndex;
  1406. }
  1407. replaceAuswahl(te.taste);
  1408. ++cpos;
  1409. rend = 1;
  1410. }
  1411. break;
  1412. }
  1413. }
  1414. if (cpos < 0) cpos = 0;
  1415. if (cpos > tm->text->getLength()) cpos = tm->text->getLength();
  1416. if (hatStyle(Style::VScroll)) updateVScroll(cpos);
  1417. if (hatStyle(Style::HScroll)) updateHScroll(cpos);
  1418. te.verarbeitet = 1;
  1419. }
  1420. if (ntakc && te.verarbeitet && nTak)
  1421. te.verarbeitet = nTak(ntakParam, this, te);
  1422. release();
  1423. }
  1424. void TextFeld::render(Bild& zRObj) // zeichenet nach zRObj
  1425. {
  1426. if (hatStyleNicht(Style::Sichtbar)) return;
  1427. ZeichnungHintergrund::render(zRObj);
  1428. if (!tm->text || !tm->renderer) return;
  1429. lockZeichnung();
  1430. if (!zRObj.setDrawOptions(innenPosition, innenSize))
  1431. {
  1432. unlockZeichnung();
  1433. return;
  1434. }
  1435. if (hatStyleNicht(Style::Mehrzeilig)) tm->text->remove('\n');
  1436. int tbr = getTextWidth();
  1437. int thi = getTextHeight();
  1438. int xxx = 0;
  1439. int yyy = 0;
  1440. int breite = innenSize.x;
  1441. int height = innenSize.y;
  1442. bool hs = horizontalScrollBar && hatStyle(Style::HScroll);
  1443. bool vs = vertikalScrollBar && hatStyle(Style::VScroll);
  1444. if (vs) yyy -= vertikalScrollBar->getScroll();
  1445. if (hs) xxx -= horizontalScrollBar->getScroll();
  1446. if (hatStyle(Style::HCenter) && !hs) xxx = (breite / 2) - tbr / 2;
  1447. int x = xxx;
  1448. int len = tm->text->getLength();
  1449. const char* text = tm->text->getText();
  1450. Text txtWithLineBreaks;
  1451. if (hatStyle(Style::AutoLineBreak))
  1452. {
  1453. txtWithLineBreaks = addLineBreaksToText(tm->text->getText(),
  1454. autoLineBreakSpacing ? autoLineBreakSpacing->getText() : "");
  1455. text = txtWithLineBreaks;
  1456. len = txtWithLineBreaks.getLength();
  1457. }
  1458. lockZeichnung();
  1459. tm->resetIteration();
  1460. if (thi == 0)
  1461. {
  1462. thi = tm->zCurrentRenderer()->getZeilenHeight();
  1463. }
  1464. if (hatStyle(Style::VCenter) && !vs) yyy = (height / 2) - thi / 2;
  1465. int y = yyy;
  1466. TextStyle& style = tm->currentStyle();
  1467. int maxLH = 0;
  1468. int corrector = 0;
  1469. int realLen = tm->text->getLength();
  1470. for (int i = 0; i <= len; i++)
  1471. {
  1472. int oldX = x;
  1473. if (i < len && tm->zCurrentRenderer())
  1474. tm->zCurrentRenderer()->renderChar(x,
  1475. y,
  1476. istSchreibbar(showChar) ? showChar : text[i],
  1477. zRObj,
  1478. style.selected ? style.selectedColor : style.fontColor,
  1479. style.underlined,
  1480. style.selected,
  1481. style.selectedBackcroundColor);
  1482. if (i - corrector == cpos && tickVal <= 0.5 && hatStyle(Style::Fokus)
  1483. && hatStyle(Style::Editierbar) && tm->zCurrentRenderer())
  1484. zRObj.drawLinieV(
  1485. oldX, y, tm->zCurrentRenderer()->getZeilenHeight(), 0xFFFF5555);
  1486. if (i >= realLen || text[i] != tm->text->getText()[i])
  1487. {
  1488. corrector++;
  1489. }
  1490. if (tm->zCurrentRenderer())
  1491. {
  1492. int tmp = tm->zCurrentRenderer()->getZeilenHeight()
  1493. + tm->zCurrentRenderer()->getZeilenAbstand();
  1494. maxLH = tmp > maxLH ? tmp : maxLH;
  1495. }
  1496. if (i < len && text[i] == '\n')
  1497. {
  1498. x = xxx;
  1499. y += maxLH;
  1500. }
  1501. tm->nextStyle();
  1502. }
  1503. unlockZeichnung();
  1504. zRObj.releaseDrawOptions();
  1505. unlockZeichnung();
  1506. }
  1507. // Konstant
  1508. Text* TextFeld::getText() const // gibt vom Text zurück
  1509. {
  1510. if (!tm->text) return 0;
  1511. return dynamic_cast<Text*>(tm->text->getThis());
  1512. }
  1513. Text* TextFeld::zText() const // gibt den Text zurück
  1514. {
  1515. return tm->text;
  1516. }
  1517. Schrift* TextFeld::getSchrift() const // gint getThis der Schrift Zurück
  1518. {
  1519. tm->resetIteration();
  1520. return tm->zCurrentRenderer() ? tm->zCurrentRenderer()->getSchrift() : 0;
  1521. }
  1522. Schrift* TextFeld::zSchrift() const // gibt die Schrift zurück
  1523. {
  1524. tm->resetIteration();
  1525. return tm->zCurrentRenderer() ? tm->zCurrentRenderer()->zSchrift() : 0;
  1526. }
  1527. // Gibt die Schrift zurück.
  1528. // rendererIndex: Der Index des Renderers dessen Schrift zurückgegeben werden
  1529. // soll return: 0, falls die Schrift nicht gesetzt wurde
  1530. Schrift* TextFeld::getSchrift(int rendererIndex) const
  1531. {
  1532. if (tm->renderer && tm->renderer->z(rendererIndex))
  1533. return tm->renderer->z(rendererIndex)->getSchrift();
  1534. return 0;
  1535. }
  1536. // Gibt die Schrift ohne erhöhten Reference Counter zurük
  1537. // rendererIndex: Der Index des Renderers dessen Schrift zurückgegeben werden
  1538. // soll return: 0, falls die Schrift nicht gesetzt wurde
  1539. Schrift* TextFeld::zSchrift(int rendererIndex) const
  1540. {
  1541. if (tm->renderer && tm->renderer->z(rendererIndex))
  1542. return tm->renderer->z(rendererIndex)->zSchrift();
  1543. return 0;
  1544. }
  1545. TextRenderer* TextFeld::getTextRenderer() const
  1546. {
  1547. tm->resetIteration();
  1548. return dynamic_cast<TextRenderer*>(tm->zCurrentRenderer()->getThis());
  1549. }
  1550. TextRenderer* TextFeld::zTextRenderer() const
  1551. {
  1552. tm->resetIteration();
  1553. return tm->zCurrentRenderer();
  1554. }
  1555. // Gibt den TextRenderer zurück.
  1556. // index: Der Index des Renderers der zurückgegeben werden soll
  1557. // return: 0, falls der TextRenderer nicht gesetzt wurde
  1558. TextRenderer* TextFeld::getTextRenderer(int index) const
  1559. {
  1560. if (tm->renderer && tm->renderer->z(index)) return tm->renderer->get(index);
  1561. return 0;
  1562. }
  1563. // Gibt dien TextRenderer ohne erhöhten Reference Counter zurük
  1564. // index: Der Index des Renderers der zurückgegeben werden soll
  1565. // return: 0, falls der TextRenderer nicht gesetzt wurde
  1566. TextRenderer* TextFeld::zTextRenderer(int index) const
  1567. {
  1568. if (tm->renderer && tm->renderer->z(index)) return tm->renderer->z(index);
  1569. return 0;
  1570. }
  1571. unsigned char TextFeld::getSchriftSize() const // gibt die Schriftgröße zurück
  1572. {
  1573. tm->resetIteration();
  1574. return tm->current.fontSize;
  1575. }
  1576. // Gibt die Schriftgröße zurück
  1577. // index: Der Index des Zeichens
  1578. unsigned char TextFeld::getSchriftSize(int index) const
  1579. {
  1580. tm->resetIteration();
  1581. return tm->current.fontSize;
  1582. }
  1583. int TextFeld::getSchriftFarbe() const // gibt getThis der Schriftfarbe zurück
  1584. {
  1585. tm->resetIteration();
  1586. return tm->current.fontColor;
  1587. }
  1588. // Gibt die Schriftfarbe im A8R8G8B8 Format zurück
  1589. // index: Der Index des Zeichens
  1590. int TextFeld::getSchriftFarbe(int index) const
  1591. {
  1592. return tm->getTextStyle(index).fontColor;
  1593. }
  1594. unsigned char TextFeld::getShowChar() const // gibt den Anzeige Char zurück
  1595. {
  1596. return showChar;
  1597. }
  1598. int TextFeld::getCursorPos() const
  1599. {
  1600. return cpos;
  1601. }
  1602. // Gibt 1 zurück wenn das Zeichen ausgewählt ist
  1603. // index: Der Index des Zeichens
  1604. bool TextFeld::isCharSelected(int index) const
  1605. {
  1606. return tm->getTextStyle(index).selected;
  1607. }
  1608. // Gibt den Index des Zeichens zurück, das sich unter der Maus befindet
  1609. // mx: die x position der maus relativ zur position des textfeldes
  1610. // my: die y position der maus relativ zut position des textfeldes
  1611. // return: -1, falls sich an der Position kein zeichen befindet
  1612. int TextFeld::getTextIndexAt(int mx, int my) const
  1613. {
  1614. if (!tm || !tm->text || !tm->zCurrentRenderer()) return -1;
  1615. int tbr = getTextWidth();
  1616. int thi = getTextHeight();
  1617. int xxx = 0;
  1618. int yyy = 0;
  1619. int breite = innenSize.x;
  1620. int height = innenSize.y;
  1621. bool hs = horizontalScrollBar && hatStyle(Style::HScroll);
  1622. bool vs = vertikalScrollBar && hatStyle(Style::VScroll);
  1623. if (vs) yyy -= vertikalScrollBar->getScroll();
  1624. if (hs) xxx -= horizontalScrollBar->getScroll();
  1625. if (hatStyle(Style::HCenter) && !hs) xxx = (breite / 2) - tbr / 2;
  1626. if (hatStyle(Style::VCenter) && !vs) yyy = (height / 2) - thi / 2;
  1627. int x = xxx;
  1628. int y = yyy;
  1629. int len = tm->text->getLength();
  1630. const char* text = tm->text->getText();
  1631. Text txtWithLineBreaks;
  1632. if (hatStyle(Style::AutoLineBreak))
  1633. {
  1634. txtWithLineBreaks = addLineBreaksToText(tm->text->getText(),
  1635. autoLineBreakSpacing ? autoLineBreakSpacing->getText() : "");
  1636. text = txtWithLineBreaks;
  1637. len = txtWithLineBreaks.getLength();
  1638. }
  1639. tm->resetIteration();
  1640. int corrector = 0;
  1641. int maxLH = 0;
  1642. int realLen = tm->text->getLength();
  1643. for (int i = 0; i < len; i++)
  1644. {
  1645. if (i >= realLen || text[i] != tm->text->getText()[i])
  1646. {
  1647. corrector++;
  1648. }
  1649. char buff[2] = {istSchreibbar(showChar) ? (char)showChar : text[i], 0};
  1650. int tmpx = tm->zCurrentRenderer()->getTextBreite(buff);
  1651. int tmpy = tm->zCurrentRenderer()->getZeilenHeight();
  1652. if (mx >= x && mx < x + tmpx && my >= y && my < y + tmpy)
  1653. return i - corrector;
  1654. if (mx < x + tmpx && my < y + tmpy) return -1;
  1655. x += tmpx;
  1656. tmpy += tm->zCurrentRenderer()->getZeilenAbstand();
  1657. maxLH = tmpy > maxLH ? tmpy : maxLH;
  1658. if (text[i] == '\n')
  1659. {
  1660. x = xxx;
  1661. y += maxLH;
  1662. }
  1663. tm->nextStyle();
  1664. }
  1665. return -1;
  1666. }
  1667. // Gibt den Index des Zeichens zurück, vor dem der curser gesetzt wird, wenn mit
  1668. // der maus geklickt wird
  1669. // mx: die x position der maus relativ zur position des textfeldes
  1670. // my: die y position der maus relativ zut position des textfeldes
  1671. int TextFeld::getCurserPosAt(int mx, int my) const
  1672. {
  1673. if (!tm || !tm->text || !tm->zCurrentRenderer())
  1674. return tm->text->getLength();
  1675. int tbr = getTextWidth();
  1676. int thi = getTextHeight();
  1677. int xxx = 0;
  1678. int yyy = 0;
  1679. int breite = innenSize.x;
  1680. int height = innenSize.y;
  1681. bool hs = horizontalScrollBar && hatStyle(Style::HScroll);
  1682. bool vs = vertikalScrollBar && hatStyle(Style::VScroll);
  1683. if (vs) yyy -= vertikalScrollBar->getScroll();
  1684. if (hs) xxx -= horizontalScrollBar->getScroll();
  1685. if (hatStyle(Style::HCenter) && !hs) xxx = (breite / 2) - tbr / 2;
  1686. if (hatStyle(Style::VCenter) && !vs) yyy = (height / 2) - thi / 2;
  1687. int x = xxx;
  1688. int y = yyy;
  1689. int len = tm->text->getLength();
  1690. const char* text = tm->text->getText();
  1691. Text txtWithLineBreaks;
  1692. if (hatStyle(Style::AutoLineBreak))
  1693. {
  1694. txtWithLineBreaks = addLineBreaksToText(tm->text->getText(),
  1695. autoLineBreakSpacing ? autoLineBreakSpacing->getText() : "");
  1696. text = txtWithLineBreaks;
  1697. len = txtWithLineBreaks.getLength();
  1698. }
  1699. tm->resetIteration();
  1700. int maxLH = 0;
  1701. int realLen = tm->text->getLength();
  1702. int corrector = 0;
  1703. for (int i = 0; i < len; i++)
  1704. {
  1705. if (i >= realLen || text[i] != tm->text->getText()[i])
  1706. {
  1707. corrector++;
  1708. }
  1709. int tmpx = tm->zCurrentRenderer()->getCharWidth(
  1710. istSchreibbar(showChar) ? showChar : text[i]);
  1711. int tmpy = tm->zCurrentRenderer()->getZeilenHeight()
  1712. + tm->zCurrentRenderer()->getZeilenAbstand();
  1713. if (mx < x + tmpx / 2
  1714. && my < y + tmpy - tm->zCurrentRenderer()->getZeilenAbstand() / 2)
  1715. return i - corrector;
  1716. x += tmpx + tm->zCurrentRenderer()->getZeichenAbstand();
  1717. maxLH = tmpy > maxLH ? tmpy : maxLH;
  1718. if (text[i] == '\n')
  1719. {
  1720. if (my >= y - tm->zCurrentRenderer()->getZeilenAbstand() / 2
  1721. && my < y + maxLH
  1722. - tm->zCurrentRenderer()->getZeilenAbstand() / 2)
  1723. return i - corrector;
  1724. x = xxx;
  1725. y += maxLH;
  1726. }
  1727. tm->nextStyle();
  1728. }
  1729. return tm->text->getLength();
  1730. }
  1731. // Gibt den Style eines bestimmten zeichens zurück
  1732. // index: Der index des Zeichensf
  1733. TextStyle TextFeld::getTextStyle(int index) const
  1734. {
  1735. return tm->getTextStyle(index);
  1736. }
  1737. // gibt die Zeichenkette zurück, die bei Verwendung des Styles
  1738. // AutoLineBreak nach jedem Zeilenumbruch eingefügt wird
  1739. Text TextFeld::getAutoLineBreakSpacing() const
  1740. {
  1741. return autoLineBreakSpacing ? *autoLineBreakSpacing : Text("");
  1742. }
  1743. Zeichnung* TextFeld::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
  1744. {
  1745. TextFeld* obj = new TextFeld();
  1746. obj->setPosition(pos);
  1747. obj->setSize(gr);
  1748. obj->setMausEreignisParameter(makParam);
  1749. obj->setTastaturEreignisParameter(takParam);
  1750. obj->setMausEreignis(mak);
  1751. obj->setTastaturEreignis(tak);
  1752. if (toolTip) obj->setToolTipZ((ToolTip*)toolTip->dublizieren());
  1753. obj->setStyle(style);
  1754. obj->tm->renderer->release();
  1755. obj->tm->renderer
  1756. = dynamic_cast<RCArray<TextRenderer>*>(tm->renderer->getThis());
  1757. obj->tm->textStyle.leeren();
  1758. for (const auto& i : tm->textStyle)
  1759. obj->tm->textStyle.add(i);
  1760. obj->tm->index = tm->index;
  1761. obj->tm->styleIndex = tm->styleIndex;
  1762. obj->tm->current = tm->current;
  1763. if (tm->text) obj->setText(tm->text->getText());
  1764. obj->setHintergrundFarbe(hintergrundFarbe);
  1765. if (hintergrundFeld)
  1766. obj->setAlphaFeldZ((AlphaFeld*)hintergrundFeld->dublizieren());
  1767. if (rahmen) obj->setRahmenZ((Rahmen*)rahmen->dublizieren());
  1768. if (hintergrundBild)
  1769. obj->setHintergrundBild(
  1770. dynamic_cast<Bild*>(hintergrundBild->getThis()));
  1771. if (vertikalScrollBar)
  1772. {
  1773. obj->setVertikalKlickScroll(vertikalScrollBar->getKlickScroll());
  1774. obj->setVertikalScrollPos(vertikalScrollBar->getScroll());
  1775. obj->setVertikalScrollFarbe(
  1776. vertikalScrollBar->getFarbe(), vertikalScrollBar->getBgFarbe());
  1777. }
  1778. if (horizontalScrollBar)
  1779. {
  1780. obj->setHorizontalKlickScroll(horizontalScrollBar->getKlickScroll());
  1781. obj->setHorizontalScrollPos(horizontalScrollBar->getScroll());
  1782. obj->setHorizontalScrollFarbe(
  1783. horizontalScrollBar->getFarbe(), horizontalScrollBar->getBgFarbe());
  1784. }
  1785. if (autoLineBreakSpacing)
  1786. {
  1787. obj->setAutoLineBreakSpacing(*autoLineBreakSpacing);
  1788. }
  1789. obj->setSchowChar(showChar);
  1790. return obj;
  1791. }