StatistikChat.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. #include "StatistikChat.h"
  2. #include <Punkt.h>
  3. #include <DateiSystem.h>
  4. #include <MausEreignis.h>
  5. #include <AlphaFeld.h>
  6. #include <Scroll.h>
  7. #include <Rahmen.h>
  8. #include <TastaturEreignis.h>
  9. #include "../../Initialisierung/Initialisierung.h"
  10. // Inhalt der ChatListeSpieler Klasse aus StatistikChat.h
  11. // Konstruktor
  12. ChatListeSpieler::ChatListeSpieler( int accountId, int eigeneId, Schrift *zSchrift, BilderV *bilder, InformationKlientV *zInfoc,
  13. bool istFreund, void( *addChatF )( void*, int ), void( *addFreundF )( void*, int ),
  14. void( *accountAnsehenF )( void *, int ), void *param )
  15. : addChatF( addChatF ),
  16. addFreundF( addFreundF ),
  17. accountAnsehenF( accountAnsehenF ),
  18. nachrichtParam( param ),
  19. accountId( accountId ),
  20. bg( new AlphaFeld() ),
  21. name( initTextFeld( 0, 0, 133, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Rahmen | TextFeld::Style::VCenter, "" ) ),
  22. accountAnsehen( initKnopf( 133, 0, 20, 20, 0, 0, "" ) ),
  23. nachrichtSenden( initKnopf( 153, 0, 20, 20, 0, 0, "" ) ),
  24. freundesanfrageSenden( initKnopf( 173, 0, 20, 20, 0, 0, "" ) ),
  25. pos( 0, 0 ),
  26. gr( 133, 20 ),
  27. online( 1 ),
  28. minKnopfX( 113 - ( ( ( accountId != eigeneId ) + !istFreund ) * 20 ) ),
  29. knopfX( 133 ),
  30. mausIn( 0 ),
  31. tickVal( 0 ),
  32. rend( 0 ),
  33. ref( 1 )
  34. {
  35. Bild *ansehenBild = bilder->get( "chat.ltdb/ansehen.png" );
  36. if( !ansehenBild )
  37. {
  38. LTDBDatei *datei = new LTDBDatei();
  39. datei->setDatei( new Text( "data/client/bilder/chat.ltdb" ) );
  40. datei->leseDaten( 0 );
  41. ansehenBild = datei->laden( 0, new Text( "ansehen.png" ) );
  42. datei->release();
  43. bilder->add( "chat.ltdb/ansehen.png", ansehenBild->getThis() );
  44. }
  45. Bild *nachrichtBild = bilder->get( "chat.ltdb/nachricht.png" );
  46. if( !nachrichtBild )
  47. {
  48. LTDBDatei *datei = new LTDBDatei();
  49. datei->setDatei( new Text( "data/client/bilder/chat.ltdb" ) );
  50. datei->leseDaten( 0 );
  51. nachrichtBild = datei->laden( 0, new Text( "nachricht.png" ) );
  52. datei->release();
  53. bilder->add( "chat.ltdb/nachricht.png", nachrichtBild->getThis() );
  54. }
  55. Bild *einladungBild = bilder->get( "chat.ltdb/neuerfreund.png" );
  56. if( !nachrichtBild )
  57. {
  58. LTDBDatei *datei = new LTDBDatei();
  59. datei->setDatei( new Text( "data/client/bilder/chat.ltdb" ) );
  60. datei->leseDaten( 0 );
  61. einladungBild = datei->laden( 0, new Text( "neuerfreund.png" ) );
  62. datei->release();
  63. bilder->add( "chat.ltdb/neuerfreund.png", einladungBild->getThis() );
  64. }
  65. bg->setSize( gr );
  66. bg->setFarbe( 0x0000FF00 );
  67. bg->setStrength( -4 );
  68. name->setText( zInfoc->getSpielerName( accountId ) );
  69. accountAnsehen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
  70. accountAnsehen->setHintergrundBildZ( ansehenBild );
  71. nachrichtSenden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
  72. nachrichtSenden->setHintergrundBildZ( nachrichtBild );
  73. freundesanfrageSenden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
  74. freundesanfrageSenden->setHintergrundBildZ( einladungBild );
  75. }
  76. // Destruktor
  77. ChatListeSpieler::~ChatListeSpieler()
  78. {
  79. bg->release();
  80. name->release();
  81. accountAnsehen->release();
  82. nachrichtSenden->release();
  83. freundesanfrageSenden->release();
  84. }
  85. // nicht constant
  86. void ChatListeSpieler::setOffline()
  87. {
  88. online = 0;
  89. }
  90. void ChatListeSpieler::setPosition( int y )
  91. {
  92. if( pos.y != y )
  93. rend = 1;
  94. pos.y = y;
  95. }
  96. void ChatListeSpieler::doMausEreignis( MausEreignis &me )
  97. {
  98. int mx = me.mx;
  99. int my = me.my;
  100. me.mx -= pos.x;
  101. me.my -= pos.y;
  102. if( me.mx > 0 && me.mx < gr.x && me.my > 0 && me.my < gr.y )
  103. mausIn = 1;
  104. else
  105. mausIn = 0;
  106. me.mx += 133 - knopfX;
  107. bool vera = me.verarbeitet;
  108. accountAnsehen->doMausEreignis( me );
  109. int aktion = ( me.verarbeitet && !vera ) ? 1 : 0;
  110. nachrichtSenden->doMausEreignis( me );
  111. aktion = ( me.verarbeitet && !vera && !aktion ) ? 2 : aktion;
  112. freundesanfrageSenden->doMausEreignis( me );
  113. aktion = ( me.verarbeitet && !vera && !aktion ) ? 3 : aktion;
  114. me.mx -= 133 - knopfX;
  115. if( me.id == ME_RLinks && mausIn )
  116. {
  117. switch( aktion )
  118. {
  119. case 1:
  120. accountAnsehenF( nachrichtParam, accountId );
  121. break;
  122. case 2:
  123. addChatF( nachrichtParam, accountId );
  124. break;
  125. case 3:
  126. addFreundF( nachrichtParam, accountId );
  127. break;
  128. }
  129. }
  130. me.mx = mx;
  131. me.my = my;
  132. }
  133. bool ChatListeSpieler::tick( double tickVal )
  134. {
  135. rend |= name->tick( tickVal );
  136. rend |= accountAnsehen->tick( tickVal );
  137. rend |= nachrichtSenden->tick( tickVal );
  138. rend |= freundesanfrageSenden->tick( tickVal );
  139. this->tickVal += tickVal * 60;
  140. int val = ( int )this->tickVal;
  141. if( val )
  142. {
  143. this->tickVal -= val;
  144. if( mausIn && knopfX != minKnopfX )
  145. {
  146. if( knopfX - val < minKnopfX )
  147. knopfX = minKnopfX;
  148. else
  149. knopfX -= val;
  150. rend = 1;
  151. }
  152. if( !mausIn && knopfX != gr.x )
  153. {
  154. if( knopfX + val > gr.x )
  155. knopfX = gr.x;
  156. else
  157. knopfX += val;
  158. rend = 1;
  159. }
  160. if( !online && bg->getFarbe() != 0x00FF0000 )
  161. {
  162. int g = ( bg->getFarbe() >> 8 ) & 0xFF;
  163. if( g - val < 0 )
  164. bg->setFarbe( 0x00FF0000 );
  165. else
  166. {
  167. bg->setFarbe( ( ( ( g - val ) << 8 ) & 0xFF00 ) | ( bg->getFarbe() & 0xFFFF00FF ) );
  168. bg->setFarbe( ( ( ( 255 - ( g - val ) ) << 16 ) & 0xFF0000 ) | ( bg->getFarbe() & 0xFF00FFFF ) );
  169. }
  170. rend = 1;
  171. }
  172. }
  173. bool ret = rend;
  174. rend = 0;
  175. return ret;
  176. }
  177. void ChatListeSpieler::render( Bild &zRObj )
  178. {
  179. if( !zRObj.setDrawOptions( pos, gr ) )
  180. return;
  181. bg->render( zRObj );
  182. name->render( zRObj );
  183. zRObj.addScrollOffset( 133 - knopfX, 0 );
  184. accountAnsehen->render( zRObj );
  185. nachrichtSenden->render( zRObj );
  186. freundesanfrageSenden->render( zRObj );
  187. zRObj.releaseDrawOptions();
  188. }
  189. // constant
  190. int ChatListeSpieler::getAccountId() const
  191. {
  192. return accountId;
  193. }
  194. // Reference Counting
  195. ChatListeSpieler *ChatListeSpieler::getThis()
  196. {
  197. ref++;
  198. return this;
  199. }
  200. ChatListeSpieler *ChatListeSpieler::release()
  201. {
  202. ref--;
  203. if( !ref )
  204. delete this;
  205. return 0;
  206. }
  207. // Inhalt der ChatListe Klasse aus StatistikChat.h
  208. // Konstruktor
  209. ChatListe::ChatListe( int eigeneId, InformationKlientV *infoc, Schrift *schrift, BilderV *bilder,
  210. void( *addChat )( void*, int ), void( *addFreund )( void*, int ),
  211. void( *accountAnsehen )( void *, int ), void *param )
  212. : addChat( addChat ),
  213. addFreund( addFreund ),
  214. accountAnsehen( accountAnsehen ),
  215. nachrichtParam( nachrichtParam ),
  216. eigeneId( eigeneId ),
  217. spieler( new RCArray< ChatListeSpieler >() ),
  218. vScroll( new VScrollBar() ),
  219. pos( 620, 295 ),
  220. gr( 150, 150 ),
  221. infoc( infoc ),
  222. schrift( schrift ),
  223. bilder( bilder ),
  224. ram( new LRahmen() ),
  225. rend( 0 ),
  226. ref( 1 )
  227. {
  228. vScroll->setKlickScroll( 10 );
  229. vScroll->update( 0, 148 );
  230. ram->setFarbe( 0xFFFFFFFF );
  231. ram->setSize( 150, 150 );
  232. }
  233. // Destruktor
  234. ChatListe::~ChatListe()
  235. {
  236. spieler->release();
  237. vScroll->release();
  238. infoc->release();
  239. schrift->release();
  240. ram->release();
  241. }
  242. // nicht constant
  243. void ChatListe::addSpieler( int accountId, bool istFreund )
  244. {
  245. int anz = spieler->getEintragAnzahl();
  246. for( int i = 0; i < anz; i++ )
  247. {
  248. if( spieler->z( i ) && spieler->z( i )->getAccountId() == accountId )
  249. return;
  250. }
  251. ChatListeSpieler *s = new ChatListeSpieler( accountId, eigeneId, schrift, bilder, infoc, istFreund, addChat, addFreund, accountAnsehen, nachrichtParam );
  252. s->setPosition( anz * 20 );
  253. spieler->add( s );
  254. rend = 1;
  255. }
  256. void ChatListe::setOffline( int accountId )
  257. {
  258. int anz = spieler->getEintragAnzahl();
  259. for( int i = 0; i < anz; i++ )
  260. {
  261. if( spieler->z( i ) && spieler->z( i )->getAccountId() == accountId )
  262. {
  263. spieler->z( i )->setOffline();
  264. return;
  265. }
  266. }
  267. }
  268. void ChatListe::doMausEreignis( MausEreignis &me )
  269. {
  270. int mx = me.mx;
  271. int my = me.my;
  272. me.mx -= pos.x;
  273. me.my -= pos.y - vScroll->getScroll();
  274. vScroll->doMausMessage( 134, 1, 15, 148, me );
  275. int anz = spieler->getEintragAnzahl();
  276. for( int i = 0; i < anz; i++ )
  277. {
  278. if( spieler->z( i ) )
  279. spieler->z( i )->doMausEreignis( me );
  280. }
  281. me.mx = mx;
  282. me.my = my;
  283. }
  284. bool ChatListe::tick( double tickVal )
  285. {
  286. rend |= vScroll->getRend();
  287. int anz = spieler->getEintragAnzahl();
  288. for( int i = 0; i < anz; i++ )
  289. {
  290. if( spieler->z( i ) )
  291. rend |= spieler->z( i )->tick( tickVal );
  292. }
  293. bool ret = rend;
  294. rend = 0;
  295. return ret;
  296. }
  297. void ChatListe::render( Bild &zRObj )
  298. {
  299. if( !zRObj.setDrawOptions( pos, gr ) )
  300. return;
  301. int anz = spieler->getEintragAnzahl();
  302. zRObj.addScrollOffset( 0, vScroll->getScroll() );
  303. for( int i = 0; i < anz; i++ )
  304. {
  305. if( spieler->z( i ) )
  306. spieler->z( i )->render( zRObj );
  307. }
  308. zRObj.addScrollOffset( 0, -vScroll->getScroll() );
  309. vScroll->render( 134, 1, 15, 148, zRObj );
  310. ram->render( zRObj );
  311. zRObj.releaseDrawOptions();
  312. }
  313. // constant
  314. // Reference Counting
  315. ChatListe *ChatListe::getThis()
  316. {
  317. ref++;
  318. return this;
  319. }
  320. ChatListe *ChatListe::release()
  321. {
  322. ref--;
  323. if( !ref )
  324. delete this;
  325. return 0;
  326. }
  327. // Inhalt der StatistikChat Klasse aus StatistikChat.h
  328. // Konstruktor
  329. StatistikChat::StatistikChat( int eigeneId, SpielKlientV *spielc, InformationKlientV *infoc, Schrift *schrift, BilderV *bilder,
  330. void( *addNachricht )( void *, Text *, Text *, Text *, Text *, char, void * ),
  331. void( *addChat )( void*, int ), void( *addFreund )( void*, int ),
  332. void( *accountAnsehen )( void *, int ), void *param )
  333. : addNachricht( addNachricht ),
  334. nachrichtParam( nachrichtParam ),
  335. spielc( spielc ),
  336. infoc( infoc ),
  337. verlauf( initTextFeld( 10, 295, 600, 150, schrift, TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VScroll | TextFeld::Style::Mehrzeilig, "" ) ),
  338. nachricht( initTextFeld( 10, 450, 575, 20, schrift, TextFeld::Style::TextFeld, "" ) ),
  339. senden( initKnopf( 590, 450, 20, 20, 0, 0, "" ) ),
  340. verlassen( initKnopf( 630, 450, 130, 20, schrift, Knopf::Style::Sichtbar, "Verlassen" ) ),
  341. spielerListe( new ChatListe( eigeneId, infoc->getThis(), schrift, bilder, addChat, addFreund, accountAnsehen, nachrichtParam ) ),
  342. beenden( 0 ),
  343. ref( 1 )
  344. {
  345. Bild *sendenBild = bilder->get( "chat.ltdb/senden.png" );
  346. if( !sendenBild )
  347. {
  348. LTDBDatei *datei = new LTDBDatei();
  349. datei->setDatei( new Text( "data/client/bilder/chat.ltdb" ) );
  350. datei->leseDaten( 0 );
  351. sendenBild = datei->laden( 0, new Text( "senden.png" ) );
  352. datei->release();
  353. bilder->add( "chat.ltdb/senden.png", sendenBild->getThis() );
  354. };
  355. senden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
  356. senden->setHintergrundBildZ( sendenBild );
  357. }
  358. // Destruktor
  359. StatistikChat::~StatistikChat()
  360. {
  361. spielc->release();
  362. infoc->release();
  363. verlauf->release();
  364. nachricht->release();
  365. senden->release();
  366. verlassen->release();
  367. spielerListe->release();
  368. }
  369. // nicht constant
  370. void StatistikChat::addSpieler( int accountId, bool istFreund )
  371. {
  372. spielerListe->addSpieler( accountId, istFreund );
  373. }
  374. void StatistikChat::spielerOffline( int accountId )
  375. {
  376. spielerListe->setOffline( accountId );
  377. }
  378. void StatistikChat::addChatNachricht( int vonAccount, char *nachricht )
  379. {
  380. Text *txt = vonAccount ? infoc->getSpielerName( vonAccount ) : 0;
  381. if( !txt )
  382. txt = new Text();
  383. else
  384. *txt += ": ";
  385. *txt += nachricht;
  386. *txt += "\n";
  387. verlauf->zSchrift()->textFormatieren( txt, verlauf->getBreite() - 15, 12 );
  388. verlauf->zText()->append( txt );
  389. verlauf->updateVScroll();
  390. }
  391. void StatistikChat::doMausEreignis( MausEreignis &me )
  392. {
  393. verlauf->doMausEreignis( me );
  394. nachricht->doMausEreignis( me );
  395. spielerListe->doMausEreignis( me );
  396. bool vera = me.verarbeitet;
  397. senden->doMausEreignis( me );
  398. int aktion = ( me.verarbeitet && !vera ) ? 1 : 0;
  399. verlassen->doMausEreignis( me );
  400. aktion = ( me.verarbeitet && !vera && !aktion ) ? 2 : aktion;
  401. if( me.id == ME_RLinks )
  402. {
  403. if( aktion == 1 )
  404. {
  405. if( nachricht->zText()->getLength() )
  406. {
  407. short län = 1 + nachricht->zText()->getLength();
  408. char *bytes = new char[ län ];
  409. bytes[ 0 ] = 1;
  410. for( int i = 0; i < län - 1; i++ )
  411. bytes[ i + 1 ] = nachricht->zText()->getText()[ i ];
  412. if( !spielc->statistikNachricht( län, bytes ) )
  413. addNachricht( nachrichtParam, new Text( "Fehler" ), new Text( "Die Nachricht konnte nicht gesendet werden." ), new Text( "Ok" ), 0, 0, 0 );
  414. else
  415. {
  416. nachricht->setAuswahl( 0, 0 );
  417. nachricht->setText( "" );
  418. }
  419. delete[] bytes;
  420. }
  421. }
  422. if( aktion == 2 )
  423. beenden = 1;
  424. }
  425. }
  426. void StatistikChat::doTastaturEreignis( TastaturEreignis &te )
  427. {
  428. bool vera = te.verarbeitet;
  429. nachricht->doTastaturEreignis( te );
  430. if( !vera && te.verarbeitet && te.id == TE_Release && te.taste == T_Enter )
  431. {
  432. if( nachricht->zText()->getLength() )
  433. {
  434. short län = 1 + nachricht->zText()->getLength();
  435. char *bytes = new char[ län ];
  436. bytes[ 0 ] = 1;
  437. for( int i = 0; i < län - 1; i++ )
  438. bytes[ i + 1 ] = nachricht->zText()->getText()[ i ];
  439. if( !spielc->statistikNachricht( län, bytes ) )
  440. addNachricht( nachrichtParam, new Text( "Fehler" ), new Text( "Die Nachricht konnte nicht gesendet werden." ), new Text( "Ok" ), 0, 0, 0 );
  441. else
  442. {
  443. nachricht->setAuswahl( 0, 0 );
  444. nachricht->setText( "" );
  445. }
  446. delete[] bytes;
  447. }
  448. }
  449. }
  450. bool StatistikChat::tick( double tickVal )
  451. {
  452. bool rend = verlauf->tick( tickVal );
  453. rend |= nachricht->tick( tickVal );
  454. rend |= senden->tick( tickVal );
  455. rend |= verlassen->tick( tickVal );
  456. rend |= spielerListe->tick( tickVal );
  457. return rend;
  458. }
  459. void StatistikChat::render( Bild &zRObj )
  460. {
  461. verlauf->render( zRObj );
  462. nachricht->render( zRObj );
  463. senden->render( zRObj );
  464. verlassen->render( zRObj );
  465. spielerListe->render( zRObj );
  466. }
  467. // constant
  468. bool StatistikChat::hatVerlassen()
  469. {
  470. return beenden;
  471. }
  472. // Reference Counting
  473. StatistikChat *StatistikChat::getThis()
  474. {
  475. ref++;
  476. return this;
  477. }
  478. StatistikChat *StatistikChat::release()
  479. {
  480. ref--;
  481. if( !ref )
  482. delete this;
  483. return 0;
  484. }