Liste.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977
  1. #include "Liste.h"
  2. #include "Array.h"
  3. #include "Rahmen.h"
  4. #include "Bild.h"
  5. #include "AlphaFeld.h"
  6. #include "TextFeld.h"
  7. #include "Text.h"
  8. #include "MausEreignis.h"
  9. #include "TastaturEreignis.h"
  10. #include "Scroll.h"
  11. #include "Globals.h"
  12. #include "Schrift.h"
  13. using namespace Framework;
  14. // Inhalt der AuswahlListe Klasse aus Liste.h
  15. // Konstruktor
  16. AuswahlListe::AuswahlListe()
  17. : ZeichnungHintergrund(),
  18. tfListe( 0 ),
  19. entries( 0 ),
  20. auswahl( -1 ),
  21. ahFarbe( 0xFF000000 ),
  22. ahBild( 0 ),
  23. aBuffer( 0 ),
  24. aRahmen( 0 ),
  25. styles( 0 ),
  26. ahFarbeListe( 0 ),
  27. ahBildListe( 0 ),
  28. aBufferListe( 0 ),
  29. aRahmenListe( 0 ),
  30. schrift( 0 )
  31. {
  32. style = 0;
  33. this->setMausEreignis( _ret1ME );
  34. this->setTastaturEreignis( _ret1TE );
  35. }
  36. // Destruktor
  37. AuswahlListe::~AuswahlListe()
  38. {
  39. if( tfListe )
  40. tfListe->release();
  41. if( ahBild )
  42. ahBild->release();
  43. if( aBuffer )
  44. aBuffer->release();
  45. if( aRahmen )
  46. aRahmen->release();
  47. if( styles )
  48. styles->release();
  49. if( ahFarbeListe )
  50. ahFarbeListe->release();
  51. if( ahBildListe )
  52. ahBildListe->release();
  53. if( aBufferListe )
  54. aBufferListe->release();
  55. if( aRahmenListe )
  56. aRahmenListe->release();
  57. if( schrift )
  58. schrift->release();
  59. }
  60. void AuswahlListe::doMausEreignis( MausEreignis &me, bool userRet )
  61. {
  62. if( !userRet || hatStyleNicht( Style::Erlaubt ) )
  63. return;
  64. if( hatStyle( Style::VScroll ) && vertikalScrollBar )
  65. {
  66. int rbr = 0;
  67. if( rahmen && hatStyle( Style::Rahmen ) )
  68. rbr = rahmen->getRBreite();
  69. if( ( ( me.mx > gr.x - 15 - rbr ) || me.id == ME_UScroll || me.id == ME_DScroll ) && me.id != ME_Betritt && me.id != ME_Leaves )
  70. {
  71. vertikalScrollBar->doMausMessage( gr.x - rbr - 15, rbr, 15, gr.y - rbr * 2, me );
  72. me.verarbeitet = 1;
  73. }
  74. }
  75. if( !me.verarbeitet && me.id == ME_RLinks )
  76. {
  77. int eintr = getKlickEintrag( me.my );
  78. if( eintr >= 0 )
  79. {
  80. if( hatStyleNicht( Style::MultiSelect ) )
  81. {
  82. auswahl = eintr;
  83. rend = 1;
  84. }
  85. else
  86. {
  87. bool shift = TastenStand[ T_Shift ];
  88. bool strg = TastenStand[ T_Strg ];
  89. if( strg )
  90. {
  91. setMsStyle( eintr, Style::Selected, hatMsStyleNicht( eintr, Style::Selected ) );
  92. auswahl = eintr;
  93. }
  94. else if( shift && auswahl != -1 )
  95. {
  96. deSelect();
  97. int beg = auswahl, end = eintr;
  98. if( beg > end )
  99. {
  100. int tmp = end;
  101. end = beg;
  102. beg = tmp;
  103. }
  104. for( int i = beg; i <= end; ++i )
  105. {
  106. addMsStyle( i, Style::Selected );
  107. }
  108. }
  109. else
  110. {
  111. deSelect();
  112. addMsStyle( eintr, Style::Selected );
  113. auswahl = eintr;
  114. }
  115. }
  116. }
  117. else
  118. deSelect();
  119. }
  120. me.verarbeitet = 1;
  121. }
  122. // nicht constant
  123. void AuswahlListe::update() // aktualisiert die Auswahl Liste
  124. {
  125. int rbr = 0;
  126. if( rahmen )
  127. {
  128. rbr = rahmen->getRBreite();
  129. rahmen->setPosition( 0, 0 );
  130. rahmen->setSize( gr.x, gr.y );
  131. }
  132. if( hintergrundFeld )
  133. {
  134. hintergrundFeld->setPosition( rbr, rbr );
  135. hintergrundFeld->setSize( gr.x - rbr * 2, gr.y - rbr * 2 );
  136. }
  137. if( hatStyleNicht( Style::MultiStyled ) && tfListe )
  138. {
  139. bool FeldRahmen = hatStyle( Style::FeldRahmen );
  140. bool FeldHintergrund = hatStyle( Style::FeldHintergrund );
  141. bool FeldHBild = hatStyle( Style::FeldHBild );
  142. bool FeldHAlpha = hatStyle( Style::FeldHAlpha );
  143. bool FeldBuffer = hatStyle( Style::FeldBuffer );
  144. for( int i = 0; i < entries; ++i )
  145. {
  146. TextFeld *tf = tfListe->z( i );
  147. tf->setStyle( TextFeld::Style::Rahmen, FeldRahmen );
  148. tf->setStyle( TextFeld::Style::Hintergrund, FeldHintergrund );
  149. tf->setStyle( TextFeld::Style::HBild, FeldHBild );
  150. tf->setStyle( TextFeld::Style::HAlpha, FeldHAlpha );
  151. tf->setStyle( TextFeld::Style::Buffered, FeldBuffer );
  152. if( schrift )
  153. tf->setSchriftZ( dynamic_cast<Schrift *>( schrift->getThis() ) );
  154. }
  155. }
  156. if( hatStyle( Style::MultiStyled ) && tfListe && styles )
  157. {
  158. for( int i = 0; i < entries; ++i )
  159. {
  160. TextFeld *tf = tfListe->z( i );
  161. tf->setStyle( TextFeld::Style::Rahmen, hatMsStyle( i, Style::FeldRahmen ) );
  162. tf->setStyle( TextFeld::Style::Hintergrund, hatMsStyle( i, Style::FeldHintergrund ) );
  163. tf->setStyle( TextFeld::Style::HBild, hatMsStyle( i, Style::FeldHBild ) );
  164. tf->setStyle( TextFeld::Style::HAlpha, hatMsStyle( i, Style::FeldHAlpha ) );
  165. tf->setStyle( TextFeld::Style::Buffered, hatMsStyle( i, Style::FeldBuffer ) );
  166. }
  167. }
  168. rend = 1;
  169. }
  170. void AuswahlListe::addEintrag( Text *txt ) // fügt einen Eintrag hinzu
  171. {
  172. TextFeld *tf = new TextFeld();
  173. tf->setStyle( TextFeld::Style::Center | TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen );
  174. tf->setSchriftFarbe( 0xFFFFFFFF );
  175. tf->setRahmenBreite( 1 );
  176. tf->setRahmenFarbe( 0xFFFFFFFF );
  177. tf->setTextZ( txt );
  178. tf->setSize( 0, 20 );
  179. addEintragZ( tf );
  180. rend = 1;
  181. }
  182. void AuswahlListe::addEintrag( const char *txt )
  183. {
  184. Text *tx = new Text( txt );
  185. addEintrag( tx );
  186. rend = 1;
  187. }
  188. void AuswahlListe::addEintragZ( TextFeld *tf )
  189. {
  190. if( !tfListe )
  191. tfListe = new RCArray< TextFeld >();
  192. if( schrift && ( !tf->zSchrift() || hatStyleNicht( Style::MultiStyled ) ) )
  193. tf->setSchriftZ( dynamic_cast<Schrift *>( schrift->getThis() ) );
  194. tfListe->set( tf, entries );
  195. ++entries;
  196. rend = 1;
  197. }
  198. void AuswahlListe::addEintrag( int pos, Text *txt ) // fügt einen Eintrag bei position pos ein
  199. {
  200. TextFeld *tf = new TextFeld();
  201. tf->setStyle( TextFeld::Style::Center | TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen );
  202. tf->setSchriftFarbe( 0xFFFFFFFF );
  203. tf->setRahmenBreite( 1 );
  204. tf->setRahmenFarbe( 0xFFFFFFFF );
  205. tf->setTextZ( txt );
  206. tf->setSize( 0, 20 );
  207. addEintragZ( pos, tf );
  208. rend = 1;
  209. }
  210. void AuswahlListe::addEintrag( int pos, const char *txt )
  211. {
  212. Text *tx = new Text( txt );
  213. addEintrag( pos, tx );
  214. rend = 1;
  215. }
  216. void AuswahlListe::addEintragZ( int pos, TextFeld *tf )
  217. {
  218. if( !tfListe )
  219. tfListe = new RCArray< TextFeld >();
  220. if( schrift && ( !tf->zSchrift() || hatStyleNicht( Style::MultiStyled ) ) )
  221. tf->setSchriftZ( dynamic_cast<Schrift *>( schrift->getThis() ) );
  222. tfListe->add( tf, pos );
  223. ++entries;
  224. rend = 1;
  225. }
  226. void AuswahlListe::setEintrag( int pos, Text *txt ) // ändert den pos - ten Eintrag
  227. {
  228. TextFeld *tf = 0;
  229. if( tfListe )
  230. tf = tfListe->z( pos );
  231. if( !tf )
  232. {
  233. tf = new TextFeld();
  234. tf->setStyle( TextFeld::Style::Center | TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen );
  235. tf->setSchriftFarbe( 0xFFFFFFFF );
  236. tf->setRahmenFarbe( 0xFFFFFFFF );
  237. tf->setRahmenBreite( 1 );
  238. tf->setTextZ( txt );
  239. tf->setSize( 0, 20 );
  240. setEintragZ( pos, tf );
  241. rend = 1;
  242. return;
  243. }
  244. tf->setTextZ( txt );
  245. rend = 1;
  246. }
  247. void AuswahlListe::setEintrag( int pos, unsigned char *txt )
  248. {
  249. Text *tx = new Text( (const char *)txt );
  250. setEintrag( pos, tx );
  251. rend = 1;
  252. }
  253. void AuswahlListe::setEintragZ( int pos, TextFeld *tf )
  254. {
  255. if( !tfListe )
  256. tfListe = new RCArray< TextFeld >();
  257. if( schrift && ( !tf->zSchrift() || hatStyleNicht( Style::MultiStyled ) ) )
  258. tf->setSchriftZ( dynamic_cast<Schrift *>( schrift->getThis() ) );
  259. tfListe->set( tf, pos );
  260. rend = 1;
  261. }
  262. void AuswahlListe::tauschEintragPos( int vpos, int npos ) // taucht den Eintrag vpos mit dem Eintrag npos
  263. {
  264. if( tfListe )
  265. {
  266. tfListe->tausch( vpos, npos );
  267. if( styles )
  268. styles->tausch( vpos, npos );
  269. if( ahFarbeListe )
  270. ahFarbeListe->tausch( vpos, npos );
  271. if( ahBildListe )
  272. ahBildListe->tausch( vpos, npos );
  273. if( aBufferListe )
  274. aBufferListe->tausch( vpos, npos );
  275. if( aRahmenListe )
  276. aRahmenListe->tausch( vpos, npos );
  277. rend = 1;
  278. }
  279. }
  280. void AuswahlListe::removeEintrag( int pos ) // löscht den Eintrag pos
  281. {
  282. tfListe->remove( pos );
  283. --entries;
  284. rend = 1;
  285. }
  286. void AuswahlListe::setSchriftZ( Schrift *schrift ) // legt die Schrift der Einträge fest
  287. {
  288. if( this->schrift )
  289. this->schrift->release();
  290. this->schrift = schrift;
  291. rend = 1;
  292. }
  293. void AuswahlListe::setVScrollZuEintrag( int eintrag ) // scrollt zum Eintrag
  294. {
  295. if( vertikalScrollBar )
  296. {
  297. if( eintrag < entries )
  298. eintrag = entries - 1;
  299. int y = 0;
  300. for( int i = 0; i < eintrag; i++ )
  301. y += tfListe->z( i ) ? tfListe->z( i )->getHeight() : 0;
  302. vertikalScrollBar->scroll( y );
  303. }
  304. }
  305. void AuswahlListe::updateVScroll() // scrollt zur Curser Position oder nach Unten
  306. {
  307. if( vertikalScrollBar )
  308. {
  309. int y = 0;
  310. for( int i = 0; i < entries; i++ )
  311. y += tfListe->z( i ) ? tfListe->z( i )->getHeight() : 0;
  312. vertikalScrollBar->update( y, gr.y - ( ( rahmen && hatStyle( TextFeld::Style::Rahmen ) ) ? rahmen->getRBreite() : 0 ) );
  313. }
  314. }
  315. void AuswahlListe::setALRZ( Rahmen *rahmen ) // setzt einen Zeiger zum Auswahl Rahmen (nur ohne MulitStyled)
  316. {
  317. if( aRahmen )
  318. aRahmen->release();
  319. aRahmen = rahmen;
  320. rend = 1;
  321. }
  322. void AuswahlListe::setALRBreite( int br ) // setzt die Breite des Auswahl Rahmens (nur ohne MultiStyled)
  323. {
  324. if( !aRahmen )
  325. aRahmen = new LRahmen();
  326. aRahmen->setRamenBreite( br );
  327. rend = 1;
  328. }
  329. void AuswahlListe::setALRFarbe( int fc ) // setzt die Farbe des Auswahl Rahmens (nur ohne MultiStyled)
  330. {
  331. if( !aRahmen )
  332. aRahmen = new LRahmen();
  333. aRahmen->setFarbe( fc );
  334. rend = 1;
  335. }
  336. void AuswahlListe::setAAFZ( AlphaFeld *buffer ) // setzt einen Zeiger zum Auswahl AlpaFeld (nur ohne MultiStyled)
  337. {
  338. if( aBuffer )
  339. aBuffer->release();
  340. aBuffer = buffer;
  341. rend = 1;
  342. }
  343. void AuswahlListe::setAAFStrength( int st ) // setzt die Stärke des Auswahl Hintergrund Buffers (nur ohne MultiStyled)
  344. {
  345. if( !aBuffer )
  346. aBuffer = new AlphaFeld();
  347. aBuffer->setStrength( st );
  348. rend = 1;
  349. }
  350. void AuswahlListe::setAAFFarbe( int fc ) // setzt die Farbe des Auswahl Hintergrund Buffers (nur ohne MultiStyled)
  351. {
  352. if( !aBuffer )
  353. aBuffer = new AlphaFeld();
  354. aBuffer->setFarbe( fc );
  355. rend = 1;
  356. }
  357. void AuswahlListe::setAHBild( Bild *bild ) // setzt das Auswahl Hintergrund Bild (nur ohne MultiStyled)
  358. {
  359. if( !ahBild )
  360. ahBild = new Bild();
  361. ahBild->neuBild( bild->getBreite(), bild->getHeight(), 0 );
  362. int *buff1 = ahBild->getBuffer();
  363. int *buff2 = bild->getBuffer();
  364. for( int i = 0; i < bild->getBreite() * bild->getHeight(); ++i )
  365. buff1[ i ] = buff2[ i ];
  366. bild->release();
  367. rend = 1;
  368. }
  369. void AuswahlListe::setAHFarbe( int f ) // setzt einen Zeiger zur Auswahl Hintergrund Farbe (nur ohne MultiStyled)
  370. {
  371. ahFarbe = f;
  372. rend = 1;
  373. }
  374. void AuswahlListe::setAHBildZ( Bild *b ) // setzt einen Zeiger zum Hintergrund Bild (nur ohne MultiStyled)
  375. {
  376. if( ahBild )
  377. ahBild->release();
  378. ahBild = b;
  379. rend = 1;
  380. }
  381. void AuswahlListe::setALRZ( int pos, Rahmen *rahmen ) // setzt einen Zeiger zum Auswahl Rahmen (nur mit MulitStyled)
  382. {
  383. if( !aRahmenListe )
  384. aRahmenListe = new RCArray< Rahmen >();
  385. aRahmenListe->set( rahmen, pos );
  386. rend = 1;
  387. }
  388. void AuswahlListe::setALRBreite( int pos, int br ) // setzt die Breite des Auswahl Rahmens (nur mit MultiStyled)
  389. {
  390. if( !aRahmenListe )
  391. aRahmenListe = new RCArray< Rahmen >();
  392. if( !aRahmenListe->z( pos ) )
  393. aRahmenListe->set( new LRahmen(), pos );
  394. aRahmenListe->z( pos )->setRamenBreite( br );
  395. rend = 1;
  396. }
  397. void AuswahlListe::setALRFarbe( int pos, int fc ) // setzt die Farbe des Auswahl Rahmens (nur mit MultiStyled)
  398. {
  399. if( !aRahmenListe )
  400. aRahmenListe = new RCArray< Rahmen >();
  401. if( !aRahmenListe->z( pos ) )
  402. aRahmenListe->set( new LRahmen(), pos );
  403. aRahmenListe->z( pos )->setFarbe( fc );
  404. rend = 1;
  405. }
  406. void AuswahlListe::setAAFZ( int pos, AlphaFeld *buffer ) // setzt einen Zeiger zum Auswahl AlpaFeld (nur mit MultiStyled)
  407. {
  408. if( !aBufferListe )
  409. aBufferListe = new RCArray< AlphaFeld >();
  410. aBufferListe->set( buffer, pos );
  411. rend = 1;
  412. }
  413. void AuswahlListe::setAAFStrength( int pos, int st ) // setzt die Stärke des Auswahl Hintergrund Buffers (nur mit MultiStyled)
  414. {
  415. if( !aBufferListe )
  416. aBufferListe = new RCArray< AlphaFeld >();
  417. if( !aBufferListe->z( pos ) )
  418. aBufferListe->set( new AlphaFeld(), pos );
  419. aBufferListe->z( pos )->setStrength( st );
  420. rend = 1;
  421. }
  422. void AuswahlListe::setAAFFarbe( int pos, int fc ) // setzt die Farbe des Auswahl Hintergrund Buffers (nur mit MultiStyled)
  423. {
  424. if( !aBufferListe )
  425. aBufferListe = new RCArray< AlphaFeld >();
  426. if( !aBufferListe->z( pos ) )
  427. aBufferListe->set( new AlphaFeld(), pos );
  428. aBufferListe->z( pos )->setFarbe( fc );
  429. rend = 1;
  430. }
  431. void AuswahlListe::setAHBild( int pos, Bild *bild ) // setzt das Auswahl Hintergrund Bild (nur mit MultiStyled)
  432. {
  433. if( ahBildListe )
  434. ahBildListe = new RCArray< Bild >();
  435. if( !ahBildListe->z( pos ) )
  436. ahBildListe->set( new Bild(), pos );
  437. ahBildListe->z( pos )->neuBild( bild->getBreite(), bild->getHeight(), 0 );
  438. int *buff1 = ahBildListe->z( pos )->getBuffer();
  439. int *buff2 = bild->getBuffer();
  440. for( int i = 0; i < bild->getBreite() * bild->getHeight(); ++i )
  441. buff1[ i ] = buff2[ i ];
  442. bild->release();
  443. rend = 1;
  444. }
  445. void AuswahlListe::setAHFarbe( int pos, int f ) // setzt einen Zeiger zur Auswahl Hintergrund Farbe (nur miz MultiStyled)
  446. {
  447. if( ahFarbeListe )
  448. ahFarbeListe = new Array< int >();
  449. ahFarbeListe->set( f, pos );
  450. rend = 1;
  451. }
  452. void AuswahlListe::setAHBildZ( int pos, Bild *b ) // setzt einen Zeiger zum Hintergrund Bild (nur mit MultiStyled)
  453. {
  454. if( ahBildListe )
  455. ahBildListe = new RCArray< Bild >();
  456. ahBildListe->set( b, pos );
  457. rend = 1;
  458. }
  459. void AuswahlListe::setMsStyle( int pos, __int64 style ) // setzt den Style des Eintrags (nur mit MultiStyled)
  460. {
  461. if( !styles )
  462. styles = new Array< __int64 >();
  463. styles->set( style, pos );
  464. rend = 1;
  465. }
  466. void AuswahlListe::setMsStyle( int pos, __int64 style, bool add_remove )
  467. {
  468. if( !styles )
  469. styles = new Array< __int64 >();
  470. if( add_remove )
  471. styles->set( styles->get( pos ) | style, pos );
  472. else
  473. styles->set( styles->get( pos ) & ~style, pos );
  474. rend = 1;
  475. }
  476. void AuswahlListe::addMsStyle( int pos, __int64 style )
  477. {
  478. if( !styles )
  479. styles = new Array< __int64 >();
  480. styles->set( styles->get( pos ) | style, pos );
  481. rend = 1;
  482. }
  483. void AuswahlListe::removeMsStyle( int pos, __int64 style )
  484. {
  485. if( !styles )
  486. styles = new Array< __int64 >();
  487. styles->set( styles->get( pos ) & ~style, pos );
  488. rend = 1;
  489. }
  490. void AuswahlListe::doTastaturEreignis( TastaturEreignis &te )
  491. {
  492. bool ntakc = !te.verarbeitet;
  493. if( hatStyleNicht( Style::Fokus ) || !tak || te.verarbeitet )
  494. return;
  495. getThis();
  496. if( tak( takParam, this, te ) )
  497. {
  498. if( te.id == TE_Press )
  499. {
  500. if( hatStyleNicht( Style::MultiSelect ) )
  501. {
  502. switch( te.taste )
  503. {
  504. case T_Unten:
  505. ++auswahl;
  506. if( auswahl > entries )
  507. auswahl = entries;
  508. rend = 1;
  509. break;
  510. case T_Oben:
  511. --auswahl;
  512. if( auswahl < -1 )
  513. auswahl = -1;
  514. rend = 1;
  515. break;
  516. }
  517. }
  518. else
  519. {
  520. switch( te.taste )
  521. {
  522. case T_Unten:
  523. deSelect();
  524. ++auswahl;
  525. if( auswahl > entries )
  526. auswahl = entries;
  527. if( auswahl >= 0 )
  528. addMsStyle( auswahl, Style::Selected );
  529. rend = 1;
  530. break;
  531. case T_Oben:
  532. deSelect();
  533. --auswahl;
  534. if( auswahl < -1 )
  535. auswahl = -1;
  536. if( auswahl >= 0 )
  537. addMsStyle( auswahl, Style::Selected );
  538. rend = 1;
  539. break;
  540. }
  541. }
  542. }
  543. te.verarbeitet = 1;
  544. }
  545. if( ntakc && te.verarbeitet && nTak )
  546. te.verarbeitet = nTak( ntakParam, this, te );
  547. release();
  548. }
  549. void AuswahlListe::render( Bild &zRObj ) // zeichnet nach zRObj
  550. {
  551. if( !hatStyle( Style::Sichtbar ) )
  552. return;
  553. removeStyle( Style::HScroll );
  554. ZeichnungHintergrund::render( zRObj );
  555. lockZeichnung();
  556. if( !zRObj.setDrawOptions( innenPosition, innenSize ) )
  557. {
  558. unlockZeichnung();
  559. return;
  560. }
  561. int rbr = 0;
  562. if( rahmen && hatStyle( Style::Rahmen ) )
  563. rbr = rahmen->getRBreite();
  564. if( tfListe )
  565. {
  566. entries = tfListe->getEintragAnzahl();
  567. int maxHeight = 0;
  568. int dx = 0, dy = 0;
  569. if( vertikalScrollBar && hatStyle( Style::VScroll ) )
  570. dy -= vertikalScrollBar->getScroll();
  571. int mdy = innenSize.y + rbr;
  572. for( int i = 0; i < entries; ++i )
  573. {
  574. TextFeld *tf = tfListe->z( i );
  575. if( dy + tf->getHeight() > mdy && !( vertikalScrollBar && hatStyle( Style::VScroll ) ) )
  576. break;
  577. tf->setPosition( dx, dy );
  578. tf->setSize( innenSize.x, tf->getHeight() );
  579. maxHeight += tf->getHeight();
  580. bool selected = 0;
  581. if( hatStyle( Style::MultiSelect ) && styles )
  582. selected = hatMsStyle( i, Style::Selected );
  583. else
  584. selected = auswahl == i;
  585. AlphaFeld *tmpBuffer = 0;
  586. bool tmpB = 0;
  587. int tmpHFarbe = 0;
  588. bool tmpH = 0;
  589. Bild *tmpHBild = 0;
  590. bool tmpHB = 0;
  591. bool tmpHAlpha = 0;
  592. Rahmen *tmpRahmen = 0;
  593. bool tmpR = 0;
  594. if( selected )
  595. {
  596. if( hatStyleNicht( Style::MultiStyled ) || !styles )
  597. {
  598. if( hatStyle( Style::AuswahlBuffer ) && aBuffer )
  599. {
  600. tmpBuffer = tf->getAlphaFeld();
  601. tf->setAlphaFeldZ( dynamic_cast<AlphaFeld *>( aBuffer->getThis() ) );
  602. tmpB = tf->hatStyle( TextFeld::Style::Buffered );
  603. tf->setStyle( TextFeld::Style::Buffered, hatStyle( Style::AuswahlBuffer ) );
  604. }
  605. if( hatStyle( Style::AuswahlHintergrund ) )
  606. {
  607. tmpH = tf->hatStyle( TextFeld::Style::Hintergrund );
  608. tmpHFarbe = tf->getHintergrundFarbe();
  609. tf->setHintergrundFarbe( ahFarbe );
  610. tf->setStyle( TextFeld::Style::Hintergrund, hatStyle( Style::Hintergrund ) );
  611. if( hatStyle( Style::AuswahlHBild ) && ahBild )
  612. {
  613. tmpHBild = tf->getHintergrundBild();
  614. tf->setHintergrundBildZ( dynamic_cast<Bild *>( ahBild->getThis() ) );
  615. tmpHB = tf->hatStyle( TextFeld::Style::HBild );
  616. tf->setStyle( TextFeld::Style::HBild, hatStyle( Style::HBild ) );
  617. }
  618. if( hatStyle( Style::AuswahlHAlpha ) )
  619. {
  620. tmpHAlpha = tf->hatStyle( TextFeld::Style::HAlpha );
  621. tf->setStyle( TextFeld::Style::HAlpha, hatStyle( Style::AuswahlHAlpha ) );
  622. }
  623. }
  624. if( hatStyle( Style::AuswahlRahmen ) && aRahmen )
  625. {
  626. tmpRahmen = tf->getRahmen();
  627. tf->setRahmenZ( dynamic_cast<Rahmen *>( aRahmen->getThis() ) );
  628. tmpR = tf->hatStyle( TextFeld::Style::Rahmen );
  629. tf->setStyle( TextFeld::Style::Rahmen, hatStyle( Style::AuswahlRahmen ) );
  630. }
  631. }
  632. else
  633. {
  634. if( hatMsStyle( i, Style::AuswahlBuffer ) && aBufferListe )
  635. {
  636. tmpBuffer = tf->getAlphaFeld();
  637. tf->setAlphaFeldZ( aBufferListe->get( i ) );
  638. tmpB = tf->hatStyle( TextFeld::Style::Buffered );
  639. tf->setStyle( TextFeld::Style::Buffered, hatMsStyle( i, Style::AuswahlBuffer ) );
  640. }
  641. if( hatMsStyle( i, Style::AuswahlHintergrund ) )
  642. {
  643. tmpH = tf->hatStyle( Style::Hintergrund );
  644. tf->setStyle( TextFeld::Style::Hintergrund, hatMsStyle( i, Style::AuswahlHintergrund ) );
  645. if( ahFarbeListe && ahFarbeListe->hat( i ) )
  646. {
  647. tmpHFarbe = tf->getHintergrundFarbe();
  648. tf->setHintergrundFarbe( ahFarbeListe->get( i ) );
  649. }
  650. if( hatMsStyle( i, Style::AuswahlHBild ) && ahBildListe )
  651. {
  652. tmpHBild = tf->getHintergrundBild();
  653. tf->setHintergrundBildZ( ahBildListe->get( i ) );
  654. tmpHB = tf->hatStyle( TextFeld::Style::HBild );
  655. tf->setStyle( TextFeld::Style::HBild, hatMsStyle( i, Style::HBild ) );
  656. }
  657. if( hatMsStyle( i, Style::AuswahlHAlpha ) )
  658. {
  659. tmpHAlpha = tf->hatStyle( TextFeld::Style::HAlpha );
  660. tf->setStyle( TextFeld::Style::HAlpha, hatMsStyle( i, Style::AuswahlHAlpha ) );
  661. }
  662. }
  663. if( hatMsStyle( i, Style::AuswahlRahmen ) && aRahmenListe )
  664. {
  665. tmpRahmen = tf->getRahmen();
  666. tf->setRahmenZ( aRahmenListe->get( i ) );
  667. tmpR = tf->hatStyle( TextFeld::Style::Rahmen );
  668. tf->setStyle( TextFeld::Style::Rahmen, hatMsStyle( i, Style::AuswahlRahmen ) );
  669. }
  670. }
  671. }
  672. tf->render( zRObj );
  673. if( selected )
  674. {
  675. if( hatStyleNicht( Style::MultiStyled ) || !styles )
  676. {
  677. if( hatStyle( Style::AuswahlBuffer ) )
  678. {
  679. tf->setAlphaFeldZ( tmpBuffer );
  680. tf->setStyle( TextFeld::Style::Buffered, tmpB );
  681. }
  682. if( hatStyle( Style::AuswahlHintergrund ) )
  683. {
  684. tf->setHintergrundFarbe( tmpHFarbe );
  685. tf->setStyle( TextFeld::Style::Hintergrund, tmpH );
  686. if( hatStyle( Style::AuswahlHBild ) )
  687. {
  688. tf->setHintergrundBildZ( tmpHBild );
  689. tf->setStyle( TextFeld::Style::HBild, tmpHB );
  690. }
  691. if( hatStyle( Style::AuswahlHAlpha ) )
  692. tf->setStyle( TextFeld::Style::HAlpha, tmpHAlpha );
  693. }
  694. if( hatStyle( Style::AuswahlRahmen ) )
  695. {
  696. tf->setRahmenZ( tmpRahmen );
  697. tf->setStyle( TextFeld::Style::Rahmen, tmpR );
  698. }
  699. }
  700. else
  701. {
  702. if( hatMsStyle( i, Style::AuswahlBuffer ) && aBufferListe )
  703. {
  704. tf->setAlphaFeldZ( tmpBuffer );
  705. tf->setStyle( TextFeld::Style::Buffered, tmpB );
  706. }
  707. if( hatMsStyle( i, Style::AuswahlHintergrund ) )
  708. {
  709. tf->setStyle( TextFeld::Style::Hintergrund, tmpH );
  710. if( ahFarbeListe && ahFarbeListe->hat( i ) )
  711. tf->setHintergrundFarbe( tmpHFarbe );
  712. if( hatMsStyle( i, Style::AuswahlHBild ) && ahBildListe )
  713. {
  714. tf->setHintergrundBildZ( tmpHBild );
  715. tf->setStyle( TextFeld::Style::HBild, tmpHB );
  716. }
  717. if( hatMsStyle( i, Style::AuswahlHAlpha ) )
  718. tf->setStyle( TextFeld::Style::HAlpha, tmpHAlpha );
  719. }
  720. if( hatMsStyle( i, Style::AuswahlRahmen ) && aRahmenListe )
  721. {
  722. tf->setRahmenZ( tmpRahmen );
  723. tf->setStyle( TextFeld::Style::Rahmen, tmpR );
  724. }
  725. }
  726. }
  727. dy += tf->getHeight();
  728. }
  729. if( vertikalScrollBar )
  730. vertikalScrollBar->getScrollData()->max = maxHeight;
  731. }
  732. zRObj.releaseDrawOptions();
  733. unlockZeichnung();
  734. }
  735. int AuswahlListe::getKlickEintrag( int my )
  736. {
  737. if( !tfListe )
  738. return -1;
  739. entries = tfListe->getEintragAnzahl();
  740. int y = 0;
  741. if( hatStyle( Style::VScroll ) && vertikalScrollBar )
  742. y -= vertikalScrollBar->getScroll();
  743. for( int i = 0; i < entries; ++i )
  744. {
  745. y += tfListe->z( i )->getHeight();
  746. if( y > my )
  747. return i;
  748. }
  749. return -1;
  750. }
  751. void AuswahlListe::setAuswahl( int ausw ) // setzt die Auswahl
  752. {
  753. if( hatStyleNicht( Style::MultiSelect ) )
  754. auswahl = ausw;
  755. else if( styles )
  756. {
  757. for( int i = 0; i < entries; ++i )
  758. removeMsStyle( i, Style::Selected );
  759. addMsStyle( ausw, Style::Selected );
  760. }
  761. }
  762. void AuswahlListe::deSelect()
  763. {
  764. if( hatStyleNicht( Style::MultiSelect ) )
  765. auswahl = -1;
  766. else if( styles )
  767. {
  768. for( int i = 0; i < entries; ++i )
  769. {
  770. removeMsStyle( i, Style::Selected );
  771. }
  772. }
  773. }
  774. // constant
  775. int AuswahlListe::getEintragAnzahl() const // gibt die Anzahl der Einträge zurück
  776. {
  777. return entries;
  778. }
  779. int AuswahlListe::getAuswahl() const // gibt den ersten ausgewählten Eintrag zurück
  780. {
  781. return auswahl;
  782. }
  783. int AuswahlListe::getEintragPos( Text *eintragText ) // gibt die Position des eintrages mit dem entsprechenden Textes zurück
  784. {
  785. for( int i = 0; i < entries; ++i )
  786. {
  787. if( tfListe->z( i )->zText()->istGleich( eintragText->getText() ) )
  788. {
  789. eintragText->release();
  790. return i;
  791. }
  792. }
  793. return -1;
  794. }
  795. TextFeld *AuswahlListe::getEintrag( int pos ) const // gibt den pos- ten Eintrag zurück
  796. {
  797. if( !tfListe )
  798. return 0;
  799. TextFeld *ret = (TextFeld *)tfListe->get( pos );
  800. if( ret )
  801. return dynamic_cast<TextFeld *>( ret->getThis() );
  802. return 0;
  803. }
  804. TextFeld *AuswahlListe::zEintrag( int pos ) const
  805. {
  806. if( !tfListe )
  807. return 0;
  808. return (TextFeld *)tfListe->z( pos );
  809. }
  810. Rahmen *AuswahlListe::getARahmen() const // gibt den Auswahl Rahmen zurück (ohne MultiStyled)
  811. {
  812. if( aRahmen )
  813. return dynamic_cast<Rahmen *>( aRahmen->getThis() );
  814. return 0;
  815. }
  816. Rahmen *AuswahlListe::zARahmen() const
  817. {
  818. return aRahmen;
  819. }
  820. int AuswahlListe::getAHFarbe() const // gibt die Auswahl Hintergrund Farbe zurück (ohne MultiStyled)
  821. {
  822. return ahFarbe;
  823. }
  824. Bild *AuswahlListe::getAHBild() const // gibt das Auswahl Hintergrund Bild zurück (ohne MultiStyled)
  825. {
  826. if( ahBild )
  827. return dynamic_cast<Bild *>( ahBild->getThis() );
  828. return 0;
  829. }
  830. Bild *AuswahlListe::zAHBild() const
  831. {
  832. return ahBild;
  833. }
  834. AlphaFeld *AuswahlListe::getABuffer() const // gibt den Auswahl Buffer zurück (ohne MultiStyled)
  835. {
  836. if( aBuffer )
  837. return dynamic_cast<AlphaFeld *>( aBuffer->getThis() );
  838. return 0;
  839. }
  840. AlphaFeld *AuswahlListe::zABuffer() const
  841. {
  842. return aBuffer;
  843. }
  844. Rahmen *AuswahlListe::getARahmen( int pos ) const // gibt den Auswahl Rahmen zurück (mit MultiStyled)
  845. {
  846. Rahmen *ret = 0;
  847. if( aRahmenListe )
  848. ret = (Rahmen *)aRahmenListe->get( pos );
  849. if( ret )
  850. return dynamic_cast<Rahmen *>( ret->getThis() );
  851. return 0;
  852. }
  853. Rahmen *AuswahlListe::zARahmen( int pos ) const
  854. {
  855. Rahmen *ret = 0;
  856. if( aRahmenListe )
  857. ret = (Rahmen *)aRahmenListe->z( pos );
  858. return ret;
  859. }
  860. int AuswahlListe::getAHFarbe( int pos ) const // gibt die Auswahl Hintergrund Farbe zurück (mit MultiStyled)
  861. {
  862. if( ahFarbeListe && ahFarbeListe->hat( pos ) )
  863. return ahFarbeListe->get( pos );
  864. return 0;
  865. }
  866. Bild *AuswahlListe::getAHBild( int pos ) const // gibt das Auswahl Hintergrund Bild zurück (mit MultiStyled)
  867. {
  868. Bild *ret = 0;
  869. if( ahBildListe )
  870. ret = (Bild *)ahBildListe->get( pos );
  871. if( ret )
  872. return dynamic_cast<Bild *>( ret->getThis() );
  873. return 0;
  874. }
  875. Bild *AuswahlListe::zAHBild( int pos ) const
  876. {
  877. Bild *ret = 0;
  878. if( ahBildListe )
  879. ret = (Bild *)ahBildListe->z( pos );
  880. return ret;
  881. }
  882. AlphaFeld *AuswahlListe::getABuffer( int pos ) const // gibt den Auswahl Buffer zurück (mit MultiStyled)
  883. {
  884. AlphaFeld *ret = 0;
  885. if( aBufferListe )
  886. ret = (AlphaFeld *)aBufferListe->get( pos );
  887. if( ret )
  888. return dynamic_cast<AlphaFeld *>( ret->getThis() );
  889. return 0;
  890. }
  891. AlphaFeld *AuswahlListe::zABuffer( int pos ) const
  892. {
  893. AlphaFeld *ret = 0;
  894. if( aBufferListe )
  895. ret = (AlphaFeld *)aBufferListe->z( pos );
  896. return ret;
  897. }
  898. bool AuswahlListe::hatMsStyle( int pos, __int64 style ) const // prüft ob style vorhanden (mit MultiStyled)
  899. {
  900. __int64 st = 0;
  901. if( styles )
  902. st = styles->get( pos );
  903. return ( st | style ) == st;
  904. }
  905. bool AuswahlListe::hatMsStyleNicht( int pos, __int64 style ) const // prüft obt style nicht vorhanden (mit MultiStyled)
  906. {
  907. __int64 st = 0;
  908. if( styles )
  909. st = styles->get( pos );
  910. return ( st | style ) != st;
  911. }