Liste.cpp 30 KB

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