TextFeld.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851
  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. 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( textRd )
  41. textRd->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->append( "\n" );
  91. if( textRd )
  92. {
  93. bool vs = vertikalScrollBar && hatStyle( Style::VScroll );
  94. int rbr = ( rahmen && hatStyle( Style::Rahmen ) ) ? rahmen->getRBreite() : 0;
  95. textRd->setSchriftSize( schriftSize );
  96. textRd->textFormatieren( txt, gr.x - ( (int)vs * 15 ) - rbr * 2 );
  97. }
  98. lockZeichnung();
  99. text->append( txt->getText() );
  100. unlockZeichnung();
  101. txt->release();
  102. if( hatStyle( Style::VScroll ) )
  103. updateVScroll();
  104. if( hatStyle( Style::HScroll ) )
  105. updateHScroll();
  106. rend = 1;
  107. }
  108. }
  109. void TextFeld::setAuswahl( int pos1, int pos2 ) // setzt den Ausgewählten Text
  110. {
  111. cpos = pos1;
  112. begf = pos2;
  113. rend = 1;
  114. }
  115. void TextFeld::setAuswahl( Punkt &auswahl )
  116. {
  117. cpos = auswahl.x;
  118. begf = auswahl.y;
  119. rend = 1;
  120. }
  121. void TextFeld::setTextRendererZ( TextRenderer *textRd )
  122. {
  123. if( this->textRd )
  124. this->textRd->release();
  125. this->textRd = textRd;
  126. }
  127. void TextFeld::setSchriftZ( Schrift *schrift ) // setzt einen Zeiger zur Schrift
  128. {
  129. if( !this->textRd )
  130. textRd = new TextRenderer( schrift );
  131. else
  132. textRd->setSchriftZ( schrift );
  133. rend = 1;
  134. }
  135. void TextFeld::setSchriftSize( unsigned char gr ) // setzt die Schriftgröße
  136. {
  137. schriftSize = gr;
  138. rend = 1;
  139. }
  140. void TextFeld::setSchriftFarbe( int fc ) // setzt die Schrift Farbe
  141. {
  142. sF = fc;
  143. rend = 1;
  144. }
  145. void TextFeld::setSchowChar( unsigned char c ) // bei Passwortfeld *
  146. {
  147. showChar = c;
  148. rend = 1;
  149. }
  150. void TextFeld::setVScrollZuZeile( int zeile ) // scrollt zur Zeile
  151. {
  152. if( vertikalScrollBar && textRd && text && hatStyle( Style::Mehrzeilig ) )
  153. {
  154. textRd->setSchriftSize( schriftSize );
  155. Text t = "a";
  156. vertikalScrollBar->scroll( zeile * ( textRd->getZeilenabstand() + textRd->getTextHeight( t ) ) );
  157. rend = 1;
  158. }
  159. }
  160. void TextFeld::updateVScroll( int pos ) // scrollt nach unten
  161. {
  162. if( pos == -1 )
  163. pos = cpos;
  164. if( vertikalScrollBar )
  165. {
  166. int sPos = 0;
  167. int hi = 0;
  168. if( text && textRd )
  169. {
  170. if( hatStyleNicht( Style::Mehrzeilig ) )
  171. text->remove( '\n' );
  172. textRd->setSchriftSize( schriftSize );
  173. hi = gr.y;
  174. if( hatStyle( Style::Rahmen ) && rahmen )
  175. hi -= rahmen->getRBreite() * 2;
  176. if( hatStyle( Style::HScroll ) && horizontalScrollBar )
  177. hi -= 15;
  178. vertikalScrollBar->update( textRd->getTextHeight( text->getText() ) + schriftSize + textRd->getTextHeight( "a" ), hi );
  179. Text t;
  180. int zh = textRd->getTextHeight( t ) + textRd->getZeilenabstand();
  181. int l = text->getLength();
  182. for( int i = 0; i < l && ( i < pos || hatStyleNicht( Style::Erlaubt ) ); ++i )
  183. {
  184. if( text->getText()[ i ] == '\n' )
  185. sPos += zh;
  186. }
  187. }
  188. if( textRd )
  189. {
  190. if( sPos - textRd->getZeilenabstand() - textRd->getTextHeight( "a" ) < vertikalScrollBar->getScroll() )
  191. vertikalScrollBar->scroll( sPos - textRd->getZeilenabstand() - textRd->getTextHeight( "a" ) );
  192. if( sPos + textRd->getZeilenabstand() + textRd->getTextHeight( "a" ) > vertikalScrollBar->getScroll() + vertikalScrollBar->getScrollData()->anzeige )
  193. vertikalScrollBar->scroll( sPos + ( textRd->getZeilenabstand() + textRd->getTextHeight( "a" ) ) * 2 - hi );
  194. }
  195. rend = 1;
  196. }
  197. }
  198. void TextFeld::updateHScroll( int pos ) // scrollt zur Curser Position
  199. {
  200. if( pos == -1 )
  201. pos = cpos;
  202. if( horizontalScrollBar && text && textRd )
  203. {
  204. textRd->setSchriftSize( schriftSize );
  205. int br = gr.x;
  206. if( hatStyle( Style::Rahmen ) && rahmen )
  207. br -= rahmen->getRBreite() * 2;
  208. if( hatStyle( Style::VScroll ) && vertikalScrollBar )
  209. br -= 15;
  210. int maxBr = textRd->getTextBreite( text->getText() ) + schriftSize;
  211. horizontalScrollBar->update( maxBr, br );
  212. if( hatStyle( Style::Erlaubt ) && maxBr > br && pos > 0 && pos < text->getLength() )
  213. {
  214. int p1 = 0;
  215. char *tmp = text->getText();
  216. for( int i = 0; i < pos; i++, tmp++ )
  217. {
  218. if( *tmp == '\n' )
  219. p1 = i + 1;
  220. }
  221. Text *t = text->getTeilText( p1, pos );
  222. int cbr = textRd->getTextBreite( t->getText() );
  223. t->release();
  224. if( cbr + schriftSize > horizontalScrollBar->getScroll() + horizontalScrollBar->getScrollData()->anzeige )
  225. horizontalScrollBar->scroll( cbr + schriftSize - br );
  226. if( cbr - schriftSize < horizontalScrollBar->getScroll() )
  227. horizontalScrollBar->scroll( cbr - schriftSize );
  228. }
  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 ZeichnungHintergrund::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_Leaves;
  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_Leaves )
  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. removeStyle( 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_Leaves )
  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. removeStyle( 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( textRd )
  353. {
  354. textRd->setSchriftSize( schriftSize );
  355. bool shift = TastenStand[ T_Shift ];
  356. if( me.id == Framework::ME_PLinks )
  357. {
  358. int tbr = textRd->getTextBreite( text->getText() );
  359. int thi = textRd->getTextHeight( text->getText() );
  360. int scrollHi = ( 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 + scrollHi;
  364. int scrollBreite = ( vertikalScrollBar && hatStyle( Style::VScroll ) ) * 15;
  365. if( hatStyle( Style::HCenter ) )
  366. xxx -= ( ( ( gr.x - scrollBreite ) / 2 ) - tbr / 2 ) - rbr;
  367. if( hatStyle( Style::VCenter ) && hatStyleNicht( Style::VScroll ) )
  368. yyy -= ( ( ( gr.y - scrollHi ) / 2 ) - thi / 2 ) - rbr;
  369. int pos = textRd->textPos( text->getText(), xxx, yyy );
  370. if( pos != -1 )
  371. {
  372. if( shift )
  373. begf = pos;
  374. else
  375. {
  376. cpos = pos;
  377. begf = pos;
  378. }
  379. rend = 1;
  380. if( vertikalScrollBar && hatStyle( Style::VScroll ) )
  381. updateVScroll( begf );
  382. if( horizontalScrollBar && hatStyle( Style::HScroll ) )
  383. updateHScroll( begf );
  384. }
  385. mausKlick = 1;
  386. }
  387. if( me.id == ME_Bewegung && mausKlick )
  388. {
  389. int tbr = textRd->getTextBreite( text->getText() );
  390. int thi = textRd->getTextHeight( text->getText() );
  391. int scrollHi = ( vertikalScrollBar && hatStyle( Style::VScroll ) ) ? vertikalScrollBar->getScroll() : 0;
  392. int scrollBr = ( horizontalScrollBar && hatStyle( Style::HScroll ) ) ? horizontalScrollBar->getScroll() : 0;
  393. int xxx = me.mx - rbr + scrollBr;
  394. int yyy = me.my - rbr + scrollHi;
  395. int scrollBreite = ( vertikalScrollBar && hatStyle( Style::VScroll ) ) * 15;
  396. int scrollHeight = ( horizontalScrollBar && hatStyle( Style::HScroll ) ) * 15;
  397. if( hatStyle( Style::HCenter ) )
  398. xxx -= ( ( ( gr.x - scrollBreite ) / 2 ) - tbr / 2 ) - rbr;
  399. if( hatStyle( Style::VCenter ) && hatStyleNicht( Style::VScroll ) )
  400. yyy -= ( ( ( gr.y - scrollHeight ) / 2 ) - thi / 2 ) - rbr;
  401. int pos = textRd->textPos( text->getText(), xxx, yyy );
  402. if( pos != -1 )
  403. {
  404. if( begf != pos )
  405. rend = 1;
  406. begf = pos;
  407. if( vertikalScrollBar && hatStyle( Style::VScroll ) )
  408. updateVScroll( begf );
  409. if( horizontalScrollBar && hatStyle( Style::HScroll ) )
  410. updateHScroll( begf );
  411. }
  412. }
  413. if( me.id == ME_RLinks )
  414. {
  415. if( !shift )
  416. {
  417. int tbr = textRd->getTextBreite( text->getText() );
  418. int thi = textRd->getTextHeight( text->getText() );
  419. int scrollHi = ( vertikalScrollBar && hatStyle( Style::VScroll ) ) ? vertikalScrollBar->getScroll() : 0;
  420. int scrollBr = ( horizontalScrollBar && hatStyle( Style::HScroll ) ) ? horizontalScrollBar->getScroll() : 0;
  421. int xxx = me.mx - rbr + scrollBr;
  422. int yyy = me.my - rbr + scrollHi;
  423. int scrollBreite = ( vertikalScrollBar && hatStyle( Style::VScroll ) ) * 15;
  424. int scrollHeight = ( horizontalScrollBar && hatStyle( Style::HScroll ) ) * 15;
  425. if( hatStyle( Style::HCenter ) )
  426. xxx -= ( ( ( gr.x - scrollBreite ) / 2 ) - tbr / 2 ) - rbr;
  427. if( hatStyle( Style::VCenter ) && hatStyleNicht( Style::VScroll ) )
  428. yyy -= ( ( ( gr.y - scrollHeight ) / 2 ) - thi / 2 ) - rbr;
  429. int pos = textRd->textPos( text->getText(), xxx, yyy );
  430. if( pos != -1 )
  431. {
  432. begf = pos;
  433. if( vertikalScrollBar && hatStyle( Style::VScroll ) )
  434. updateVScroll( begf );
  435. if( horizontalScrollBar && hatStyle( Style::HScroll ) )
  436. updateHScroll( begf );
  437. }
  438. rend = 1;
  439. }
  440. mausKlick = 0;
  441. }
  442. }
  443. }
  444. }
  445. me.verarbeitet = 1;
  446. }
  447. if( nmakc && me.verarbeitet && nMak )
  448. me.verarbeitet = nMak( nmakParam, this, me );
  449. me.mx += pos.x, me.my += pos.y;
  450. }
  451. void TextFeld::doTastaturEreignis( TastaturEreignis &te )
  452. {
  453. bool ntakc = !te.verarbeitet;
  454. if( te.verarbeitet || hatStyleNicht( Style::Fokus ) )
  455. return;
  456. if( !tak )
  457. return;
  458. ++ref;
  459. if( tak( takParam, this, te ) )
  460. {
  461. if( hatStyleNicht( Style::Erlaubt ) )
  462. {
  463. --ref;
  464. if( !ref )
  465. delete this;
  466. return;
  467. }
  468. if( te.id == TE_Press )
  469. {
  470. bool shift = TastenStand[ T_Shift ];
  471. bool strg = TastenStand[ T_Strg ];
  472. switch( te.taste )
  473. {
  474. case T_Entf:
  475. if( cpos != begf )
  476. text->remove( cpos, begf );
  477. else
  478. text->remove( cpos, cpos + 1 );
  479. begf = cpos;
  480. rend = 1;
  481. break;
  482. case T_BackSpace:
  483. if( cpos != begf )
  484. {
  485. text->remove( cpos, begf );
  486. if( cpos > begf )
  487. cpos -= cpos - begf;
  488. }
  489. else
  490. {
  491. text->remove( cpos - 1, cpos );
  492. --cpos;
  493. }
  494. begf = cpos;
  495. rend = 1;
  496. break;
  497. case T_Enter:
  498. if( cpos != begf )
  499. {
  500. text->remove( begf, cpos );
  501. if( cpos > begf )
  502. cpos -= cpos - begf;
  503. }
  504. text->insert( cpos, '\n' );
  505. ++cpos;
  506. begf = cpos;
  507. rend = 1;
  508. break;
  509. case T_Links:
  510. if( shift )
  511. {
  512. if( strg )
  513. begf = text->getLKick( begf );
  514. else
  515. --begf;
  516. }
  517. else
  518. {
  519. if( strg )
  520. cpos = text->getLKick( cpos );
  521. else
  522. --cpos;
  523. begf = cpos;
  524. }
  525. rend = 1;
  526. break;
  527. case T_Oben:
  528. if( shift )
  529. {
  530. begf = text->getOKick( begf );
  531. }
  532. else
  533. {
  534. cpos = text->getOKick( cpos );
  535. begf = cpos;
  536. }
  537. rend = 1;
  538. break;
  539. case T_Rechts:
  540. if( shift )
  541. {
  542. if( strg )
  543. begf = text->getRKick( begf );
  544. else
  545. ++begf;
  546. }
  547. else
  548. {
  549. if( strg )
  550. cpos = text->getRKick( cpos );
  551. else
  552. ++cpos;
  553. begf = cpos;
  554. }
  555. rend = 1;
  556. break;
  557. case T_Unten:
  558. if( shift )
  559. {
  560. begf = text->getUKick( begf );
  561. }
  562. else
  563. {
  564. cpos = text->getUKick( cpos );
  565. begf = cpos;
  566. }
  567. rend = 1;
  568. break;
  569. default:
  570. if( strg && te.id == TE_Press )
  571. {
  572. if( te.taste == 'c' || te.taste == 'C' )
  573. {
  574. if( begf != cpos )
  575. {
  576. int len = begf - cpos;
  577. if( len < 0 )
  578. len = -len;
  579. char *txt = new char[ len + 1 ];
  580. txt[ len ] = 0;
  581. int beg = begf < cpos ? begf : cpos;
  582. for( int i = beg; i < beg + len; ++i )
  583. txt[ i - beg ] = text->getText()[ i ];
  584. TextKopieren( txt );
  585. delete[] txt;
  586. }
  587. else
  588. TextKopieren( text->getText() );
  589. }
  590. if( te.taste == 'v' || te.taste == 'V' )
  591. {
  592. if( begf != cpos )
  593. {
  594. text->remove( begf, cpos );
  595. if( cpos > begf )
  596. cpos = begf;
  597. }
  598. char *txt = TextInsert();
  599. text->insert( cpos, txt );
  600. cpos += textLength( txt );
  601. begf = cpos;
  602. rend = 1;
  603. }
  604. break;
  605. }
  606. if( istSchreibbar( te.taste ) )
  607. {
  608. if( begf != cpos )
  609. {
  610. text->remove( begf, cpos );
  611. if( cpos > begf )
  612. cpos = begf;
  613. }
  614. text->insert( cpos, (char)te.taste );
  615. ++cpos;
  616. begf = cpos;
  617. rend = 1;
  618. }
  619. break;
  620. }
  621. }
  622. if( cpos < 0 )
  623. cpos = 0;
  624. if( cpos > text->getLength() )
  625. cpos = text->getLength();
  626. if( begf < 0 )
  627. begf = 0;
  628. if( begf > text->getLength() )
  629. begf = text->getLength();
  630. if( hatStyle( Style::VScroll ) )
  631. updateVScroll( begf );
  632. if( hatStyle( Style::HScroll ) )
  633. updateHScroll( begf );
  634. te.verarbeitet = 1;
  635. }
  636. --ref;
  637. if( ntakc && te.verarbeitet && nTak )
  638. te.verarbeitet = nTak( ntakParam, this, te );
  639. if( !ref )
  640. delete this;
  641. }
  642. void TextFeld::render( Bild &zRObj ) // zeichenet nach zRObj
  643. {
  644. if( hatStyleNicht( Style::Sichtbar ) )
  645. return;
  646. ZeichnungHintergrund::render( zRObj );
  647. if( !text || !textRd )
  648. return;
  649. lockZeichnung();
  650. if( !zRObj.setDrawOptions( innenPosition, innenSize ) )
  651. {
  652. unlockZeichnung();
  653. return;
  654. }
  655. if( hatStyleNicht( Style::Mehrzeilig ) )
  656. text->remove( '\n' );
  657. if( hatStyleNicht( Style::Mehrfarbig ) )
  658. {
  659. while( text->hat( '\r' ) )
  660. text->remove( text->positionVon( '\r' ), text->positionVon( '\r' ) + 11 );
  661. }
  662. textRd->setSchriftSize( schriftSize );
  663. int tbr = textRd->getTextBreite( text->getText() );
  664. int thi = textRd->getTextHeight( text->getText() );
  665. int xxx = 0;
  666. int yyy = 0;
  667. int breite = innenSize.x;
  668. int height = innenSize.y;
  669. bool hs = horizontalScrollBar && hatStyle( Style::HScroll );
  670. bool vs = vertikalScrollBar && hatStyle( Style::VScroll );
  671. if( vs )
  672. yyy -= vertikalScrollBar->getScroll();
  673. if( hs )
  674. xxx -= horizontalScrollBar->getScroll();
  675. if( hatStyle( Style::HCenter ) && !hs )
  676. xxx = ( breite / 2 ) - tbr / 2;
  677. if( hatStyle( Style::VCenter ) && !vs )
  678. yyy = ( height / 2 ) - thi / 2;
  679. if( hatStyle( Style::Fokus ) && hatStyle( Style::Erlaubt ) )
  680. {
  681. if( istSchreibbar( showChar ) )
  682. {
  683. Text rt;
  684. int len = text->getLength() - text->anzahlVon( '\n' ) - text->anzahlVon( '\r' ) * 11;
  685. rt.fillText( showChar, len );
  686. if( tickVal <= 0.5 )
  687. textRd->renderText( xxx, yyy, rt, zRObj, sF, cpos, 0xFFFF5555, begf, 0xFF0000FF );
  688. else
  689. textRd->renderText( xxx, yyy, rt, zRObj, sF, cpos, 0x00000000, begf, 0xFF0000FF );
  690. }
  691. else
  692. {
  693. if( tickVal <= 0.5 )
  694. textRd->renderText( xxx, yyy, text->getText(), zRObj, sF, cpos, 0xFFFF5555, begf, 0xFF0000FF );
  695. else
  696. textRd->renderText( xxx, yyy, text->getText(), zRObj, sF, cpos, 0x00000000, begf, 0xFF0000FF );
  697. }
  698. }
  699. else
  700. {
  701. if( istSchreibbar( showChar ) )
  702. {
  703. Text rt;
  704. int len = text->getLength() - text->anzahlVon( '\n' ) - text->anzahlVon( '\r' ) * 11;
  705. rt.fillText( showChar, len );
  706. textRd->renderText( xxx, yyy, rt, zRObj, sF );
  707. }
  708. else
  709. textRd->renderText( xxx, yyy, text->getText(), zRObj, sF );
  710. }
  711. zRObj.releaseDrawOptions();
  712. unlockZeichnung();
  713. }
  714. // Konstant
  715. Text *TextFeld::getText() const // gibt vom Text zurück
  716. {
  717. if( !text )
  718. return 0;
  719. return text->getThis();
  720. }
  721. Text *TextFeld::zText() const // gibt den Text zurück
  722. {
  723. return text;
  724. }
  725. Schrift *TextFeld::getSchrift() const// gint getThis der Schrift Zurück
  726. {
  727. if( !textRd )
  728. return 0;
  729. return textRd->getSchrift();
  730. }
  731. Schrift *TextFeld::zSchrift() const// gibt die Schrift zurück
  732. {
  733. return textRd ? textRd->zSchrift() : 0;
  734. }
  735. TextRenderer *TextFeld::getTextRenderer() const
  736. {
  737. return textRd ? textRd->getThis() : 0;
  738. }
  739. TextRenderer *TextFeld::zTextRenderer() const
  740. {
  741. return textRd;
  742. }
  743. unsigned char TextFeld::getSchriftSize() const // gibt die Schriftgröße zurück
  744. {
  745. return schriftSize;
  746. }
  747. int TextFeld::getSchriftFarbe() const// gibt getThis der Schriftfarbe zurück
  748. {
  749. return sF;
  750. }
  751. unsigned char TextFeld::getShowChar() const // gibt den Anzeige Char zurück
  752. {
  753. return showChar;
  754. }
  755. int TextFeld::getCursorPos() const
  756. {
  757. return cpos;
  758. }
  759. int TextFeld::getSelectionPos() const
  760. {
  761. return begf;
  762. }
  763. Zeichnung *TextFeld::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
  764. {
  765. TextFeld *obj = new TextFeld();
  766. obj->setPosition( pos );
  767. obj->setSize( gr );
  768. obj->setMausEreignisParameter( makParam );
  769. obj->setTastaturEreignisParameter( takParam );
  770. obj->setMausEreignis( mak );
  771. obj->setTastaturEreignis( tak );
  772. if( toolTip )
  773. obj->setToolTipText( toolTip->zText()->getText(), toolTip->zBildschirm() );
  774. obj->setStyle( style );
  775. obj->setSchriftSize( schriftSize );
  776. if( textRd )
  777. obj->setSchriftZ( textRd->getSchrift() );
  778. if( text )
  779. obj->setText( text->getText() );
  780. obj->setHintergrundFarbe( hintergrundFarbe );
  781. obj->setSchriftFarbe( sF );
  782. if( hintergrundFeld )
  783. obj->setAlphaFeldZ( (AlphaFeld*)hintergrundFeld->dublizieren() );
  784. if( rahmen )
  785. obj->setRahmenZ( (Rahmen*)rahmen->dublizieren() );
  786. if( hintergrundBild )
  787. obj->setHintergrundBild( hintergrundBild->getThis() );
  788. if( vertikalScrollBar )
  789. {
  790. obj->setVertikalKlickScroll( vertikalScrollBar->getKlickScroll() );
  791. obj->setVertikalScrollPos( vertikalScrollBar->getScroll() );
  792. obj->setVertikalScrollFarbe( vertikalScrollBar->getFarbe(), vertikalScrollBar->getBgFarbe() );
  793. }
  794. if( horizontalScrollBar )
  795. {
  796. obj->setHorizontalKlickScroll( horizontalScrollBar->getKlickScroll() );
  797. obj->setHorizontalScrollPos( horizontalScrollBar->getScroll() );
  798. obj->setHorizontalScrollFarbe( horizontalScrollBar->getFarbe(), horizontalScrollBar->getBgFarbe() );
  799. }
  800. obj->setSchowChar( showChar );
  801. obj->setAuswahl( begf, cpos );
  802. return obj;
  803. }
  804. // Reference Counting
  805. TextFeld *TextFeld::getThis()
  806. {
  807. ++ref;
  808. return this;
  809. }
  810. TextFeld *TextFeld::release()
  811. {
  812. --ref;
  813. if( ref == 0 )
  814. delete this;
  815. return 0;
  816. }