Liste.cpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978
  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. auswahl( -1 ),
  20. ahFarbe( 0xFF000000 ),
  21. ahBild( 0 ),
  22. aBuffer( 0 ),
  23. aRahmen( 0 ),
  24. styles( 0 ),
  25. ahFarbeListe( 0 ),
  26. ahBildListe( 0 ),
  27. aBufferListe( 0 ),
  28. aRahmenListe( 0 ),
  29. schrift( 0 )
  30. {
  31. style = 0;
  32. this->setMausEreignis( _ret1ME );
  33. this->setTastaturEreignis( _ret1TE );
  34. }
  35. // Destruktor
  36. AuswahlListe::~AuswahlListe()
  37. {
  38. if( tfListe )
  39. tfListe->release();
  40. if( ahBild )
  41. ahBild->release();
  42. if( aBuffer )
  43. aBuffer->release();
  44. if( aRahmen )
  45. aRahmen->release();
  46. if( styles )
  47. styles->release();
  48. if( ahFarbeListe )
  49. ahFarbeListe->release();
  50. if( ahBildListe )
  51. ahBildListe->release();
  52. if( aBufferListe )
  53. aBufferListe->release();
  54. if( aRahmenListe )
  55. aRahmenListe->release();
  56. if( schrift )
  57. schrift->release();
  58. }
  59. void AuswahlListe::doMausEreignis( MausEreignis& me, bool userRet )
  60. {
  61. if( !userRet || hatStyleNicht( Style::Erlaubt ) )
  62. return;
  63. if( ZeichnungHintergrund::hatStyle( Style::VScroll ) && vertikalScrollBar )
  64. {
  65. int rbr = 0;
  66. if( rahmen && ZeichnungHintergrund::hatStyle( Style::Rahmen ) )
  67. rbr = rahmen->getRBreite();
  68. if( ((me.mx > gr.x - 15 - rbr) || me.id == ME_UScroll || me.id == ME_DScroll) && me.id != ME_Betritt && me.id != ME_Leaves )
  69. {
  70. vertikalScrollBar->doMausMessage( gr.x - rbr - 15, rbr, 15, gr.y - rbr * 2, me );
  71. me.verarbeitet = 1;
  72. }
  73. }
  74. if( !me.verarbeitet && me.id == ME_RLinks )
  75. {
  76. int eintr = getKlickEintrag( me.my );
  77. if( eintr >= 0 )
  78. {
  79. if( hatStyleNicht( Style::MultiSelect ) )
  80. {
  81. auswahl = eintr;
  82. rend = 1;
  83. }
  84. else
  85. {
  86. bool shift = TastenStand[ T_Shift ];
  87. bool strg = TastenStand[ T_Strg ];
  88. if( strg )
  89. {
  90. setMsStyle( eintr, Style::Selected, hatMsStyleNicht( eintr, Style::Selected ) );
  91. auswahl = eintr;
  92. }
  93. else if( shift && auswahl != -1 )
  94. {
  95. deSelect();
  96. int beg = auswahl, end = eintr;
  97. if( beg > end )
  98. {
  99. int tmp = end;
  100. end = beg;
  101. beg = tmp;
  102. }
  103. for( int i = beg; i <= end; ++i )
  104. {
  105. addMsStyle( i, Style::Selected );
  106. }
  107. }
  108. else
  109. {
  110. deSelect();
  111. addMsStyle( eintr, Style::Selected );
  112. auswahl = eintr;
  113. }
  114. }
  115. }
  116. else
  117. deSelect();
  118. }
  119. me.verarbeitet = 1;
  120. }
  121. bool AuswahlListe::hatStyle( int styleSet, int styleCheck ) const
  122. {
  123. return (styleSet | styleCheck) == styleSet;
  124. }
  125. // nicht constant
  126. void AuswahlListe::update() // aktualisiert die Auswahl Liste
  127. {
  128. int rbr = 0;
  129. if( rahmen )
  130. {
  131. rbr = rahmen->getRBreite();
  132. rahmen->setPosition( 0, 0 );
  133. rahmen->setSize( gr.x, gr.y );
  134. }
  135. if( hintergrundFeld )
  136. {
  137. hintergrundFeld->setPosition( rbr, rbr );
  138. hintergrundFeld->setSize( gr.x - rbr * 2, gr.y - rbr * 2 );
  139. }
  140. if( hatStyleNicht( Style::MultiStyled ) && tfListe )
  141. {
  142. bool FeldRahmen = ZeichnungHintergrund::hatStyle( Style::FeldRahmen );
  143. bool FeldHintergrund = ZeichnungHintergrund::hatStyle( Style::FeldHintergrund );
  144. bool FeldHBild = ZeichnungHintergrund::hatStyle( Style::FeldHBild );
  145. bool FeldHAlpha = ZeichnungHintergrund::hatStyle( Style::FeldHAlpha );
  146. bool FeldBuffer = ZeichnungHintergrund::hatStyle( Style::FeldBuffer );
  147. for( TextFeld* tf : *tfListe )
  148. {
  149. tf->setStyle( TextFeld::Style::Rahmen, FeldRahmen );
  150. tf->setStyle( TextFeld::Style::Hintergrund, FeldHintergrund );
  151. tf->setStyle( TextFeld::Style::HBild, FeldHBild );
  152. tf->setStyle( TextFeld::Style::HAlpha, FeldHAlpha );
  153. tf->setStyle( TextFeld::Style::Buffered, FeldBuffer );
  154. if( schrift )
  155. tf->setSchriftZ( dynamic_cast<Schrift*>(schrift->getThis()) );
  156. }
  157. }
  158. if( ZeichnungHintergrund::hatStyle( Style::MultiStyled ) && tfListe && styles )
  159. {
  160. auto style = styles->begin();
  161. for( auto tf = tfListe->begin(); tf; tf++, style++ )
  162. {
  163. tf->setStyle( TextFeld::Style::Rahmen, hatStyle( style, Style::FeldRahmen ) );
  164. tf->setStyle( TextFeld::Style::Hintergrund, hatStyle( style, Style::FeldHintergrund ) );
  165. tf->setStyle( TextFeld::Style::HBild, hatStyle( style, Style::FeldHBild ) );
  166. tf->setStyle( TextFeld::Style::HAlpha, hatStyle( style, Style::FeldHAlpha ) );
  167. tf->setStyle( TextFeld::Style::Buffered, hatStyle( style, Style::FeldBuffer ) );
  168. }
  169. }
  170. rend = 1;
  171. }
  172. void AuswahlListe::addEintrag( Text* txt ) // fügt einen Eintrag hinzu
  173. {
  174. TextFeld* tf = new TextFeld();
  175. tf->setStyle( TextFeld::Style::Center | TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen );
  176. tf->setSchriftFarbe( 0xFFFFFFFF );
  177. tf->setRahmenBreite( 1 );
  178. tf->setRahmenFarbe( 0xFFFFFFFF );
  179. tf->setTextZ( txt );
  180. tf->setSize( 0, 20 );
  181. addEintragZ( tf );
  182. rend = 1;
  183. }
  184. void AuswahlListe::addEintrag( const char* txt )
  185. {
  186. Text* tx = new Text( txt );
  187. addEintrag( tx );
  188. rend = 1;
  189. }
  190. void AuswahlListe::addEintragZ( TextFeld* tf )
  191. {
  192. if( !tfListe )
  193. tfListe = new RCArray< TextFeld >();
  194. if( schrift && (!tf->zSchrift() || hatStyleNicht( Style::MultiStyled )) )
  195. tf->setSchriftZ( dynamic_cast<Schrift*>(schrift->getThis()) );
  196. tfListe->add( tf );
  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( dynamic_cast<Schrift*>(schrift->getThis()) );
  223. tfListe->add( tf, pos );
  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. rend = 1;
  284. }
  285. void AuswahlListe::setSchriftZ( Schrift* schrift ) // legt die Schrift der Einträge fest
  286. {
  287. if( this->schrift )
  288. this->schrift->release();
  289. this->schrift = schrift;
  290. rend = 1;
  291. }
  292. void AuswahlListe::setVScrollZuEintrag( int eintrag ) // scrollt zum Eintrag
  293. {
  294. if( vertikalScrollBar )
  295. {
  296. if( eintrag > tfListe->getLastIndex() )
  297. eintrag = tfListe->getLastIndex();
  298. int y = 0;
  299. for( int i = 0; i < eintrag; i++ )
  300. y += tfListe->z( i ) ? tfListe->z( i )->getHeight() : 0;
  301. vertikalScrollBar->scroll( y );
  302. }
  303. }
  304. void AuswahlListe::updateVScroll() // scrollt zur Curser Position oder nach Unten
  305. {
  306. if( vertikalScrollBar )
  307. {
  308. int y = 0;
  309. for( TextFeld* tf : *tfListe )
  310. y += (TextFeld*)tf ? tf->getHeight() : 0;
  311. vertikalScrollBar->update( y, gr.y - ((rahmen && ZeichnungHintergrund::hatStyle( TextFeld::Style::Rahmen )) ? rahmen->getRBreite() : 0) );
  312. }
  313. }
  314. void AuswahlListe::setALRZ( Rahmen* rahmen ) // setzt einen Zeiger zum Auswahl Rahmen (nur ohne MulitStyled)
  315. {
  316. if( aRahmen )
  317. aRahmen->release();
  318. aRahmen = rahmen;
  319. rend = 1;
  320. }
  321. void AuswahlListe::setALRBreite( int br ) // setzt die Breite des Auswahl Rahmens (nur ohne MultiStyled)
  322. {
  323. if( !aRahmen )
  324. aRahmen = new LRahmen();
  325. aRahmen->setRamenBreite( br );
  326. rend = 1;
  327. }
  328. void AuswahlListe::setALRFarbe( int fc ) // setzt die Farbe des Auswahl Rahmens (nur ohne MultiStyled)
  329. {
  330. if( !aRahmen )
  331. aRahmen = new LRahmen();
  332. aRahmen->setFarbe( fc );
  333. rend = 1;
  334. }
  335. void AuswahlListe::setAAFZ( AlphaFeld* buffer ) // setzt einen Zeiger zum Auswahl AlpaFeld (nur ohne MultiStyled)
  336. {
  337. if( aBuffer )
  338. aBuffer->release();
  339. aBuffer = buffer;
  340. rend = 1;
  341. }
  342. void AuswahlListe::setAAFStrength( int st ) // setzt die Stärke des Auswahl Hintergrund Buffers (nur ohne MultiStyled)
  343. {
  344. if( !aBuffer )
  345. aBuffer = new AlphaFeld();
  346. aBuffer->setStrength( st );
  347. rend = 1;
  348. }
  349. void AuswahlListe::setAAFFarbe( int fc ) // setzt die Farbe des Auswahl Hintergrund Buffers (nur ohne MultiStyled)
  350. {
  351. if( !aBuffer )
  352. aBuffer = new AlphaFeld();
  353. aBuffer->setFarbe( fc );
  354. rend = 1;
  355. }
  356. void AuswahlListe::setAHBild( Bild* bild ) // setzt das Auswahl Hintergrund Bild (nur ohne MultiStyled)
  357. {
  358. if( !ahBild )
  359. ahBild = new Bild();
  360. ahBild->neuBild( bild->getBreite(), bild->getHeight(), 0 );
  361. int* buff1 = ahBild->getBuffer();
  362. int* buff2 = bild->getBuffer();
  363. for( int i = 0; i < bild->getBreite() * bild->getHeight(); ++i )
  364. buff1[ i ] = buff2[ i ];
  365. bild->release();
  366. rend = 1;
  367. }
  368. void AuswahlListe::setAHFarbe( int f ) // setzt einen Zeiger zur Auswahl Hintergrund Farbe (nur ohne MultiStyled)
  369. {
  370. ahFarbe = f;
  371. rend = 1;
  372. }
  373. void AuswahlListe::setAHBildZ( Bild* b ) // setzt einen Zeiger zum Hintergrund Bild (nur ohne MultiStyled)
  374. {
  375. if( ahBild )
  376. ahBild->release();
  377. ahBild = b;
  378. rend = 1;
  379. }
  380. void AuswahlListe::setALRZ( int pos, Rahmen* rahmen ) // setzt einen Zeiger zum Auswahl Rahmen (nur mit MulitStyled)
  381. {
  382. if( !aRahmenListe )
  383. aRahmenListe = new RCArray< Rahmen >();
  384. aRahmenListe->set( rahmen, pos );
  385. rend = 1;
  386. }
  387. void AuswahlListe::setALRBreite( int pos, int br ) // setzt die Breite des Auswahl Rahmens (nur mit MultiStyled)
  388. {
  389. if( !aRahmenListe )
  390. aRahmenListe = new RCArray< Rahmen >();
  391. if( !aRahmenListe->z( pos ) )
  392. aRahmenListe->set( new LRahmen(), pos );
  393. aRahmenListe->z( pos )->setRamenBreite( br );
  394. rend = 1;
  395. }
  396. void AuswahlListe::setALRFarbe( int pos, int fc ) // setzt die Farbe des Auswahl Rahmens (nur mit MultiStyled)
  397. {
  398. if( !aRahmenListe )
  399. aRahmenListe = new RCArray< Rahmen >();
  400. if( !aRahmenListe->z( pos ) )
  401. aRahmenListe->set( new LRahmen(), pos );
  402. aRahmenListe->z( pos )->setFarbe( fc );
  403. rend = 1;
  404. }
  405. void AuswahlListe::setAAFZ( int pos, AlphaFeld* buffer ) // setzt einen Zeiger zum Auswahl AlpaFeld (nur mit MultiStyled)
  406. {
  407. if( !aBufferListe )
  408. aBufferListe = new RCArray< AlphaFeld >();
  409. aBufferListe->set( buffer, pos );
  410. rend = 1;
  411. }
  412. void AuswahlListe::setAAFStrength( int pos, int st ) // setzt die Stärke des Auswahl Hintergrund Buffers (nur mit MultiStyled)
  413. {
  414. if( !aBufferListe )
  415. aBufferListe = new RCArray< AlphaFeld >();
  416. if( !aBufferListe->z( pos ) )
  417. aBufferListe->set( new AlphaFeld(), pos );
  418. aBufferListe->z( pos )->setStrength( st );
  419. rend = 1;
  420. }
  421. void AuswahlListe::setAAFFarbe( int pos, int fc ) // setzt die Farbe des Auswahl Hintergrund Buffers (nur mit MultiStyled)
  422. {
  423. if( !aBufferListe )
  424. aBufferListe = new RCArray< AlphaFeld >();
  425. if( !aBufferListe->z( pos ) )
  426. aBufferListe->set( new AlphaFeld(), pos );
  427. aBufferListe->z( pos )->setFarbe( fc );
  428. rend = 1;
  429. }
  430. void AuswahlListe::setAHBild( int pos, Bild* bild ) // setzt das Auswahl Hintergrund Bild (nur mit MultiStyled)
  431. {
  432. if( ahBildListe )
  433. ahBildListe = new RCArray< Bild >();
  434. #pragma warning( once : 6011 )
  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 > tfListe->getEintragAnzahl() )
  507. auswahl = tfListe->getEintragAnzahl();
  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 > tfListe->getEintragAnzahl() )
  526. auswahl = tfListe->getEintragAnzahl();
  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( !ZeichnungHintergrund::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 && ZeichnungHintergrund::hatStyle( Style::Rahmen ) )
  563. rbr = rahmen->getRBreite();
  564. if( tfListe )
  565. {
  566. int maxHeight = 0;
  567. int dx = 0, dy = 0;
  568. if( vertikalScrollBar && ZeichnungHintergrund::hatStyle( Style::VScroll ) )
  569. dy -= vertikalScrollBar->getScroll();
  570. int mdy = innenSize.y + rbr;
  571. auto style = styles->begin();
  572. int i = 0;
  573. for( auto tf = tfListe->begin(); tf; tf++, style++, i++ )
  574. {
  575. if( dy + tf->getHeight() > mdy && !(vertikalScrollBar && ZeichnungHintergrund::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( ZeichnungHintergrund::hatStyle( Style::MultiSelect ) && styles )
  582. selected = hatStyle( style, 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( ZeichnungHintergrund::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, ZeichnungHintergrund::hatStyle( Style::AuswahlBuffer ) );
  604. }
  605. if( ZeichnungHintergrund::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, ZeichnungHintergrund::hatStyle( Style::Hintergrund ) );
  611. if( ZeichnungHintergrund::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, ZeichnungHintergrund::hatStyle( Style::HBild ) );
  617. }
  618. if( ZeichnungHintergrund::hatStyle( Style::AuswahlHAlpha ) )
  619. {
  620. tmpHAlpha = tf->hatStyle( TextFeld::Style::HAlpha );
  621. tf->setStyle( TextFeld::Style::HAlpha, ZeichnungHintergrund::hatStyle( Style::AuswahlHAlpha ) );
  622. }
  623. }
  624. if( ZeichnungHintergrund::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, ZeichnungHintergrund::hatStyle( Style::AuswahlRahmen ) );
  630. }
  631. }
  632. else
  633. {
  634. if( hatStyle( style, 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, hatStyle( style, Style::AuswahlBuffer ) );
  640. }
  641. if( hatStyle( style, Style::AuswahlHintergrund ) )
  642. {
  643. tmpH = tf->hatStyle( Style::Hintergrund );
  644. tf->setStyle( TextFeld::Style::Hintergrund, hatStyle( style, Style::AuswahlHintergrund ) );
  645. if( ahFarbeListe && ahFarbeListe->hat( i ) )
  646. {
  647. tmpHFarbe = tf->getHintergrundFarbe();
  648. tf->setHintergrundFarbe( ahFarbeListe->get( i ) );
  649. }
  650. if( hatStyle( style, 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, hatStyle( style, Style::HBild ) );
  656. }
  657. if( hatStyle( style, Style::AuswahlHAlpha ) )
  658. {
  659. tmpHAlpha = tf->hatStyle( TextFeld::Style::HAlpha );
  660. tf->setStyle( TextFeld::Style::HAlpha, hatStyle( style, Style::AuswahlHAlpha ) );
  661. }
  662. }
  663. if( hatStyle( style, 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, hatStyle( style, Style::AuswahlRahmen ) );
  669. }
  670. }
  671. }
  672. tf->render( zRObj );
  673. if( selected )
  674. {
  675. if( hatStyleNicht( Style::MultiStyled ) || !styles )
  676. {
  677. if( ZeichnungHintergrund::hatStyle( Style::AuswahlBuffer ) )
  678. {
  679. tf->setAlphaFeldZ( tmpBuffer );
  680. tf->setStyle( TextFeld::Style::Buffered, tmpB );
  681. }
  682. if( ZeichnungHintergrund::hatStyle( Style::AuswahlHintergrund ) )
  683. {
  684. tf->setHintergrundFarbe( tmpHFarbe );
  685. tf->setStyle( TextFeld::Style::Hintergrund, tmpH );
  686. if( ZeichnungHintergrund::hatStyle( Style::AuswahlHBild ) )
  687. {
  688. tf->setHintergrundBildZ( tmpHBild );
  689. tf->setStyle( TextFeld::Style::HBild, tmpHB );
  690. }
  691. if( ZeichnungHintergrund::hatStyle( Style::AuswahlHAlpha ) )
  692. tf->setStyle( TextFeld::Style::HAlpha, tmpHAlpha );
  693. }
  694. if( ZeichnungHintergrund::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. int y = 0;
  740. if( ZeichnungHintergrund::hatStyle( Style::VScroll ) && vertikalScrollBar )
  741. y -= vertikalScrollBar->getScroll();
  742. int i = 0;
  743. for( auto tf = tfListe->begin(); tf; tf++, i++ )
  744. {
  745. y += tf->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 < styles->getEintragAnzahl(); ++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 < styles->getEintragAnzahl(); ++i )
  769. removeMsStyle( i, Style::Selected );
  770. }
  771. }
  772. // constant
  773. int AuswahlListe::getEintragAnzahl() const // gibt die Anzahl der Einträge zurück
  774. {
  775. return tfListe ? tfListe->getEintragAnzahl() : 0;
  776. }
  777. int AuswahlListe::getAuswahl() const // gibt den ersten ausgewählten Eintrag zurück
  778. {
  779. return auswahl;
  780. }
  781. int AuswahlListe::getEintragPos( Text* eintragText ) // gibt die Position des eintrages mit dem entsprechenden Textes zurück
  782. {
  783. int i = 0;
  784. for( auto tf = tfListe->begin(); tf; tf++, i++ )
  785. {
  786. if( tf->zText()->istGleich( eintragText->getText() ) )
  787. {
  788. eintragText->release();
  789. return i;
  790. }
  791. }
  792. return -1;
  793. }
  794. TextFeld* AuswahlListe::getEintrag( int pos ) const // gibt den pos- ten Eintrag zurück
  795. {
  796. if( !tfListe )
  797. return 0;
  798. TextFeld* ret = (TextFeld*)tfListe->get( pos );
  799. if( ret )
  800. return dynamic_cast<TextFeld*>(ret->getThis());
  801. return 0;
  802. }
  803. TextFeld* AuswahlListe::zEintrag( int pos ) const
  804. {
  805. if( !tfListe )
  806. return 0;
  807. return (TextFeld*)tfListe->z( pos );
  808. }
  809. Rahmen* AuswahlListe::getARahmen() const // gibt den Auswahl Rahmen zurück (ohne MultiStyled)
  810. {
  811. if( aRahmen )
  812. return dynamic_cast<Rahmen*>(aRahmen->getThis());
  813. return 0;
  814. }
  815. Rahmen* AuswahlListe::zARahmen() const
  816. {
  817. return aRahmen;
  818. }
  819. int AuswahlListe::getAHFarbe() const // gibt die Auswahl Hintergrund Farbe zurück (ohne MultiStyled)
  820. {
  821. return ahFarbe;
  822. }
  823. Bild* AuswahlListe::getAHBild() const // gibt das Auswahl Hintergrund Bild zurück (ohne MultiStyled)
  824. {
  825. if( ahBild )
  826. return dynamic_cast<Bild*>(ahBild->getThis());
  827. return 0;
  828. }
  829. Bild* AuswahlListe::zAHBild() const
  830. {
  831. return ahBild;
  832. }
  833. AlphaFeld* AuswahlListe::getABuffer() const // gibt den Auswahl Buffer zurück (ohne MultiStyled)
  834. {
  835. if( aBuffer )
  836. return dynamic_cast<AlphaFeld*>(aBuffer->getThis());
  837. return 0;
  838. }
  839. AlphaFeld* AuswahlListe::zABuffer() const
  840. {
  841. return aBuffer;
  842. }
  843. Rahmen* AuswahlListe::getARahmen( int pos ) const // gibt den Auswahl Rahmen zurück (mit MultiStyled)
  844. {
  845. Rahmen* ret = 0;
  846. if( aRahmenListe )
  847. ret = (Rahmen*)aRahmenListe->get( pos );
  848. if( ret )
  849. return dynamic_cast<Rahmen*>(ret->getThis());
  850. return 0;
  851. }
  852. Rahmen* AuswahlListe::zARahmen( int pos ) const
  853. {
  854. Rahmen* ret = 0;
  855. if( aRahmenListe )
  856. ret = (Rahmen*)aRahmenListe->z( pos );
  857. return ret;
  858. }
  859. int AuswahlListe::getAHFarbe( int pos ) const // gibt die Auswahl Hintergrund Farbe zurück (mit MultiStyled)
  860. {
  861. if( ahFarbeListe && ahFarbeListe->hat( pos ) )
  862. return ahFarbeListe->get( pos );
  863. return 0;
  864. }
  865. Bild* AuswahlListe::getAHBild( int pos ) const // gibt das Auswahl Hintergrund Bild zurück (mit MultiStyled)
  866. {
  867. Bild* ret = 0;
  868. if( ahBildListe )
  869. ret = (Bild*)ahBildListe->get( pos );
  870. if( ret )
  871. return dynamic_cast<Bild*>(ret->getThis());
  872. return 0;
  873. }
  874. Bild* AuswahlListe::zAHBild( int pos ) const
  875. {
  876. Bild* ret = 0;
  877. if( ahBildListe )
  878. ret = (Bild*)ahBildListe->z( pos );
  879. return ret;
  880. }
  881. AlphaFeld* AuswahlListe::getABuffer( int pos ) const // gibt den Auswahl Buffer zurück (mit MultiStyled)
  882. {
  883. AlphaFeld* ret = 0;
  884. if( aBufferListe )
  885. ret = (AlphaFeld*)aBufferListe->get( pos );
  886. if( ret )
  887. return dynamic_cast<AlphaFeld*>(ret->getThis());
  888. return 0;
  889. }
  890. AlphaFeld* AuswahlListe::zABuffer( int pos ) const
  891. {
  892. AlphaFeld* ret = 0;
  893. if( aBufferListe )
  894. ret = (AlphaFeld*)aBufferListe->z( pos );
  895. return ret;
  896. }
  897. bool AuswahlListe::hatMsStyle( int pos, __int64 style ) const // prüft ob style vorhanden (mit MultiStyled)
  898. {
  899. __int64 st = 0;
  900. if( styles )
  901. st = styles->get( pos );
  902. return (st | style) == st;
  903. }
  904. bool AuswahlListe::hatMsStyleNicht( int pos, __int64 style ) const // prüft obt style nicht vorhanden (mit MultiStyled)
  905. {
  906. __int64 st = 0;
  907. if( styles )
  908. st = styles->get( pos );
  909. return (st | style) != st;
  910. }