TextFeld.cpp 28 KB

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