TextFeld.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835
  1. #include "TextFeld.h"
  2. #include "Schrift.h"
  3. #include "Text.h"
  4. #include "AlphaFeld.h"
  5. #include "Rahmen.h"
  6. #include "Bild.h"
  7. #include "TastaturEreignis.h"
  8. #include "MausEreignis.h"
  9. #include "Fenster.h"
  10. #include "Scroll.h"
  11. #include <math.h>
  12. #include "Globals.h"
  13. #include "ToolTip.h"
  14. #include "Scroll.h"
  15. using namespace Framework;
  16. // Inhalt der TextFeld Klasse aus TextFeld.h
  17. // Konstruktor
  18. TextFeld::TextFeld()
  19. : ZeichnungHintergrund(),
  20. schriftSize( 12 ),
  21. textRd( 0 ),
  22. text( 0 ),
  23. sF( 0xFF000000 ),
  24. showChar( 0 ),
  25. begf( 0 ),
  26. cpos( 0 ),
  27. tickVal( 0 ),
  28. mausKlick( 0 )
  29. {
  30. horizontalScrollBar = new HScrollBar();
  31. vertikalScrollBar = new VScrollBar();
  32. style = 0;
  33. this->setMausEreignis( _ret1ME );
  34. this->setTastaturEreignis( _ret1TE );
  35. }
  36. // Destruktor
  37. TextFeld::~TextFeld()
  38. {
  39. if( textRd )
  40. textRd->release();
  41. if( text )
  42. text->release();
  43. }
  44. // nicht constant
  45. void TextFeld::setText( Text *txt ) // setzt den angezeigten Text
  46. {
  47. lockZeichnung();
  48. if( !text )
  49. text = new Text();
  50. text->setText( txt );
  51. if( hatStyle( Style::VScroll ) )
  52. updateVScroll();
  53. if( hatStyle( Style::HScroll ) )
  54. updateHScroll();
  55. unlockZeichnung();
  56. rend = 1;
  57. }
  58. void TextFeld::setTextZ( Text *txt ) // setzt einen Zeiger zum angezeigten Text
  59. {
  60. lockZeichnung();
  61. if( text )
  62. text->release();
  63. text = txt;
  64. if( hatStyle( Style::VScroll ) )
  65. updateVScroll();
  66. if( hatStyle( Style::HScroll ) )
  67. updateHScroll();
  68. rend = 1;
  69. unlockZeichnung();
  70. }
  71. void TextFeld::setText( const char *txt ) // setzt den angezeigten Text
  72. {
  73. lockZeichnung();
  74. if( !text )
  75. text = new Text();
  76. text->setText( txt );
  77. if( hatStyle( Style::VScroll ) )
  78. updateVScroll();
  79. if( hatStyle( Style::HScroll ) )
  80. updateHScroll();
  81. rend = 1;
  82. unlockZeichnung();
  83. }
  84. void TextFeld::addZeile( const char *zeile ) // fügt Zeile An
  85. {
  86. if( text )
  87. {
  88. Text *txt = new Text( zeile );
  89. txt->append( "\n" );
  90. if( textRd )
  91. {
  92. bool vs = vertikalScrollBar && hatStyle( Style::VScroll );
  93. int rbr = ( rahmen && hatStyle( Style::Rahmen ) ) ? rahmen->getRBreite() : 0;
  94. textRd->setSchriftSize( schriftSize );
  95. textRd->textFormatieren( txt, gr.x - ( (int)vs * 15 ) - rbr * 2 );
  96. }
  97. lockZeichnung();
  98. text->append( txt->getText() );
  99. unlockZeichnung();
  100. txt->release();
  101. if( hatStyle( Style::VScroll ) )
  102. updateVScroll();
  103. if( hatStyle( Style::HScroll ) )
  104. updateHScroll();
  105. rend = 1;
  106. }
  107. }
  108. void TextFeld::setAuswahl( int pos1, int pos2 ) // setzt den Ausgewählten Text
  109. {
  110. cpos = pos1;
  111. begf = pos2;
  112. rend = 1;
  113. }
  114. void TextFeld::setAuswahl( Punkt &auswahl )
  115. {
  116. cpos = auswahl.x;
  117. begf = auswahl.y;
  118. rend = 1;
  119. }
  120. void TextFeld::setTextRendererZ( TextRenderer *textRd )
  121. {
  122. if( this->textRd )
  123. this->textRd->release();
  124. this->textRd = textRd;
  125. }
  126. void TextFeld::setSchriftZ( Schrift *schrift ) // setzt einen Zeiger zur Schrift
  127. {
  128. if( !this->textRd )
  129. textRd = new TextRenderer( schrift );
  130. else
  131. textRd->setSchriftZ( schrift );
  132. rend = 1;
  133. }
  134. void TextFeld::setSchriftSize( unsigned char gr ) // setzt die Schriftgröße
  135. {
  136. schriftSize = gr;
  137. rend = 1;
  138. }
  139. void TextFeld::setSchriftFarbe( int fc ) // setzt die Schrift Farbe
  140. {
  141. sF = fc;
  142. rend = 1;
  143. }
  144. void TextFeld::setSchowChar( unsigned char c ) // bei Passwortfeld *
  145. {
  146. showChar = c;
  147. rend = 1;
  148. }
  149. void TextFeld::setVScrollZuZeile( int zeile ) // scrollt zur Zeile
  150. {
  151. if( vertikalScrollBar && textRd && text && hatStyle( Style::Mehrzeilig ) )
  152. {
  153. textRd->setSchriftSize( schriftSize );
  154. Text t = "a";
  155. vertikalScrollBar->scroll( zeile * ( textRd->getZeilenabstand() + textRd->getTextHeight( t ) ) );
  156. rend = 1;
  157. }
  158. }
  159. void TextFeld::updateVScroll( int pos ) // scrollt nach unten
  160. {
  161. if( pos == -1 )
  162. pos = cpos;
  163. if( vertikalScrollBar )
  164. {
  165. int sPos = 0;
  166. int hi = 0;
  167. if( text && textRd )
  168. {
  169. if( hatStyleNicht( Style::Mehrzeilig ) )
  170. text->remove( '\n' );
  171. textRd->setSchriftSize( schriftSize );
  172. hi = gr.y;
  173. if( hatStyle( Style::Rahmen ) && rahmen )
  174. hi -= rahmen->getRBreite() * 2;
  175. if( hatStyle( Style::HScroll ) && horizontalScrollBar )
  176. hi -= 15;
  177. vertikalScrollBar->update( textRd->getTextHeight( text->getText() ) + schriftSize + textRd->getTextHeight( "a" ), hi );
  178. Text t;
  179. int zh = textRd->getTextHeight( t ) + textRd->getZeilenabstand();
  180. int l = text->getLength();
  181. for( int i = 0; i < l && ( i < pos || hatStyleNicht( Style::Erlaubt ) ); ++i )
  182. {
  183. if( text->getText()[ i ] == '\n' )
  184. sPos += zh;
  185. }
  186. }
  187. if( textRd )
  188. {
  189. if( sPos - textRd->getZeilenabstand() - textRd->getTextHeight( "a" ) < vertikalScrollBar->getScroll() )
  190. vertikalScrollBar->scroll( sPos - textRd->getZeilenabstand() - textRd->getTextHeight( "a" ) );
  191. if( sPos + textRd->getZeilenabstand() + textRd->getTextHeight( "a" ) > vertikalScrollBar->getScroll() + vertikalScrollBar->getScrollData()->anzeige )
  192. vertikalScrollBar->scroll( sPos + ( textRd->getZeilenabstand() + textRd->getTextHeight( "a" ) ) * 2 - hi );
  193. }
  194. rend = 1;
  195. }
  196. }
  197. void TextFeld::updateHScroll( int pos ) // scrollt zur Curser Position
  198. {
  199. if( pos == -1 )
  200. pos = cpos;
  201. if( horizontalScrollBar && text && textRd )
  202. {
  203. textRd->setSchriftSize( schriftSize );
  204. int br = gr.x;
  205. if( hatStyle( Style::Rahmen ) && rahmen )
  206. br -= rahmen->getRBreite() * 2;
  207. if( hatStyle( Style::VScroll ) && vertikalScrollBar )
  208. br -= 15;
  209. int maxBr = textRd->getTextBreite( text->getText() ) + schriftSize;
  210. horizontalScrollBar->update( maxBr, br );
  211. if( hatStyle( Style::Erlaubt ) && maxBr > br && pos > 0 && pos < text->getLength() )
  212. {
  213. int p1 = 0;
  214. char *tmp = text->getText();
  215. for( int i = 0; i < pos; i++, tmp++ )
  216. {
  217. if( *tmp == '\n' )
  218. p1 = i + 1;
  219. }
  220. Text *t = text->getTeilText( p1, pos );
  221. int cbr = textRd->getTextBreite( t->getText() );
  222. t->release();
  223. if( cbr + schriftSize > horizontalScrollBar->getScroll() + horizontalScrollBar->getScrollData()->anzeige )
  224. horizontalScrollBar->scroll( cbr + schriftSize - br );
  225. if( cbr - schriftSize < horizontalScrollBar->getScroll() )
  226. horizontalScrollBar->scroll( cbr - schriftSize );
  227. }
  228. }
  229. }
  230. bool TextFeld::tick( double tickval ) // tick
  231. {
  232. if( hatStyle( Style::Fokus ) )
  233. {
  234. if( tickVal < 0.5 && tickVal + tickval >= 0.5 )
  235. rend = 1;
  236. if( tickVal >= 0.5 && tickVal + tickval >= 1 )
  237. rend = 1;
  238. tickVal += tickval;
  239. if( tickVal >= 1 )
  240. tickVal -= 1;
  241. }
  242. return ZeichnungHintergrund::tick( tickval );
  243. }
  244. void TextFeld::doMausEreignis( MausEreignis &me ) // Maus Ereignis
  245. {
  246. bool nmakc = !me.verarbeitet;
  247. if( hatStyleNicht( Style::Erlaubt ) || hatStyleNicht( Style::Sichtbar ) )
  248. {
  249. if( toolTip )
  250. toolTip->setMausIn( 0 );
  251. me.mx -= pos.x, me.my -= pos.y;
  252. int rbr = 0;
  253. if( rahmen )
  254. rbr = rahmen->getRBreite();
  255. if( ( ( vertikalScrollBar && hatStyle( Style::VScroll ) ) ||
  256. ( horizontalScrollBar && hatStyle( Style::HScroll ) ) ) &&
  257. me.mx > rbr && me.mx < gr.x - rbr &&
  258. me.my > rbr && me.my < gr.y - rbr )
  259. {
  260. vertikalScrollBar->doMausMessage( gr.x - rbr - 15, rbr, 15, gr.y - rbr * 2, me );
  261. horizontalScrollBar->doMausMessage( rbr, gr.y - rbr * 2 - 15, gr.x - rbr * 2 - ( ( vertikalScrollBar && hatStyle( Style::VScroll ) ) ? 15 : 0 ), 15, me );
  262. me.verarbeitet = 1;
  263. }
  264. me.mx += pos.x, me.my += pos.y;
  265. mausKlick = 0;
  266. return;
  267. }
  268. bool removeFokus = 0;
  269. if( me.verarbeitet || !( me.mx >= pos.x && me.mx <= pos.x + gr.x && me.my >= pos.y && me.my <= pos.y + gr.y ) )
  270. {
  271. if( mausIn )
  272. {
  273. mausIn = 0;
  274. if( toolTip )
  275. toolTip->setMausIn( 0 );
  276. MausEreignis me2;
  277. me2.id = ME_Leaves;
  278. me2.mx = me.mx;
  279. me2.my = me.my;
  280. me2.verarbeitet = 0;
  281. doMausEreignis( me2 );
  282. return;
  283. }
  284. removeFokus = 1;
  285. }
  286. if( !( me.mx >= pos.x && me.mx <= pos.x + gr.x && me.my >= pos.y && me.my <= pos.y + gr.y ) && me.id != ME_Leaves )
  287. {
  288. if( removeFokus && me.id == ME_RLinks )
  289. {
  290. me.mx -= pos.x, me.my -= pos.y;
  291. if( hatStyle( Style::Fokus ) && mak && ( me.verarbeitet || mak( makParam, this, me ) ) )
  292. removeStyle( Style::Fokus );
  293. if( nmakc && me.verarbeitet && nMak )
  294. me.verarbeitet = nMak( nmakParam, this, me );
  295. me.mx += pos.x, me.my += pos.y;
  296. }
  297. if( toolTip )
  298. toolTip->setMausIn( 0 );
  299. return;
  300. }
  301. if( !mausIn && me.id != ME_Leaves )
  302. {
  303. mausIn = 1;
  304. if( toolTip )
  305. toolTip->setMausIn( 1 );
  306. MausEreignis me2;
  307. me2.id = ME_Betritt;
  308. me2.mx = me.mx;
  309. me2.my = me.my;
  310. me2.verarbeitet = 0;
  311. doMausEreignis( me2 );
  312. }
  313. me.mx -= pos.x, me.my -= pos.y;
  314. if( mak && ( me.verarbeitet || mak( makParam, this, me ) ) )
  315. {
  316. if( removeFokus && me.id == ME_RLinks )
  317. removeStyle( Style::Fokus );
  318. if( !me.verarbeitet )
  319. {
  320. if( hatStyleNicht( Style::Fokus ) )
  321. {
  322. mausKlick = 0;
  323. if( me.id == Framework::ME_PLinks )
  324. addStyle( Style::Fokus );
  325. }
  326. int rbr = 0;
  327. if( rahmen )
  328. rbr = rahmen->getRBreite();
  329. if( vertikalScrollBar && hatStyle( Style::VScroll ) )
  330. {
  331. if( vertikalScrollBar->doMausMessage( gr.x - rbr - 15, rbr, 15, gr.y - rbr * 2, me ) )
  332. {
  333. if( nmakc && me.verarbeitet && nMak )
  334. me.verarbeitet = nMak( nmakParam, this, me );
  335. me.mx += pos.x, me.my += pos.y;
  336. return;
  337. }
  338. }
  339. if( horizontalScrollBar && hatStyle( Style::HScroll ) )
  340. {
  341. if( horizontalScrollBar->doMausMessage( rbr, gr.y - rbr - 15, gr.x - rbr * 2 - ( ( vertikalScrollBar && hatStyle( Style::VScroll ) ) ? 15 : 0 ), 15, me ) )
  342. {
  343. if( nmakc && me.verarbeitet && nMak )
  344. me.verarbeitet = nMak( nmakParam, this, me );
  345. me.mx += pos.x, me.my += pos.y;
  346. return;
  347. }
  348. }
  349. if( me.mx < gr.x - rbr - 15 )
  350. {
  351. if( textRd )
  352. {
  353. textRd->setSchriftSize( schriftSize );
  354. bool shift = TastenStand[ T_Shift ];
  355. if( me.id == Framework::ME_PLinks )
  356. {
  357. int tbr = textRd->getTextBreite( text->getText() );
  358. int thi = textRd->getTextHeight( text->getText() );
  359. int scrollHi = ( vertikalScrollBar && hatStyle( Style::VScroll ) ) ? vertikalScrollBar->getScroll() : 0;
  360. int scrollBr = ( horizontalScrollBar && hatStyle( Style::HScroll ) ) ? horizontalScrollBar->getScroll() : 0;
  361. int xxx = me.mx - rbr + scrollBr;
  362. int yyy = me.my - rbr + scrollHi;
  363. int scrollBreite = ( vertikalScrollBar && hatStyle( Style::VScroll ) ) * 15;
  364. if( hatStyle( Style::HCenter ) )
  365. xxx -= ( ( ( gr.x - scrollBreite ) / 2 ) - tbr / 2 ) - rbr;
  366. if( hatStyle( Style::VCenter ) && hatStyleNicht( Style::VScroll ) )
  367. yyy -= ( ( ( gr.y - scrollHi ) / 2 ) - thi / 2 ) - rbr;
  368. int pos = textRd->textPos( text->getText(), xxx, yyy );
  369. if( pos != -1 )
  370. {
  371. if( shift )
  372. begf = pos;
  373. else
  374. {
  375. cpos = pos;
  376. begf = pos;
  377. }
  378. rend = 1;
  379. if( vertikalScrollBar && hatStyle( Style::VScroll ) )
  380. updateVScroll( begf );
  381. if( horizontalScrollBar && hatStyle( Style::HScroll ) )
  382. updateHScroll( begf );
  383. }
  384. mausKlick = 1;
  385. }
  386. if( me.id == ME_Bewegung && mausKlick )
  387. {
  388. int tbr = textRd->getTextBreite( text->getText() );
  389. int thi = textRd->getTextHeight( text->getText() );
  390. int scrollHi = ( vertikalScrollBar && hatStyle( Style::VScroll ) ) ? vertikalScrollBar->getScroll() : 0;
  391. int scrollBr = ( horizontalScrollBar && hatStyle( Style::HScroll ) ) ? horizontalScrollBar->getScroll() : 0;
  392. int xxx = me.mx - rbr + scrollBr;
  393. int yyy = me.my - rbr + scrollHi;
  394. int scrollBreite = ( vertikalScrollBar && hatStyle( Style::VScroll ) ) * 15;
  395. int scrollHeight = ( horizontalScrollBar && hatStyle( Style::HScroll ) ) * 15;
  396. if( hatStyle( Style::HCenter ) )
  397. xxx -= ( ( ( gr.x - scrollBreite ) / 2 ) - tbr / 2 ) - rbr;
  398. if( hatStyle( Style::VCenter ) && hatStyleNicht( Style::VScroll ) )
  399. yyy -= ( ( ( gr.y - scrollHeight ) / 2 ) - thi / 2 ) - rbr;
  400. int pos = textRd->textPos( text->getText(), xxx, yyy );
  401. if( pos != -1 )
  402. {
  403. if( begf != pos )
  404. rend = 1;
  405. begf = pos;
  406. if( vertikalScrollBar && hatStyle( Style::VScroll ) )
  407. updateVScroll( begf );
  408. if( horizontalScrollBar && hatStyle( Style::HScroll ) )
  409. updateHScroll( begf );
  410. }
  411. }
  412. if( me.id == ME_RLinks )
  413. {
  414. if( !shift )
  415. {
  416. int tbr = textRd->getTextBreite( text->getText() );
  417. int thi = textRd->getTextHeight( text->getText() );
  418. int scrollHi = ( vertikalScrollBar && hatStyle( Style::VScroll ) ) ? vertikalScrollBar->getScroll() : 0;
  419. int scrollBr = ( horizontalScrollBar && hatStyle( Style::HScroll ) ) ? horizontalScrollBar->getScroll() : 0;
  420. int xxx = me.mx - rbr + scrollBr;
  421. int yyy = me.my - rbr + scrollHi;
  422. int scrollBreite = ( vertikalScrollBar && hatStyle( Style::VScroll ) ) * 15;
  423. int scrollHeight = ( horizontalScrollBar && hatStyle( Style::HScroll ) ) * 15;
  424. if( hatStyle( Style::HCenter ) )
  425. xxx -= ( ( ( gr.x - scrollBreite ) / 2 ) - tbr / 2 ) - rbr;
  426. if( hatStyle( Style::VCenter ) && hatStyleNicht( Style::VScroll ) )
  427. yyy -= ( ( ( gr.y - scrollHeight ) / 2 ) - thi / 2 ) - rbr;
  428. int pos = textRd->textPos( text->getText(), xxx, yyy );
  429. if( pos != -1 )
  430. {
  431. begf = pos;
  432. if( vertikalScrollBar && hatStyle( Style::VScroll ) )
  433. updateVScroll( begf );
  434. if( horizontalScrollBar && hatStyle( Style::HScroll ) )
  435. updateHScroll( begf );
  436. }
  437. rend = 1;
  438. }
  439. mausKlick = 0;
  440. }
  441. }
  442. }
  443. }
  444. me.verarbeitet = 1;
  445. }
  446. if( nmakc && me.verarbeitet && nMak )
  447. me.verarbeitet = nMak( nmakParam, this, me );
  448. me.mx += pos.x, me.my += pos.y;
  449. }
  450. void TextFeld::doTastaturEreignis( TastaturEreignis &te )
  451. {
  452. bool ntakc = !te.verarbeitet;
  453. if( te.verarbeitet || hatStyleNicht( Style::Fokus ) )
  454. return;
  455. if( !tak )
  456. return;
  457. ++ref;
  458. if( tak( takParam, this, te ) )
  459. {
  460. if( hatStyleNicht( Style::Erlaubt ) )
  461. {
  462. --ref;
  463. if( !ref )
  464. delete this;
  465. return;
  466. }
  467. if( te.id == TE_Press )
  468. {
  469. bool shift = TastenStand[ T_Shift ];
  470. bool strg = TastenStand[ T_Strg ];
  471. switch( te.taste )
  472. {
  473. case T_Entf:
  474. if( cpos != begf )
  475. text->remove( cpos, begf );
  476. else
  477. text->remove( cpos, cpos + 1 );
  478. begf = cpos;
  479. rend = 1;
  480. break;
  481. case T_BackSpace:
  482. if( cpos != begf )
  483. {
  484. text->remove( cpos, begf );
  485. if( cpos > begf )
  486. cpos -= cpos - begf;
  487. }
  488. else
  489. {
  490. text->remove( cpos - 1, cpos );
  491. --cpos;
  492. }
  493. begf = cpos;
  494. rend = 1;
  495. break;
  496. case T_Enter:
  497. if( cpos != begf )
  498. {
  499. text->remove( begf, cpos );
  500. if( cpos > begf )
  501. cpos -= cpos - begf;
  502. }
  503. text->insert( cpos, '\n' );
  504. ++cpos;
  505. begf = cpos;
  506. rend = 1;
  507. break;
  508. case T_Links:
  509. if( shift )
  510. {
  511. if( strg )
  512. begf = text->getLKick( begf );
  513. else
  514. --begf;
  515. }
  516. else
  517. {
  518. if( strg )
  519. cpos = text->getLKick( cpos );
  520. else
  521. --cpos;
  522. begf = cpos;
  523. }
  524. rend = 1;
  525. break;
  526. case T_Oben:
  527. if( shift )
  528. {
  529. begf = text->getOKick( begf );
  530. }
  531. else
  532. {
  533. cpos = text->getOKick( cpos );
  534. begf = cpos;
  535. }
  536. rend = 1;
  537. break;
  538. case T_Rechts:
  539. if( shift )
  540. {
  541. if( strg )
  542. begf = text->getRKick( begf );
  543. else
  544. ++begf;
  545. }
  546. else
  547. {
  548. if( strg )
  549. cpos = text->getRKick( cpos );
  550. else
  551. ++cpos;
  552. begf = cpos;
  553. }
  554. rend = 1;
  555. break;
  556. case T_Unten:
  557. if( shift )
  558. {
  559. begf = text->getUKick( begf );
  560. }
  561. else
  562. {
  563. cpos = text->getUKick( cpos );
  564. begf = cpos;
  565. }
  566. rend = 1;
  567. break;
  568. default:
  569. if( strg && te.id == TE_Press )
  570. {
  571. if( te.taste == 'c' || te.taste == 'C' )
  572. {
  573. if( begf != cpos )
  574. {
  575. int len = begf - cpos;
  576. if( len < 0 )
  577. len = -len;
  578. char *txt = new char[ len + 1 ];
  579. txt[ len ] = 0;
  580. int beg = begf < cpos ? begf : cpos;
  581. for( int i = beg; i < beg + len; ++i )
  582. txt[ i - beg ] = text->getText()[ i ];
  583. TextKopieren( txt );
  584. delete[] txt;
  585. }
  586. else
  587. TextKopieren( text->getText() );
  588. }
  589. if( te.taste == 'v' || te.taste == 'V' )
  590. {
  591. if( begf != cpos )
  592. {
  593. text->remove( begf, cpos );
  594. if( cpos > begf )
  595. cpos = begf;
  596. }
  597. char *txt = TextInsert();
  598. text->insert( cpos, txt );
  599. cpos += textLength( txt );
  600. begf = cpos;
  601. rend = 1;
  602. }
  603. break;
  604. }
  605. if( istSchreibbar( te.taste ) )
  606. {
  607. if( begf != cpos )
  608. {
  609. text->remove( begf, cpos );
  610. if( cpos > begf )
  611. cpos = begf;
  612. }
  613. text->insert( cpos, (char)te.taste );
  614. ++cpos;
  615. begf = cpos;
  616. rend = 1;
  617. }
  618. break;
  619. }
  620. }
  621. if( cpos < 0 )
  622. cpos = 0;
  623. if( cpos > text->getLength() )
  624. cpos = text->getLength();
  625. if( begf < 0 )
  626. begf = 0;
  627. if( begf > text->getLength() )
  628. begf = text->getLength();
  629. if( hatStyle( Style::VScroll ) )
  630. updateVScroll( begf );
  631. if( hatStyle( Style::HScroll ) )
  632. updateHScroll( begf );
  633. te.verarbeitet = 1;
  634. }
  635. --ref;
  636. if( ntakc && te.verarbeitet && nTak )
  637. te.verarbeitet = nTak( ntakParam, this, te );
  638. if( !ref )
  639. delete this;
  640. }
  641. void TextFeld::render( Bild &zRObj ) // zeichenet nach zRObj
  642. {
  643. if( hatStyleNicht( Style::Sichtbar ) )
  644. return;
  645. ZeichnungHintergrund::render( zRObj );
  646. if( !text || !textRd )
  647. return;
  648. lockZeichnung();
  649. if( !zRObj.setDrawOptions( innenPosition, innenSize ) )
  650. {
  651. unlockZeichnung();
  652. return;
  653. }
  654. if( hatStyleNicht( Style::Mehrzeilig ) )
  655. text->remove( '\n' );
  656. if( hatStyleNicht( Style::Mehrfarbig ) )
  657. {
  658. while( text->hat( '\r' ) )
  659. text->remove( text->positionVon( '\r' ), text->positionVon( '\r' ) + 11 );
  660. }
  661. textRd->setSchriftSize( schriftSize );
  662. int tbr = textRd->getTextBreite( text->getText() );
  663. int thi = textRd->getTextHeight( text->getText() );
  664. int xxx = 0;
  665. int yyy = 0;
  666. int breite = innenSize.x;
  667. int height = innenSize.y;
  668. bool hs = horizontalScrollBar && hatStyle( Style::HScroll );
  669. bool vs = vertikalScrollBar && hatStyle( Style::VScroll );
  670. if( vs )
  671. yyy -= vertikalScrollBar->getScroll();
  672. if( hs )
  673. xxx -= horizontalScrollBar->getScroll();
  674. if( hatStyle( Style::HCenter ) && !hs )
  675. xxx = ( breite / 2 ) - tbr / 2;
  676. if( hatStyle( Style::VCenter ) && !vs )
  677. yyy = ( height / 2 ) - thi / 2;
  678. if( hatStyle( Style::Fokus ) && hatStyle( Style::Erlaubt ) )
  679. {
  680. if( istSchreibbar( showChar ) )
  681. {
  682. Text rt;
  683. int len = text->getLength() - text->anzahlVon( '\n' ) - text->anzahlVon( '\r' ) * 11;
  684. rt.fillText( showChar, len );
  685. if( tickVal <= 0.5 )
  686. textRd->renderText( xxx, yyy, rt, zRObj, sF, cpos, 0xFFFF5555, begf, 0xFF0000FF );
  687. else
  688. textRd->renderText( xxx, yyy, rt, zRObj, sF, cpos, 0x00000000, begf, 0xFF0000FF );
  689. }
  690. else
  691. {
  692. if( tickVal <= 0.5 )
  693. textRd->renderText( xxx, yyy, text->getText(), zRObj, sF, cpos, 0xFFFF5555, begf, 0xFF0000FF );
  694. else
  695. textRd->renderText( xxx, yyy, text->getText(), zRObj, sF, cpos, 0x00000000, begf, 0xFF0000FF );
  696. }
  697. }
  698. else
  699. {
  700. if( istSchreibbar( showChar ) )
  701. {
  702. Text rt;
  703. int len = text->getLength() - text->anzahlVon( '\n' ) - text->anzahlVon( '\r' ) * 11;
  704. rt.fillText( showChar, len );
  705. textRd->renderText( xxx, yyy, rt, zRObj, sF );
  706. }
  707. else
  708. textRd->renderText( xxx, yyy, text->getText(), zRObj, sF );
  709. }
  710. zRObj.releaseDrawOptions();
  711. unlockZeichnung();
  712. }
  713. // Konstant
  714. Text *TextFeld::getText() const // gibt vom Text zurück
  715. {
  716. if( !text )
  717. return 0;
  718. return text->getThis();
  719. }
  720. Text *TextFeld::zText() const // gibt den Text zurück
  721. {
  722. return text;
  723. }
  724. Schrift *TextFeld::getSchrift() const// gint getThis der Schrift Zurück
  725. {
  726. if( !textRd )
  727. return 0;
  728. return textRd->getSchrift();
  729. }
  730. Schrift *TextFeld::zSchrift() const// gibt die Schrift zurück
  731. {
  732. return textRd ? textRd->zSchrift() : 0;
  733. }
  734. TextRenderer *TextFeld::getTextRenderer() const
  735. {
  736. return textRd ? textRd->getThis() : 0;
  737. }
  738. TextRenderer *TextFeld::zTextRenderer() const
  739. {
  740. return textRd;
  741. }
  742. unsigned char TextFeld::getSchriftSize() const // gibt die Schriftgröße zurück
  743. {
  744. return schriftSize;
  745. }
  746. int TextFeld::getSchriftFarbe() const// gibt getThis der Schriftfarbe zurück
  747. {
  748. return sF;
  749. }
  750. unsigned char TextFeld::getShowChar() const // gibt den Anzeige Char zurück
  751. {
  752. return showChar;
  753. }
  754. int TextFeld::getCursorPos() const
  755. {
  756. return cpos;
  757. }
  758. int TextFeld::getSelectionPos() const
  759. {
  760. return begf;
  761. }
  762. Zeichnung *TextFeld::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
  763. {
  764. TextFeld *obj = new TextFeld();
  765. obj->setPosition( pos );
  766. obj->setSize( gr );
  767. obj->setMausEreignisParameter( makParam );
  768. obj->setTastaturEreignisParameter( takParam );
  769. obj->setMausEreignis( mak );
  770. obj->setTastaturEreignis( tak );
  771. if( toolTip )
  772. obj->setToolTipZ( (ToolTip*)toolTip->dublizieren() );
  773. obj->setStyle( style );
  774. obj->setSchriftSize( schriftSize );
  775. if( textRd )
  776. obj->setSchriftZ( textRd->getSchrift() );
  777. if( text )
  778. obj->setText( text->getText() );
  779. obj->setHintergrundFarbe( hintergrundFarbe );
  780. obj->setSchriftFarbe( sF );
  781. if( hintergrundFeld )
  782. obj->setAlphaFeldZ( (AlphaFeld*)hintergrundFeld->dublizieren() );
  783. if( rahmen )
  784. obj->setRahmenZ( (Rahmen*)rahmen->dublizieren() );
  785. if( hintergrundBild )
  786. obj->setHintergrundBild( hintergrundBild->getThis() );
  787. if( vertikalScrollBar )
  788. {
  789. obj->setVertikalKlickScroll( vertikalScrollBar->getKlickScroll() );
  790. obj->setVertikalScrollPos( vertikalScrollBar->getScroll() );
  791. obj->setVertikalScrollFarbe( vertikalScrollBar->getFarbe(), vertikalScrollBar->getBgFarbe() );
  792. }
  793. if( horizontalScrollBar )
  794. {
  795. obj->setHorizontalKlickScroll( horizontalScrollBar->getKlickScroll() );
  796. obj->setHorizontalScrollPos( horizontalScrollBar->getScroll() );
  797. obj->setHorizontalScrollFarbe( horizontalScrollBar->getFarbe(), horizontalScrollBar->getBgFarbe() );
  798. }
  799. obj->setSchowChar( showChar );
  800. obj->setAuswahl( begf, cpos );
  801. return obj;
  802. }