Diagramm.cpp 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025
  1. #include "Diagramm.h"
  2. #include "Text.h"
  3. #include "AlphaFeld.h"
  4. #include "Bild.h"
  5. #include "Rahmen.h"
  6. #include "Schrift.h"
  7. #include "Scroll.h"
  8. #include "MausEreignis.h"
  9. #include "ToolTip.h"
  10. #include <math.h>
  11. using namespace Framework;
  12. // Inhalt der SLDiag Klasse aus Diagramm.h
  13. // Konstruktor
  14. SLDiag::SLDiag()
  15. : ZeichnungHintergrund(),
  16. gF( 0xFF000000 ),
  17. lFarbe( new Array< int >() ),
  18. lName( new RCArray< Text >() ),
  19. ph( new RCArray< Array< int > >() ),
  20. pb( new RCArray< Array< int > >() ),
  21. lastValue( new Array< int >() ),
  22. textRd( 0 ),
  23. gitterGr( 0, 0 ),
  24. lines( 0 ),
  25. ref( 1 )
  26. {
  27. style = 0;
  28. }
  29. // Destruktor
  30. SLDiag::~SLDiag()
  31. {
  32. lFarbe->release();
  33. lName->release();
  34. ph->release();
  35. pb->release();
  36. lastValue->release();
  37. if( textRd )
  38. textRd->release();
  39. }
  40. // nicht constant
  41. void SLDiag::setTextRendererZ( TextRenderer *textRd )
  42. {
  43. if( this->textRd )
  44. this->textRd->release();
  45. this->textRd = textRd;
  46. }
  47. void SLDiag::setSchriftZ( Schrift *schrift ) // setzt die Schrift
  48. {
  49. if( !this->textRd )
  50. textRd = new TextRenderer( schrift );
  51. else
  52. textRd->setSchriftZ( schrift );
  53. rend = 1;
  54. }
  55. void SLDiag::setGSize( Punkt &gr ) // setzt die Größe des Gitters
  56. {
  57. gitterGr = gr;
  58. rend = 1;
  59. }
  60. void SLDiag::setGFarbe( int f ) // setzt die Gitter Farbe
  61. {
  62. gF = f;
  63. rend = 1;
  64. }
  65. void SLDiag::addLinie( const char *name ) // fügt eine Linie hinzu
  66. {
  67. addLinie( new Text( name ) );
  68. rend = 1;
  69. }
  70. void SLDiag::addLinie( Text *txt )
  71. {
  72. lFarbe->add( 0xFFFFFFFF, lines );
  73. lName->add( txt, lines );
  74. ph->add( new Array< int >(), lines );
  75. pb->add( new Array< int >(), lines );
  76. int rbr = rahmen && hatStyle( Style::Rahmen ) ? rahmen->getRBreite() : 0;
  77. pb->z( lines )->set( gr.x - rbr * 2, 0 );
  78. ++lines;
  79. rend = 1;
  80. }
  81. void SLDiag::setLFarbe( int lNum, int f ) // setzt die Linienfarbe
  82. {
  83. lFarbe->set( f, lNum );
  84. rend = 1;
  85. }
  86. void SLDiag::addPunkt( int lNum, int x, int h ) // fügt einen Punkt hinzu
  87. {
  88. Array< int > *ph_tmp = ph->z( lNum );
  89. Array< int > *pb_tmp = pb->z( lNum );
  90. if( ph_tmp && pb_tmp )
  91. {
  92. int i = pb_tmp->get( 0 );
  93. i -= x;
  94. if( i >= 0 )
  95. pb_tmp->set( i, 0 );
  96. while( i < 0 )
  97. {
  98. ph_tmp->remove( 0 );
  99. pb_tmp->remove( 0 );
  100. if( !pb_tmp->getEintragAnzahl() || !ph_tmp->getEintragAnzahl() )
  101. break;
  102. int ii = -i;
  103. i = pb_tmp->get( 0 );
  104. i -= ii;
  105. pb_tmp->set( i, 0 );
  106. }
  107. pb_tmp->add( x );
  108. ph_tmp->add( h );
  109. lastValue->set( h, lNum );
  110. }
  111. rend = 1;
  112. }
  113. void SLDiag::removeLinie( int lNum ) // entfernt eine Linie
  114. {
  115. lFarbe->remove( lNum );
  116. lName->remove( lNum );
  117. ph->remove( lNum );
  118. pb->remove( lNum );
  119. --lines;
  120. rend = 1;
  121. }
  122. void SLDiag::render( Bild &zRObj ) // zeichnet nach zRObj
  123. {
  124. if( hatStyle( Style::Sichtbar ) )
  125. {
  126. lockZeichnung();
  127. removeStyle( Style::VScroll | Style::HScroll );
  128. ZeichnungHintergrund::render( zRObj );
  129. if( !zRObj.setDrawOptions( innenPosition, innenSize ) )
  130. {
  131. unlockZeichnung();
  132. return;
  133. }
  134. int hv = getHighestValue();
  135. hv = hv ? hv : 1;
  136. double yFaktor = innenSize.y / hv;
  137. if( hatStyle( Style::Gitter ) )
  138. {
  139. double ghi = gitterGr.y * yFaktor;
  140. int yo = innenSize.y - 1;
  141. int bo = innenSize.x, ho = innenSize.y;
  142. int maxBr = (int)( (double)innenSize.x / gitterGr.x + 0.5 );
  143. int maxHi = ghi ? (int)( innenSize.y / ghi + 0.5 ) : 0;
  144. if( hatStyle( Style::HAlpha ) )
  145. {
  146. for( int i = 0; i < maxBr; ++i )
  147. zRObj.drawLinieVAlpha( gitterGr.x * i, 0, ho, gF );
  148. for( int i = 0; i < maxHi; ++i )
  149. zRObj.drawLinieHAlpha( 0, (int)( yo - ghi * i + 0.5 ), bo, gF );
  150. }
  151. else
  152. {
  153. for( int i = 0; i < maxBr; ++i )
  154. zRObj.drawLinieV( gitterGr.x * i, 0, ho, gF );
  155. for( int i = 0; i < maxHi; ++i )
  156. zRObj.drawLinieH( 0, (int)( yo - ghi * i + 0.5 ), bo, gF );
  157. }
  158. }
  159. for( int i = 0; i < lines; ++i )
  160. {
  161. int f_tmp = lFarbe->hat( i ) ? lFarbe->get( i ) : 0;
  162. Text *n_tmp = lName->z( i );
  163. Array< int > *ph_tmp = ph->z( i );
  164. Array< int > *pb_tmp = pb->z( i );
  165. if( hatStyle( Style::LinienName ) && textRd && n_tmp )
  166. {
  167. textRd->setSchriftSize( 12 );
  168. Text rtxt = n_tmp->getText();
  169. rtxt += ": ";
  170. rtxt += lastValue->get( i );
  171. textRd->renderText( 5, 5 + 15 * i, rtxt, zRObj, f_tmp );
  172. }
  173. if( ph_tmp && pb_tmp )
  174. {
  175. int lastX = 0;
  176. int lastY = innenSize.y - 1;
  177. int ph_anz = ph_tmp->getEintragAnzahl();
  178. int pb_anz = pb_tmp->getEintragAnzahl();
  179. for( int ii = 0; ii < ph_anz && ii < pb_anz; ++ii )
  180. {
  181. if( !ph_tmp || !pb_tmp )
  182. break;
  183. int xpos = lastX + pb_tmp->get( ii );
  184. int ypos = innenSize.y - (int)( ph_tmp->get( ii ) * yFaktor + 0.5 ) - 1;
  185. if( ypos == -1 )
  186. ++ypos;
  187. if( ypos < 0 || xpos < 0 )
  188. break;
  189. if( hatStyle( Style::HAlpha ) )
  190. zRObj.drawLinieAlpha( Punkt( lastX, lastY ), Punkt( xpos, ypos ), f_tmp );
  191. else
  192. zRObj.drawLinie( Punkt( lastX, lastY ), Punkt( xpos, ypos ), f_tmp );
  193. lastX = xpos;
  194. lastY = ypos;
  195. }
  196. }
  197. }
  198. zRObj.releaseDrawOptions();
  199. unlockZeichnung();
  200. }
  201. }
  202. // constant
  203. Schrift *SLDiag::getSchrift() const // gibt die Schrift zurück
  204. {
  205. if( textRd )
  206. return textRd->getSchrift();
  207. return 0;
  208. }
  209. Schrift *SLDiag::zSchrift() const
  210. {
  211. return textRd ? textRd->zSchrift() : 0;
  212. }
  213. const Punkt &SLDiag::getGSize() const // gibt die Gitter Größe zurück
  214. {
  215. return gitterGr;
  216. }
  217. int SLDiag::getGFarbe() const // gibt die Gitter Farbe zurück
  218. {
  219. return gF;
  220. }
  221. int SLDiag::getLinienNummer( const char *name ) const // gibt die Linien Nummer zurück
  222. {
  223. for( int i = 0; i < lines; ++i )
  224. {
  225. if( lName->z( i )->istGleich( name ) )
  226. return i;
  227. }
  228. return -1;
  229. }
  230. int SLDiag::getLinienNummer( Text *name ) const
  231. {
  232. for( int i = 0; i < lines; ++i )
  233. {
  234. if( lName->z( i )->istGleich( name->getText() ) )
  235. {
  236. name->release();
  237. return i;
  238. }
  239. }
  240. name->release();
  241. return -1;
  242. }
  243. Text *SLDiag::getLinienName( int lNum ) const // gibt den Linien Namen zurück
  244. {
  245. return lName->get( lNum );
  246. }
  247. Text *SLDiag::zLinienNamen( int lNum ) const
  248. {
  249. return lName->z( lNum );
  250. }
  251. int SLDiag::getHighestValue() const // gibt den Höchsten Wert zurück
  252. {
  253. int ret = 0;
  254. for( int i = 0; i < lines; ++i )
  255. {
  256. int tmp = getHighestValue( i );
  257. ret = ret >= tmp ? ret : tmp;
  258. }
  259. return ret;
  260. }
  261. int SLDiag::getHighestValue( int lNum ) const
  262. {
  263. int ret = 0;
  264. Array< int > *tmp = ph->z( lNum );
  265. int anz = tmp->getEintragAnzahl();
  266. for( int i = 0; i < anz; ++i )
  267. ret = ret >= tmp->get( i ) ? ret : tmp->get( i );
  268. return ret;
  269. }
  270. int SLDiag::getMedian( int lNum ) const // gibt den durchschnittswert zurück
  271. {
  272. int count;
  273. int all = 0;
  274. Array< int > *tmp = ph->z( lNum );
  275. int anz = tmp->getEintragAnzahl();
  276. for( count = 1; count <= anz; ++count )
  277. all += tmp->get( count - 1 );
  278. return (int)( (double)all / count + 0.5 );
  279. }
  280. int SLDiag::getLAnzahl() const // gibt die Linien Anzahl zurück
  281. {
  282. return lines;
  283. }
  284. int SLDiag::getLastValue( int lNum ) const // gibt den letzten Wert zurück
  285. {
  286. return lastValue->get( lNum );
  287. }
  288. // Reference Counting
  289. SLDiag *SLDiag::getThis()
  290. {
  291. ++ref;
  292. return this;
  293. }
  294. SLDiag *SLDiag::release()
  295. {
  296. --ref;
  297. if( ref == 0 )
  298. delete this;
  299. return 0;
  300. }
  301. // Inhalt der DiagWert Struktur aus Diagramm.h
  302. // Konstruktor
  303. DiagWert::DiagWert()
  304. : style( 0 ),
  305. farbe( 0xFFFFFFFF ),
  306. hintergrund( 0 ),
  307. name( new Text() ),
  308. punkte( new Array< DiagPunkt* > ),
  309. ref( 1 )
  310. {}
  311. // Destruktor
  312. DiagWert::~DiagWert()
  313. {
  314. name->release();
  315. int anz = punkte->getEintragAnzahl();
  316. for( int i = 0; i < anz; ++i )
  317. {
  318. if( punkte->hat( i ) )
  319. delete punkte->get( i );
  320. }
  321. punkte->release();
  322. }
  323. // Referenc Counting
  324. DiagWert *DiagWert::getThis()
  325. {
  326. ++ref;
  327. return this;
  328. }
  329. DiagWert *DiagWert::release()
  330. {
  331. --ref;
  332. if( !ref )
  333. delete this;
  334. return 0;
  335. }
  336. // Inhalt der DiagDaten Struktur aus Diagramm.h
  337. // Konstruktor
  338. DiagDaten::DiagDaten()
  339. : style( 0 ),
  340. rasterDicke( 0 ),
  341. rasterBreite( 0 ),
  342. rasterHeight( 0 ),
  343. rasterFarbe( 0 ),
  344. hIntervallFarbe( 0xFFFFFFFF ),
  345. vIntervallFarbe( 0xFFFFFFFF ),
  346. hIntervallName( new Text() ),
  347. vIntervallName( new Text() ),
  348. hIntervallTexte( new RCArray< Text > ),
  349. vIntervallTexte( new RCArray< Text > ),
  350. hIntervallWerte( new Array< double > ),
  351. vIntervallWerte( new Array< double > ),
  352. hIntervallBreite( 0 ),
  353. vIntervallHeight( 0 ),
  354. werte( new RCArray< DiagWert >() ),
  355. ref( 1 )
  356. {}
  357. // Destruktor
  358. DiagDaten::~DiagDaten()
  359. {
  360. hIntervallName->release();
  361. vIntervallName->release();
  362. hIntervallWerte->release();
  363. vIntervallWerte->release();
  364. hIntervallTexte->release();
  365. vIntervallTexte->release();
  366. werte->release();
  367. }
  368. // Referenc Counting
  369. DiagDaten *DiagDaten::getThis()
  370. {
  371. ++ref;
  372. return this;
  373. }
  374. DiagDaten *DiagDaten::release()
  375. {
  376. --ref;
  377. if( !ref )
  378. delete this;
  379. return 0;
  380. }
  381. // Inhalt der BaseDiag Klasse aus Diagramm.h
  382. // Konstruktor
  383. BaseDiag::BaseDiag( Critical *lock )
  384. : daten( new DiagDaten() ),
  385. changed( 0 ),
  386. lock( lock ),
  387. ref( 1 )
  388. {}
  389. // Destruktor
  390. BaseDiag::~BaseDiag()
  391. {
  392. if( daten )
  393. daten->release();
  394. }
  395. // nicht constant
  396. void BaseDiag::setDiagDatenZ( DiagDaten *dd ) // Setzt einen Zeiger auf die Daten des Diagramms
  397. {
  398. lock->lock();
  399. if( daten )
  400. daten->release();
  401. daten = dd;
  402. lock->unlock();
  403. changed = 1;
  404. }
  405. void BaseDiag::setDiagDaten( DiagDaten *dd ) // Kopiert die Daten eines Diagramms
  406. {
  407. lock->lock();
  408. if( !daten )
  409. daten = new DiagDaten();
  410. daten->style = dd->style;
  411. daten->rasterBreite = dd->rasterBreite;
  412. daten->rasterHeight = dd->rasterHeight;
  413. daten->rasterFarbe = dd->rasterFarbe;
  414. daten->hIntervallFarbe = dd->hIntervallFarbe;
  415. daten->vIntervallFarbe = dd->vIntervallFarbe;
  416. daten->hIntervallName->setText( *dd->hIntervallName );
  417. daten->vIntervallName->setText( *dd->vIntervallName );
  418. int anz = dd->hIntervallWerte->getEintragAnzahl();
  419. for( int i = 0; i < anz; ++i )
  420. {
  421. if( dd->hIntervallWerte->hat( i ) )
  422. daten->hIntervallWerte->set( dd->hIntervallWerte->get( i ), i );
  423. }
  424. anz = dd->vIntervallWerte->getEintragAnzahl();
  425. for( int i = 0; i < anz; ++i )
  426. {
  427. if( dd->vIntervallWerte->hat( i ) )
  428. daten->vIntervallWerte->set( dd->vIntervallWerte->get( i ), i );
  429. }
  430. daten->hIntervallBreite = dd->hIntervallBreite;
  431. daten->vIntervallHeight = dd->vIntervallHeight;
  432. anz = dd->werte->getEintragAnzahl();
  433. for( int i = 0; i < anz; ++i )
  434. {
  435. DiagWert *tmp = dd->werte->z( i );
  436. if( tmp )
  437. {
  438. DiagWert *w = new DiagWert();
  439. w->style = tmp->style;
  440. w->farbe = tmp->farbe;
  441. w->hintergrund = tmp->hintergrund;
  442. w->name->setText( tmp->name->getText() );
  443. int anz = tmp->punkte->getEintragAnzahl();
  444. for( int j = 0; j < anz; ++j )
  445. {
  446. if( tmp->punkte->hat( j ) )
  447. {
  448. DiagPunkt *p = new DiagPunkt();
  449. p->hIntervall = tmp->punkte->get( j )->hIntervall;
  450. p->vIntervall = tmp->punkte->get( j )->vIntervall;
  451. w->punkte->set( p, j );
  452. }
  453. }
  454. daten->werte->set( w, i );
  455. }
  456. }
  457. dd->release();
  458. lock->unlock();
  459. changed = 1;
  460. }
  461. void BaseDiag::setRasterDicke( int d ) // Rasterdicke setzen
  462. {
  463. lock->lock();
  464. if( !daten )
  465. daten = new DiagDaten();
  466. if( daten->rasterDicke != d )
  467. changed = 1;
  468. daten->rasterDicke = d;
  469. lock->unlock();
  470. }
  471. void BaseDiag::setRasterBreite( int br ) // Rasterbreite setzen
  472. {
  473. lock->lock();
  474. if( !daten )
  475. daten = new DiagDaten();
  476. if( daten->rasterBreite != br )
  477. changed = 1;
  478. daten->rasterBreite = br;
  479. lock->unlock();
  480. }
  481. void BaseDiag::setRasterHeight( int hi ) // Rasterhöhe setzen
  482. {
  483. lock->lock();
  484. if( !daten )
  485. daten = new DiagDaten();
  486. if( daten->rasterHeight != hi )
  487. changed = 1;
  488. daten->rasterHeight = hi;
  489. lock->unlock();
  490. }
  491. void BaseDiag::setRasterFarbe( int f ) // Rasterfarbe setzen
  492. {
  493. lock->lock();
  494. if( !daten )
  495. daten = new DiagDaten();
  496. if( daten->rasterFarbe != f )
  497. changed = 1;
  498. daten->rasterFarbe = f;
  499. lock->unlock();
  500. }
  501. void BaseDiag::setHIntervallBreite( double br ) // Intervall Breite
  502. {
  503. lock->lock();
  504. if( !daten )
  505. daten = new DiagDaten();
  506. daten->hIntervallBreite = br;
  507. lock->unlock();
  508. }
  509. void BaseDiag::setVIntervallHeight( double hi ) // Intervall Höhe
  510. {
  511. lock->lock();
  512. if( !daten )
  513. daten = new DiagDaten();
  514. daten->vIntervallHeight = hi;
  515. lock->unlock();
  516. }
  517. void BaseDiag::setHIntervallFarbe( int f ) // Farbe des Horizontalen Intervalls
  518. {
  519. lock->lock();
  520. if( !daten )
  521. daten = new DiagDaten();
  522. if( daten->hIntervallFarbe != f )
  523. changed = 1;
  524. daten->hIntervallFarbe = f;
  525. lock->unlock();
  526. }
  527. void BaseDiag::setVIntervallFarbe( int f ) // Farbe des Vertikalen Intervalls
  528. {
  529. lock->lock();
  530. if( !daten )
  531. daten = new DiagDaten();
  532. if( daten->vIntervallFarbe != f )
  533. changed = 1;
  534. daten->vIntervallFarbe = f;
  535. lock->unlock();
  536. }
  537. void BaseDiag::setHIntervallName( char *name ) // Setzt den Namen des Horizontalen Intervalls
  538. {
  539. lock->lock();
  540. if( !daten )
  541. daten = new DiagDaten();
  542. if( !daten->hIntervallName )
  543. daten->hIntervallName = new Text();
  544. if( !daten->hIntervallName->istGleich( name ) )
  545. changed = 1;
  546. daten->hIntervallName->setText( name );
  547. lock->unlock();
  548. }
  549. void BaseDiag::setHIntervallName( Text *name )
  550. {
  551. lock->lock();
  552. if( !daten )
  553. daten = new DiagDaten();
  554. if( !daten->hIntervallName )
  555. daten->hIntervallName = new Text();
  556. if( !daten->hIntervallName->istGleich( *name ) )
  557. changed = 1;
  558. daten->hIntervallName->setText( name );
  559. lock->unlock();
  560. }
  561. void BaseDiag::setVIntervallName( char *name ) // Setzt den Namen des Vertikalen Intervalls
  562. {
  563. lock->lock();
  564. if( !daten )
  565. daten = new DiagDaten();
  566. if( !daten->vIntervallName )
  567. daten->vIntervallName = new Text();
  568. if( !daten->vIntervallName->istGleich( name ) )
  569. changed = 1;
  570. daten->vIntervallName->setText( name );
  571. lock->unlock();
  572. }
  573. void BaseDiag::setVIntervallName( Text *name )
  574. {
  575. lock->lock();
  576. if( !daten )
  577. daten = new DiagDaten();
  578. if( !daten->vIntervallName )
  579. daten->vIntervallName = new Text();
  580. if( !daten->vIntervallName->istGleich( *name ) )
  581. changed = 1;
  582. daten->vIntervallName->setText( name );
  583. lock->unlock();
  584. }
  585. void BaseDiag::addHIntervallText( double hIntervall, char *text ) // Text eines Horizontalen Intervalls hinzufügen
  586. {
  587. setHIntervallText( hIntervall, text );
  588. }
  589. void BaseDiag::addHIntervallText( double hIntervall, Text *text )
  590. {
  591. setHIntervallText( hIntervall, *text );
  592. text->release();
  593. }
  594. void BaseDiag::setHIntervallTextZ( double hIntervall, Text *text ) // Setzt den Text eines Horizontalen Intervalls
  595. {
  596. lock->lock();
  597. if( !daten )
  598. daten = new DiagDaten();
  599. if( !daten->hIntervallWerte )
  600. daten->hIntervallWerte = new Array< double >();
  601. if( !daten->hIntervallTexte )
  602. daten->hIntervallTexte = new RCArray< Text >();
  603. int anz = daten->hIntervallWerte->getEintragAnzahl();
  604. for( int i = 0; i < anz; ++i )
  605. {
  606. if( daten->hIntervallWerte->hat( i ) && daten->hIntervallWerte->get( i ) == hIntervall )
  607. {
  608. daten->hIntervallTexte->set( text, i );
  609. lock->unlock();
  610. changed = 1;
  611. return;
  612. }
  613. }
  614. daten->hIntervallWerte->set( hIntervall, anz );
  615. daten->hIntervallTexte->set( text, anz );
  616. lock->unlock();
  617. changed = 1;
  618. }
  619. void BaseDiag::setHIntervallText( double hIntervall, Text *text )
  620. {
  621. setHIntervallText( hIntervall, *text );
  622. text->release();
  623. }
  624. void BaseDiag::setHIntervallText( double hIntervall, char *text )
  625. {
  626. lock->lock();
  627. if( !daten )
  628. daten = new DiagDaten();
  629. if( !daten->hIntervallWerte )
  630. daten->hIntervallWerte = new Array< double >();
  631. if( !daten->hIntervallTexte )
  632. daten->hIntervallTexte = new RCArray< Text >();
  633. int anz = daten->hIntervallWerte->getEintragAnzahl();
  634. for( int i = 0; i < anz; ++i )
  635. {
  636. if( daten->hIntervallWerte->hat( i ) && daten->hIntervallWerte->get( i ) == hIntervall )
  637. {
  638. if( !daten->hIntervallTexte->z( i ) )
  639. daten->hIntervallTexte->set( new Text( text ), i );
  640. else
  641. daten->hIntervallTexte->z( i )->setText( text );
  642. lock->unlock();
  643. changed = 1;
  644. return;
  645. }
  646. }
  647. daten->hIntervallWerte->set( hIntervall, anz );
  648. daten->hIntervallTexte->set( new Text( text ), anz );
  649. lock->unlock();
  650. changed = 1;
  651. }
  652. void BaseDiag::removeHIntervallText( double hIntervall ) // Text eines Horizontalen Intervalls entfernen
  653. {
  654. lock->lock();
  655. if( !daten )
  656. daten = new DiagDaten();
  657. if( !daten->hIntervallWerte )
  658. daten->hIntervallWerte = new Array< double >();
  659. if( !daten->hIntervallTexte )
  660. daten->hIntervallTexte = new RCArray< Text >();
  661. int anz = daten->hIntervallWerte->getEintragAnzahl();
  662. for( int i = 0; i < anz; ++i )
  663. {
  664. if( daten->hIntervallWerte->hat( i ) && daten->hIntervallWerte->get( i ) == hIntervall )
  665. {
  666. daten->hIntervallTexte->remove( i );
  667. daten->hIntervallWerte->remove( i );
  668. lock->unlock();
  669. changed = 1;
  670. return;
  671. }
  672. }
  673. lock->unlock();
  674. }
  675. void BaseDiag::addVIntervallText( double vIntervall, char *text ) // Text eines Vertikalen Intervalls hinzufügen
  676. {
  677. setVIntervallText( vIntervall, text );
  678. }
  679. void BaseDiag::addVIntervallText( double vIntervall, Text *text )
  680. {
  681. setVIntervallText( vIntervall, *text );
  682. text->release();
  683. }
  684. void BaseDiag::setVIntervallTextZ( double vIntervall, Text *text ) // Setzt den Text eines Vertikalen Intervalls
  685. {
  686. lock->lock();
  687. if( !daten )
  688. daten = new DiagDaten();
  689. if( !daten->vIntervallWerte )
  690. daten->vIntervallWerte = new Array< double >();
  691. if( !daten->vIntervallTexte )
  692. daten->vIntervallTexte = new RCArray< Text >();
  693. int anz = daten->vIntervallWerte->getEintragAnzahl();
  694. for( int i = 0; i < anz; ++i )
  695. {
  696. if( daten->vIntervallWerte->hat( i ) && daten->vIntervallWerte->get( i ) == vIntervall )
  697. {
  698. daten->vIntervallTexte->set( text, i );
  699. lock->unlock();
  700. changed = 1;
  701. return;
  702. }
  703. }
  704. daten->vIntervallWerte->set( vIntervall, anz );
  705. daten->vIntervallTexte->set( text, anz );
  706. lock->unlock();
  707. changed = 1;
  708. }
  709. void BaseDiag::setVIntervallText( double vIntervall, Text *text )
  710. {
  711. setVIntervallText( vIntervall, *text );
  712. text->release();
  713. }
  714. void BaseDiag::setVIntervallText( double vIntervall, char *text )
  715. {
  716. lock->lock();
  717. if( !daten )
  718. daten = new DiagDaten();
  719. if( !daten->vIntervallWerte )
  720. daten->vIntervallWerte = new Array< double >();
  721. if( !daten->vIntervallTexte )
  722. daten->vIntervallTexte = new RCArray< Text >();
  723. int anz = daten->vIntervallWerte->getEintragAnzahl();
  724. for( int i = 0; i < anz; ++i )
  725. {
  726. if( daten->vIntervallWerte->hat( i ) && daten->vIntervallWerte->get( i ) == vIntervall )
  727. {
  728. if( !daten->vIntervallTexte->z( i ) )
  729. daten->vIntervallTexte->set( new Text( text ), i );
  730. else
  731. daten->vIntervallTexte->z( i )->setText( text );
  732. lock->unlock();
  733. changed = 1;
  734. return;
  735. }
  736. }
  737. daten->vIntervallWerte->set( vIntervall, anz );
  738. daten->vIntervallTexte->set( new Text( text ), anz );
  739. lock->unlock();
  740. changed = 1;
  741. }
  742. void BaseDiag::removeVIntervallText( double vIntervall ) // Text eines Vertikalen Intervalls entfernen
  743. {
  744. lock->lock();
  745. if( !daten )
  746. daten = new DiagDaten();
  747. if( !daten->vIntervallWerte )
  748. daten->vIntervallWerte = new Array< double >();
  749. if( !daten->vIntervallTexte )
  750. daten->vIntervallTexte = new RCArray< Text >();
  751. int anz = daten->vIntervallWerte->getEintragAnzahl();
  752. for( int i = 0; i < anz; ++i )
  753. {
  754. if( daten->vIntervallWerte->hat( i ) && daten->vIntervallWerte->get( i ) == vIntervall )
  755. {
  756. daten->vIntervallTexte->remove( i );
  757. daten->vIntervallWerte->remove( i );
  758. lock->unlock();
  759. changed = 1;
  760. return;
  761. }
  762. }
  763. lock->unlock();
  764. }
  765. void BaseDiag::addWertZ( DiagWert *w ) // Fügt einen Wert hinzu
  766. {
  767. lock->lock();
  768. if( !daten )
  769. daten = new DiagDaten();
  770. if( !daten->werte )
  771. daten->werte = new RCArray< DiagWert >();
  772. daten->werte->add( w );
  773. lock->unlock();
  774. changed = 1;
  775. }
  776. void BaseDiag::addWert( DiagWert *w )
  777. {
  778. lock->lock();
  779. DiagWert *tmp = new DiagWert();
  780. tmp->style = w->style;
  781. tmp->farbe = w->farbe;
  782. tmp->hintergrund = w->hintergrund;
  783. tmp->name->setText( *w->name );
  784. int anz = w->punkte->getEintragAnzahl();
  785. for( int i = 0; i < anz; ++i )
  786. {
  787. if( w->punkte->hat( i ) )
  788. {
  789. DiagPunkt *p = new DiagPunkt();
  790. p->hIntervall = w->punkte->get( i )->hIntervall;
  791. p->vIntervall = w->punkte->get( i )->vIntervall;
  792. tmp->punkte->set( p, i );
  793. }
  794. }
  795. w->release();
  796. addWertZ( tmp );
  797. lock->unlock();
  798. changed = 1;
  799. }
  800. void BaseDiag::addWert( const char *name )
  801. {
  802. lock->lock();
  803. if( !daten )
  804. daten = new DiagDaten();
  805. if( !daten->werte )
  806. daten->werte = new RCArray< DiagWert >();
  807. DiagWert *w = new DiagWert();
  808. w->name->setText( name );
  809. daten->werte->add( w );
  810. lock->unlock();
  811. changed = 1;
  812. }
  813. void BaseDiag::addWert( Text *txt )
  814. {
  815. addWert( *txt );
  816. txt->release();
  817. }
  818. void BaseDiag::setWertFarbe( int wNum, int f ) // setzt die Farbe eines Wertes
  819. {
  820. if( wNum < 0 )
  821. return;
  822. lock->lock();
  823. if( !daten )
  824. daten = new DiagDaten();
  825. if( !daten->werte )
  826. daten->werte = new RCArray< DiagWert >();
  827. if( !daten->werte->z( wNum ) )
  828. daten->werte->set( new DiagWert(), wNum );
  829. daten->werte->z( wNum )->farbe = f;
  830. lock->unlock();
  831. changed = 1;
  832. }
  833. void BaseDiag::addPunktZ( int wNum, DiagPunkt *p ) // fügt einem Wert einen Punkt hinzu
  834. {
  835. if( wNum < 0 )
  836. return;
  837. lock->lock();
  838. if( !daten )
  839. daten = new DiagDaten();
  840. if( !daten->werte )
  841. daten->werte = new RCArray< DiagWert >();
  842. if( !daten->werte->z( wNum ) )
  843. daten->werte->set( new DiagWert(), wNum );
  844. if( !daten->werte->z( wNum )->punkte )
  845. daten->werte->z( wNum )->punkte = new Array< DiagPunkt* >();
  846. daten->werte->z( wNum )->punkte->add( p );
  847. lock->unlock();
  848. changed = 1;
  849. }
  850. void BaseDiag::addPunkt( int wNum, DiagPunkt *p )
  851. {
  852. if( wNum < 0 )
  853. return;
  854. lock->lock();
  855. if( !daten )
  856. daten = new DiagDaten();
  857. if( !daten->werte )
  858. daten->werte = new RCArray< DiagWert >();
  859. if( !daten->werte->z( wNum ) )
  860. daten->werte->set( new DiagWert(), wNum );
  861. if( !daten->werte->z( wNum )->punkte )
  862. daten->werte->z( wNum )->punkte = new Array< DiagPunkt* >();
  863. DiagPunkt *tmp = new DiagPunkt();
  864. tmp->hIntervall = p->hIntervall;
  865. tmp->vIntervall = p->vIntervall;
  866. daten->werte->z( wNum )->punkte->add( tmp );
  867. lock->unlock();
  868. changed = 1;
  869. }
  870. void BaseDiag::addPunkt( int wNum, double hI, double vI )
  871. {
  872. if( wNum < 0 )
  873. return;
  874. lock->lock();
  875. if( !daten )
  876. daten = new DiagDaten();
  877. if( !daten->werte )
  878. daten->werte = new RCArray< DiagWert >();
  879. if( !daten->werte->z( wNum ) )
  880. daten->werte->set( new DiagWert(), wNum );
  881. if( !daten->werte->z( wNum )->punkte )
  882. daten->werte->z( wNum )->punkte = new Array< DiagPunkt* >();
  883. DiagPunkt *tmp = new DiagPunkt();
  884. tmp->hIntervall = hI;
  885. tmp->vIntervall = vI;
  886. daten->werte->z( wNum )->punkte->add( tmp );
  887. lock->unlock();
  888. changed = 1;
  889. }
  890. // Ändert einen vorhandenen Punkt eines Wertes
  891. void BaseDiag::setPunktZ( int wNum, double hI, DiagPunkt *p )
  892. {
  893. setPunktZ( wNum, getDiagPunktPos( wNum, hI ), p );
  894. }
  895. void BaseDiag::setPunkt( int wNum, double hI, DiagPunkt *p )
  896. {
  897. setPunkt( wNum, getDiagPunktPos( wNum, hI ), p->hIntervall, p->vIntervall );
  898. }
  899. void BaseDiag::setPunkt( int wNum, double hI, double h, double v )
  900. {
  901. setPunkt( wNum, getDiagPunktPos( wNum, hI ), h, v );
  902. }
  903. void BaseDiag::setPunktZ( int wNum, int pNum, DiagPunkt *p )
  904. {
  905. if( pNum < 0 || wNum < 0 )
  906. return;
  907. lock->lock();
  908. if( !daten )
  909. daten = new DiagDaten();
  910. if( !daten->werte )
  911. daten->werte = new RCArray< DiagWert >();
  912. if( !daten->werte->z( wNum ) )
  913. daten->werte->set( new DiagWert(), wNum );
  914. if( !daten->werte->z( wNum )->punkte )
  915. daten->werte->z( wNum )->punkte = new Array< DiagPunkt* >();
  916. if( daten->werte->z( wNum )->punkte->hat( pNum ) )
  917. delete daten->werte->z( wNum )->punkte->get( pNum );
  918. daten->werte->z( wNum )->punkte->set( p, pNum );
  919. lock->unlock();
  920. changed = 1;
  921. }
  922. void BaseDiag::setPunkt( int wNum, int pNum, DiagPunkt *p )
  923. {
  924. if( pNum < 0 || wNum < 0 )
  925. return;
  926. setPunkt( wNum, pNum, p->hIntervall, p->vIntervall );
  927. }
  928. void BaseDiag::setPunkt( int wNum, int pNum, double h, double v )
  929. {
  930. if( pNum < 0 || wNum < 0 )
  931. return;
  932. lock->lock();
  933. if( !daten )
  934. daten = new DiagDaten();
  935. if( !daten->werte )
  936. daten->werte = new RCArray< DiagWert >();
  937. if( !daten->werte->z( wNum ) )
  938. daten->werte->set( new DiagWert(), wNum );
  939. if( !daten->werte->z( wNum )->punkte )
  940. daten->werte->z( wNum )->punkte = new Array< DiagPunkt* >();
  941. if( !daten->werte->z( wNum )->punkte->hat( pNum ) )
  942. daten->werte->z( wNum )->punkte->set( new DiagPunkt(), pNum );
  943. daten->werte->z( wNum )->punkte->get( pNum )->hIntervall = h;
  944. daten->werte->z( wNum )->punkte->get( pNum )->vIntervall = v;
  945. lock->unlock();
  946. changed = 1;
  947. }
  948. // Löscht einen vorhandenen Punkt
  949. void BaseDiag::removePunkt( int wNum, double hI )
  950. {
  951. lock->lock();
  952. if( !daten )
  953. daten = new DiagDaten();
  954. if( !daten->werte )
  955. daten->werte = new RCArray< DiagWert >();
  956. if( !daten->werte->z( wNum ) )
  957. daten->werte->set( new DiagWert(), wNum );
  958. if( !daten->werte->z( wNum )->punkte )
  959. daten->werte->z( wNum )->punkte = new Array< DiagPunkt* >();
  960. int anz = daten->werte->z( wNum )->punkte->getEintragAnzahl();
  961. for( int i = 0; i < anz; ++i )
  962. {
  963. if( daten->werte->z( wNum )->punkte->hat( i ) && daten->werte->z( wNum )->punkte->get( i )->hIntervall == hI )
  964. {
  965. delete daten->werte->z( wNum )->punkte->get( i );
  966. daten->werte->z( wNum )->punkte->remove( i );
  967. lock->unlock();
  968. changed = 1;
  969. return;
  970. }
  971. }
  972. lock->unlock();
  973. }
  974. void BaseDiag::removePunkt( int wNum, int pNum )
  975. {
  976. lock->lock();
  977. if( !daten )
  978. daten = new DiagDaten();
  979. if( !daten->werte )
  980. daten->werte = new RCArray< DiagWert >();
  981. if( !daten->werte->z( wNum ) )
  982. daten->werte->set( new DiagWert(), wNum );
  983. if( !daten->werte->z( wNum )->punkte )
  984. daten->werte->z( wNum )->punkte = new Array< DiagPunkt* >();
  985. if( daten->werte->z( wNum )->punkte->hat( pNum ) )
  986. {
  987. delete daten->werte->z( wNum )->punkte->get( pNum );
  988. daten->werte->z( wNum )->punkte->remove( pNum );
  989. changed = 1;
  990. }
  991. lock->unlock();
  992. }
  993. void BaseDiag::removeWert( int wNum ) // entfernt einen Wert
  994. {
  995. lock->lock();
  996. if( !daten )
  997. daten = new DiagDaten();
  998. if( !daten->werte )
  999. daten->werte = new RCArray< DiagWert >();
  1000. daten->werte->remove( wNum );
  1001. lock->unlock();
  1002. changed = 1;
  1003. }
  1004. void BaseDiag::removeWert( char *name )
  1005. {
  1006. lock->lock();
  1007. if( !daten )
  1008. daten = new DiagDaten();
  1009. if( !daten->werte )
  1010. daten->werte = new RCArray< DiagWert >();
  1011. int anz = daten->werte->getEintragAnzahl();
  1012. for( int i = 0; i < anz; ++i )
  1013. {
  1014. DiagWert *tmp = daten->werte->z( i );
  1015. if( tmp && tmp->name && tmp->name->istGleich( name ) )
  1016. {
  1017. daten->werte->remove( i );
  1018. lock->unlock();
  1019. changed = 1;
  1020. return;
  1021. }
  1022. }
  1023. lock->unlock();
  1024. }
  1025. void BaseDiag::removeWert( Text *name )
  1026. {
  1027. removeWert( name->getText() );
  1028. name->release();
  1029. }
  1030. void BaseDiag::addDatenStyle( int style ) // Setzt den Style der Daten
  1031. {
  1032. if( !daten )
  1033. daten = new DiagDaten();
  1034. if( ( daten->style | style ) != daten->style )
  1035. changed = 1;
  1036. daten->style |= style;
  1037. }
  1038. void BaseDiag::setDatenStyle( int style )
  1039. {
  1040. if( !daten )
  1041. daten = new DiagDaten();
  1042. if( daten->style != style )
  1043. changed = 1;
  1044. daten->style = style;
  1045. }
  1046. void BaseDiag::setDatenStyle( int style, bool addRemove )
  1047. {
  1048. if( addRemove )
  1049. addDatenStyle( style );
  1050. else
  1051. removeDatenStyle( style );
  1052. }
  1053. void BaseDiag::removeDatenStyle( int style )
  1054. {
  1055. if( !daten )
  1056. daten = new DiagDaten();
  1057. if( ( daten->style & ~style ) != daten->style )
  1058. changed = 1;
  1059. daten->style &= ~style;
  1060. }
  1061. void BaseDiag::addWertStyle( int wNum, int style ) // Setzt den Style eines Wertes
  1062. {
  1063. if( wNum < 0 )
  1064. return;
  1065. if( !daten )
  1066. daten = new DiagDaten();
  1067. if( !daten->werte->z( wNum ) )
  1068. daten->werte->set( new DiagWert(), wNum );
  1069. if( ( daten->werte->z( wNum )->style | style ) != daten->werte->z( wNum )->style )
  1070. changed = 1;
  1071. daten->werte->z( wNum )->style |= style;
  1072. }
  1073. void BaseDiag::setWertStyle( int wNum, int style )
  1074. {
  1075. if( wNum < 0 )
  1076. return;
  1077. if( !daten )
  1078. daten = new DiagDaten();
  1079. if( !daten->werte->z( wNum ) )
  1080. daten->werte->set( new DiagWert(), wNum );
  1081. if( daten->werte->z( wNum )->style != style )
  1082. changed = 1;
  1083. daten->werte->z( wNum )->style = style;
  1084. }
  1085. void BaseDiag::setWertStyle( int wNum, int style, bool addRemove )
  1086. {
  1087. if( wNum < 0 )
  1088. return;
  1089. if( addRemove )
  1090. addWertStyle( wNum, style );
  1091. else
  1092. removeWertStyle( wNum, style );
  1093. }
  1094. void BaseDiag::removeWertStyle( int wNum, int style )
  1095. {
  1096. if( wNum < 0 )
  1097. return;
  1098. if( !daten )
  1099. daten = new DiagDaten();
  1100. if( !daten->werte->z( wNum ) )
  1101. daten->werte->set( new DiagWert(), wNum );
  1102. if( ( daten->werte->z( wNum )->style & ~style ) != daten->werte->z( wNum )->style )
  1103. changed = 1;
  1104. daten->werte->z( wNum )->style &= ~style;
  1105. }
  1106. // constant
  1107. DiagDaten *BaseDiag::getDiagDaten() const // Gibt die Daten des Diagramms zurück
  1108. {
  1109. return daten ? daten->getThis() : 0;
  1110. }
  1111. DiagDaten *BaseDiag::zDiagDaten() const
  1112. {
  1113. return daten;
  1114. }
  1115. DiagWert *BaseDiag::getDiagWert( int wNum ) const // Gibt die Daten eines Wertes zurück
  1116. {
  1117. return ( daten && daten->werte ) ? daten->werte->get( wNum ) : 0;
  1118. }
  1119. DiagWert *BaseDiag::zDiagWert( int wNum ) const
  1120. {
  1121. return ( daten && daten->werte ) ? daten->werte->z( wNum ) : 0;
  1122. }
  1123. DiagWert *BaseDiag::getDiagWert( char *name ) const
  1124. {
  1125. return getDiagWert( getDiagWertPos( name ) );
  1126. }
  1127. DiagWert *BaseDiag::zDiagWert( char *name ) const
  1128. {
  1129. return zDiagWert( getDiagWertPos( name ) );
  1130. }
  1131. int BaseDiag::getDiagWertPos( char *name ) const // Gibt die Position eines Wertes zurück
  1132. {
  1133. if( !daten || !daten->werte )
  1134. return -1;
  1135. int anz = daten->werte->getEintragAnzahl();
  1136. for( int i = 0; i < anz; ++i )
  1137. {
  1138. if( daten->werte->z( i ) && daten->werte->z( i )->name && daten->werte->z( i )->name->istGleich( name ) )
  1139. return i;
  1140. }
  1141. return -1;
  1142. }
  1143. int BaseDiag::getDiagPunktPos( int wNum, double hI ) const // Gibt die Position eines Punktes von einem Wert zurück
  1144. {
  1145. if( !daten || !daten->werte || !daten->werte->z( wNum ) || !daten->werte->z( wNum )->punkte )
  1146. return -1;
  1147. int anz = daten->werte->z( wNum )->punkte->getEintragAnzahl();
  1148. for( int i = 0; i < anz; ++i )
  1149. {
  1150. if( daten->werte->z( wNum )->punkte->hat( i ) && daten->werte->z( wNum )->punkte->get( i )->hIntervall == hI )
  1151. return i;
  1152. }
  1153. return -1;
  1154. }
  1155. int BaseDiag::getDiagPunktPos( char *wName, double hI ) const
  1156. {
  1157. return getDiagPunktPos( getDiagWertPos( wName ), hI );
  1158. }
  1159. bool BaseDiag::hatDatenStyle( int style ) const // Prüft den Style der Daten
  1160. {
  1161. if( !daten )
  1162. return 0;
  1163. return ( daten->style | style ) == daten->style;
  1164. }
  1165. bool BaseDiag::hatDatenStyleNicht( int style ) const
  1166. {
  1167. if( !daten )
  1168. return 1;
  1169. return ( daten->style | style ) != daten->style;
  1170. }
  1171. bool BaseDiag::hatWertStyle( int wNum, int style ) const // Prüft den Style eines Wertes
  1172. {
  1173. if( !daten || !daten->werte || !daten->werte->z( wNum ) )
  1174. return 0;
  1175. return ( daten->werte->z( wNum )->style | style ) == daten->werte->z( wNum )->style;
  1176. }
  1177. bool BaseDiag::hatWertStyleNicht( int wNum, int style ) const
  1178. {
  1179. if( !daten || !daten->werte || !daten->werte->z( wNum ) )
  1180. return 1;
  1181. return ( daten->werte->z( wNum )->style | style ) != daten->werte->z( wNum )->style;
  1182. }
  1183. // Reference Counting
  1184. BaseDiag *BaseDiag::getThis()
  1185. {
  1186. ++ref;
  1187. return this;
  1188. }
  1189. BaseDiag *BaseDiag::release()
  1190. {
  1191. --ref;
  1192. if( !ref )
  1193. delete this;
  1194. return 0;
  1195. }
  1196. // Inhalt der LDiag Klasse aus Diagramm.h
  1197. // Konstruktor
  1198. LDiag::LDiag()
  1199. : ZeichnungHintergrund(),
  1200. BaseDiag( &cs ),
  1201. textRd( 0 ),
  1202. dRam( new LRahmen() ),
  1203. dBgF( 0 ),
  1204. dBgB( 0 ),
  1205. dAf( new AlphaFeld() ),
  1206. vIntervallRB( new Bild() ),
  1207. hIntervallRB( new Bild() ),
  1208. schriftGr( 12 )
  1209. {
  1210. vertikalScrollBar = new VScrollBar();
  1211. horizontalScrollBar = new HScrollBar();
  1212. }
  1213. // Destruktor
  1214. LDiag::~LDiag()
  1215. {
  1216. if( textRd )
  1217. textRd->release();
  1218. if( dRam )
  1219. dRam->release();
  1220. if( dBgB )
  1221. dBgB->release();
  1222. if( dAf )
  1223. dAf->release();
  1224. if( vIntervallRB )
  1225. vIntervallRB->release();
  1226. if( hIntervallRB )
  1227. hIntervallRB->release();
  1228. }
  1229. // nicht constant
  1230. void LDiag::setTextRendererZ( TextRenderer *textRd )
  1231. {
  1232. lockZeichnung();
  1233. if( this->textRd )
  1234. this->textRd->release();
  1235. this->textRd = textRd;
  1236. unlockZeichnung();
  1237. }
  1238. void LDiag::setSchriftZ( Schrift *schrift ) // Setzt die Schrift
  1239. {
  1240. lockZeichnung();
  1241. if( !this->textRd )
  1242. textRd = new TextRenderer( schrift );
  1243. else
  1244. textRd->setSchriftZ( schrift );
  1245. rend = 1;
  1246. unlockZeichnung();
  1247. }
  1248. void LDiag::setSchriftSize( int gr )
  1249. {
  1250. lockZeichnung();
  1251. if( schriftGr != gr )
  1252. rend = 1;
  1253. schriftGr = gr;
  1254. unlockZeichnung();
  1255. }
  1256. void LDiag::setDatenRahmenZ( Rahmen *ram ) // Setzt den inneren Rahmen um das eigentliche Diagramm
  1257. {
  1258. lockZeichnung();
  1259. if( dRam )
  1260. dRam->release();
  1261. dRam = ram;
  1262. unlockZeichnung();
  1263. rend = 1;
  1264. }
  1265. void LDiag::setDatenRahmen( Rahmen *ram )
  1266. {
  1267. lockZeichnung();
  1268. if( !dRam )
  1269. dRam = new LRahmen();
  1270. dRam->setAlpha( ram->hatAlpha() );
  1271. dRam->setFarbe( ram->getFarbe() );
  1272. dRam->setRamenBreite( ram->getRBreite() );
  1273. unlockZeichnung();
  1274. ram->release();
  1275. rend = 1;
  1276. }
  1277. void LDiag::setDatenRahmenBreite( int br )
  1278. {
  1279. lockZeichnung();
  1280. if( !dRam )
  1281. dRam = new LRahmen();
  1282. if( dRam->getRBreite() != br )
  1283. rend = 1;
  1284. dRam->setRamenBreite( br );
  1285. unlockZeichnung();
  1286. }
  1287. void LDiag::setDatenRahmenFarbe( int f )
  1288. {
  1289. lockZeichnung();
  1290. if( !dRam )
  1291. dRam = new LRahmen();
  1292. dRam->setFarbe( f );
  1293. unlockZeichnung();
  1294. rend = 1;
  1295. }
  1296. void LDiag::setDatenHintergrundFarbe( int f ) // Setzt den Hintergrund des eigentlichen Diagramms
  1297. {
  1298. dBgF = f;
  1299. rend = 1;
  1300. }
  1301. void LDiag::setDatenHintergrundBildZ( Bild *b )
  1302. {
  1303. lockZeichnung();
  1304. if( dBgB )
  1305. dBgB->release();
  1306. dBgB = b;
  1307. unlockZeichnung();
  1308. rend = 1;
  1309. }
  1310. void LDiag::setDatenHintergrundBild( Bild *b )
  1311. {
  1312. lockZeichnung();
  1313. if( !dBgB )
  1314. dBgB = new Bild();
  1315. dBgB->neuBild( b->getBreite(), b->getHeight(), 0 );
  1316. dBgB->drawBild( 0, 0, b->getBreite(), b->getHeight(), *b );
  1317. unlockZeichnung();
  1318. b->release();
  1319. rend = 1;
  1320. }
  1321. void LDiag::setDatenAlphaFeldZ( AlphaFeld *af ) // Setzt das AlphaFeld des eigentlichen Diagramms
  1322. {
  1323. lockZeichnung();
  1324. if( dAf )
  1325. dAf->release();
  1326. dAf = af;
  1327. unlockZeichnung();
  1328. rend = 1;
  1329. }
  1330. void LDiag::setDatenAlphaFeld( AlphaFeld *af )
  1331. {
  1332. lockZeichnung();
  1333. if( !dAf )
  1334. dAf = new AlphaFeld();
  1335. dAf->setFarbe( af->getFarbe() );
  1336. dAf->setStrength( af->getStrength() );
  1337. unlockZeichnung();
  1338. af->release();
  1339. rend = 1;
  1340. }
  1341. void LDiag::setDatenAlphaFeldFarbe( int f )
  1342. {
  1343. lockZeichnung();
  1344. if( !dAf )
  1345. dAf = new AlphaFeld();
  1346. dAf->setFarbe( f );
  1347. unlockZeichnung();
  1348. rend = 1;
  1349. }
  1350. void LDiag::setDatenAlphaFeldStrength( int st )
  1351. {
  1352. lockZeichnung();
  1353. if( !dAf )
  1354. dAf = new AlphaFeld();
  1355. if( dAf->getStrength() != st )
  1356. rend = 1;
  1357. dAf->setStrength( st );
  1358. unlockZeichnung();
  1359. }
  1360. void LDiag::doMausEreignis( MausEreignis &me )
  1361. {
  1362. bool nmakc = !me.verarbeitet;
  1363. if( me.verarbeitet || !( me.mx >= pos.x && me.mx <= pos.x + gr.x && me.my >= pos.y && me.my <= pos.y + gr.y ) )
  1364. {
  1365. if( mausIn )
  1366. {
  1367. mausIn = 0;
  1368. if( toolTip )
  1369. toolTip->setMausIn( 0 );
  1370. MausEreignis me2;
  1371. me2.id = ME_Leaves;
  1372. me2.mx = me.mx;
  1373. me2.my = me.my;
  1374. me2.verarbeitet = 0;
  1375. doMausEreignis( me2 );
  1376. return;
  1377. }
  1378. }
  1379. if( !( me.mx >= pos.x && me.mx <= pos.x + gr.x && me.my >= pos.y && me.my <= pos.y + gr.y ) && me.id != ME_Leaves )
  1380. {
  1381. if( toolTip )
  1382. toolTip->setMausIn( 0 );
  1383. return;
  1384. }
  1385. if( !mausIn && me.id != ME_Leaves )
  1386. {
  1387. if( toolTip )
  1388. toolTip->setMausIn( 1 );
  1389. mausIn = 1;
  1390. MausEreignis me2;
  1391. me2.id = ME_Betritt;
  1392. me2.mx = me.mx;
  1393. me2.my = me.my;
  1394. me2.verarbeitet = 0;
  1395. doMausEreignis( me2 );
  1396. }
  1397. me.mx -= pos.x;
  1398. me.my -= pos.y;
  1399. if( hatDatenStyle( DiagDaten::Style::Sichtbar ) && ( hatStyle( Style::HScroll ) || hatStyle( Style::VScroll ) ) )
  1400. {
  1401. if( mak && ( me.verarbeitet || mak( makParam, this, me ) ) )
  1402. {
  1403. if( me.id != ME_Betritt && me.id != ME_Leaves )
  1404. {
  1405. lockZeichnung();
  1406. int rbr = 0;
  1407. if( hatStyle( Style::Rahmen ) && rahmen )
  1408. rbr = rahmen->getRBreite();
  1409. bool vs = hatStyle( Style::VScroll ) && vertikalScrollBar;
  1410. bool hs = hatStyle( Style::HScroll ) && horizontalScrollBar;
  1411. if( vs )
  1412. {
  1413. if( hs )
  1414. horizontalScrollBar->doMausMessage( rbr, gr.y - rbr - 15, gr.x - rbr * 2 - 15, 15, me );
  1415. vertikalScrollBar->doMausMessage( gr.x - rbr - 15, rbr, 15, gr.y - rbr * 2, me );
  1416. }
  1417. else if( hs )
  1418. horizontalScrollBar->doMausMessage( rbr, gr.y - rbr - 15, gr.x - rbr * 2, 15, me );
  1419. unlockZeichnung();
  1420. }
  1421. me.verarbeitet = 1;
  1422. }
  1423. }
  1424. if( nmakc && me.verarbeitet && nMak )
  1425. me.verarbeitet = nMak( nmakParam, this, me );
  1426. me.mx += pos.x;
  1427. me.my += pos.y;
  1428. }
  1429. void LDiag::render( Bild &zRObj )
  1430. {
  1431. if( !hatDatenStyle( DiagDaten::Style::Sichtbar ) )
  1432. return;
  1433. ZeichnungHintergrund::render( zRObj );
  1434. if( !zRObj.setDrawOptions( innenPosition, innenSize ) )
  1435. return;
  1436. lockZeichnung();
  1437. int dgy = 0;
  1438. int dgbr = innenSize.x;
  1439. int dghi = innenSize.y;
  1440. int vIAnz = 0;
  1441. int hIAnz = 0;
  1442. if( daten )
  1443. { // Auto werte berechnen
  1444. vIAnz = daten->vIntervallWerte ? daten->vIntervallWerte->getEintragAnzahl() : 0;
  1445. hIAnz = daten->hIntervallWerte ? daten->hIntervallWerte->getEintragAnzahl() : 0;
  1446. if( daten->vIntervallWerte && hatDatenStyle( DiagDaten::Style::AutoIntervallHeight ) )
  1447. {
  1448. double maxW = 0;
  1449. for( int i = 0; i < vIAnz; ++i )
  1450. {
  1451. if( daten->vIntervallWerte->hat( i ) && daten->vIntervallWerte->get( i ) > maxW )
  1452. maxW = daten->vIntervallWerte->get( i );
  1453. }
  1454. if( vertikalScrollBar && hatStyle( Style::VScroll ) )
  1455. daten->vIntervallHeight = maxW ? ( vertikalScrollBar->getScroll() / maxW ) : 0;
  1456. else
  1457. daten->vIntervallHeight = maxW ? ( vIntervallRB->getBreite() / maxW ) : 0;
  1458. }
  1459. if( hatDatenStyle( DiagDaten::Style::AutoRasterHeight ) )
  1460. daten->rasterHeight = daten->vIntervallHeight;
  1461. if( daten->hIntervallWerte && hatDatenStyle( DiagDaten::Style::AutoIntervallBreite ) )
  1462. {
  1463. double maxW = 0;
  1464. for( int i = 0; i < hIAnz; ++i )
  1465. {
  1466. if( daten->hIntervallWerte->hat( i ) && daten->hIntervallWerte->get( i ) > maxW )
  1467. maxW = daten->hIntervallWerte->get( i );
  1468. }
  1469. if( horizontalScrollBar && hatStyle( Style::HScroll ) )
  1470. daten->hIntervallBreite = maxW ? ( horizontalScrollBar->getScroll() / maxW ) : 0;
  1471. else
  1472. daten->hIntervallBreite = maxW ? ( hIntervallRB->getBreite() / maxW ) : 0;
  1473. }
  1474. if( hatDatenStyle( DiagDaten::Style::AutoRasterBreite ) )
  1475. daten->rasterBreite = daten->hIntervallBreite;
  1476. }
  1477. if( hatDatenStyle( DiagDaten::Style::VIntervall ) && textRd && schriftGr && daten )
  1478. { // Rendern des vertikalen Intervalls
  1479. int vIRBbr = innenSize.y;
  1480. if( hatDatenStyle( DiagDaten::Style::HIntervall ) && daten->hIntervallFarbe )
  1481. vIRBbr -= schriftGr + 2;
  1482. if( vIRBbr > 0 )
  1483. {
  1484. if( vIntervallRB->getBreite() != vIRBbr || vIntervallRB->getHeight() != schriftGr + 2 )
  1485. vIntervallRB->neuBild( vIRBbr, schriftGr + 2, 0xFF000000 );
  1486. else
  1487. vIntervallRB->fillRegion( 0, 0, vIRBbr, schriftGr + 2, 0xFF000000 );
  1488. textRd->setSchriftSize( schriftGr );
  1489. if( daten->vIntervallWerte )
  1490. {
  1491. int *rf = new int[ vIAnz ];
  1492. int anz = 0;
  1493. bool *fertig = new bool[ vIAnz ];
  1494. ZeroMemory( fertig, vIAnz );
  1495. for( int i = 0; i < vIAnz; ++i )
  1496. {
  1497. double min = 0;
  1498. int mI = -1;
  1499. for( int j = 0; j < vIAnz; ++j )
  1500. {
  1501. if( !fertig[ j ] && daten->vIntervallWerte->hat( j ) && ( daten->vIntervallWerte->get( j ) < min || mI < 0 ) )
  1502. {
  1503. mI = j;
  1504. min = daten->vIntervallWerte->get( j );
  1505. }
  1506. }
  1507. if( mI < 0 )
  1508. break;
  1509. rf[ anz ] = mI;
  1510. ++anz;
  1511. fertig[ mI ] = 1;
  1512. }
  1513. delete[] fertig;
  1514. Text txt;
  1515. int xPos = 0;
  1516. if( vertikalScrollBar && hatStyle( Style::VScroll ) )
  1517. xPos -= vertikalScrollBar->getScroll();
  1518. int rWeite = xPos - 10;
  1519. for( int i = anz - 1; i >= 0; --i )
  1520. {
  1521. txt = "";
  1522. if( hatDatenStyle( DiagDaten::Style::VIntervallTexte ) && daten->vIntervallTexte && daten->vIntervallTexte->z( rf[ i ] ) )
  1523. txt = daten->vIntervallTexte->z( rf[ i ] )->getText();
  1524. else if( hatDatenStyleNicht( DiagDaten::Style::VIntervallTexte ) || !daten->vIntervallWerte )
  1525. txt = daten->vIntervallWerte->get( rf[ i ] );
  1526. xPos = (int)( daten->vIntervallWerte->get( rf[ i ] ) * daten->vIntervallHeight );
  1527. xPos = ( vertikalScrollBar && hatStyle( Style::VScroll ) ? vertikalScrollBar->getScroll() : vIntervallRB->getBreite() ) - xPos;
  1528. if( vertikalScrollBar && hatStyle( Style::VScroll ) )
  1529. xPos -= vertikalScrollBar->getScroll();
  1530. int br = textRd->getTextBreite( txt );
  1531. if( xPos + br > vIntervallRB->getBreite() && vIntervallRB->getBreite() - br >= rWeite + 10 )
  1532. xPos = vIntervallRB->getBreite() - br;
  1533. if( xPos >= rWeite + 10 )
  1534. {
  1535. textRd->renderText( xPos, 1, txt, *vIntervallRB, daten->vIntervallFarbe );
  1536. rWeite = xPos + br + 10;
  1537. }
  1538. }
  1539. delete[] rf;
  1540. }
  1541. if( daten->vIntervallName )
  1542. {
  1543. int vinbr = textRd->getTextBreite( daten->vIntervallName->getText() );
  1544. int vinx = vIntervallRB->getBreite() / 2 - vinbr / 2;
  1545. vIntervallRB->fillRegion( vinx - 5, 1, vinbr + 10, schriftGr, 0xFF000000 );
  1546. textRd->renderText( vinx, 1, daten->vIntervallName->getText(), *vIntervallRB, daten->vIntervallFarbe );
  1547. }
  1548. if( hatDatenStyle( DiagDaten::Style::HIntervall ) && daten->hIntervallFarbe )
  1549. zRObj.alphaBild90( innenSize.x - vIntervallRB->getHeight(), schriftGr + 2, vIntervallRB->getBreite(), vIntervallRB->getHeight(), *vIntervallRB );
  1550. else
  1551. zRObj.alphaBild90( innenSize.x - vIntervallRB->getHeight(), 0, vIntervallRB->getBreite(), vIntervallRB->getHeight(), *vIntervallRB );
  1552. dgbr -= vIntervallRB->getHeight();
  1553. }
  1554. }
  1555. if( hatDatenStyle( DiagDaten::Style::HIntervall ) && textRd && schriftGr && daten )
  1556. { // Rendern des horizontalen Intervalls
  1557. int hIRBbr = innenSize.x;
  1558. if( hatDatenStyle( DiagDaten::Style::VIntervall ) && daten->vIntervallFarbe )
  1559. hIRBbr -= schriftGr + 2;
  1560. if( hIRBbr > 0 )
  1561. {
  1562. if( hIntervallRB->getBreite() != hIRBbr || hIntervallRB->getHeight() != schriftGr + 2 )
  1563. hIntervallRB->neuBild( hIRBbr, schriftGr + 2, 0xFF000000 );
  1564. else
  1565. hIntervallRB->fillRegion( 0, 0, hIRBbr, schriftGr + 2, 0xFF000000 );
  1566. textRd->setSchriftSize( schriftGr );
  1567. if( daten->hIntervallWerte )
  1568. {
  1569. int *rf = new int[ hIAnz ];
  1570. int anz = 0;
  1571. bool *fertig = new bool[ hIAnz ];
  1572. ZeroMemory( fertig, hIAnz );
  1573. for( int i = 0; i < hIAnz; ++i )
  1574. {
  1575. double min = 0;
  1576. int mI = -1;
  1577. for( int j = 0; j < hIAnz; ++j )
  1578. {
  1579. if( !fertig[ j ] && daten->hIntervallWerte->hat( j ) && ( daten->hIntervallWerte->get( j ) < min || mI < 0 ) )
  1580. {
  1581. mI = j;
  1582. min = daten->hIntervallWerte->get( j );
  1583. }
  1584. }
  1585. if( mI < 0 )
  1586. break;
  1587. rf[ anz ] = mI;
  1588. ++anz;
  1589. fertig[ mI ] = 1;
  1590. }
  1591. delete[] fertig;
  1592. Text txt;
  1593. int xPos = 0;
  1594. if( horizontalScrollBar && hatStyle( Style::HScroll ) )
  1595. xPos -= horizontalScrollBar->getScroll();
  1596. int rWeite = xPos - 10;
  1597. for( int i = 0; i < anz; ++i )
  1598. {
  1599. txt = "";
  1600. if( hatDatenStyle( DiagDaten::Style::HIntervallTexte ) && daten->hIntervallTexte && daten->hIntervallTexte->z( rf[ i ] ) )
  1601. txt = daten->hIntervallTexte->z( rf[ i ] )->getText();
  1602. else if( hatDatenStyleNicht( DiagDaten::Style::HIntervallTexte ) || !daten->hIntervallWerte )
  1603. txt = daten->hIntervallWerte->get( rf[ i ] );
  1604. xPos = (int)( daten->hIntervallWerte->get( rf[ i ] ) * daten->hIntervallBreite );
  1605. if( horizontalScrollBar && hatStyle( Style::HScroll ) )
  1606. xPos -= horizontalScrollBar->getScroll();
  1607. int br = textRd->getTextBreite( txt );
  1608. if( xPos + br > hIntervallRB->getBreite() && hIntervallRB->getBreite() - br >= rWeite + 10 )
  1609. xPos = hIntervallRB->getBreite() - br;
  1610. if( xPos >= rWeite + 10 )
  1611. {
  1612. textRd->renderText( xPos, 1, txt, *hIntervallRB, daten->hIntervallFarbe );
  1613. rWeite = xPos + br + 10;
  1614. }
  1615. }
  1616. delete[] rf;
  1617. }
  1618. if( daten->hIntervallName )
  1619. {
  1620. int hinbr = textRd->getTextBreite( daten->hIntervallName->getText() );
  1621. int hinx = hIntervallRB->getBreite() / 2 - hinbr / 2;
  1622. hIntervallRB->fillRegion( hinx - 5, 1, hinbr + 10, schriftGr, 0xFF000000 );
  1623. textRd->renderText( hinx, 1, daten->hIntervallName->getText(), *hIntervallRB, daten->hIntervallFarbe );
  1624. }
  1625. zRObj.alphaBild( 0, 0, hIntervallRB->getBreite(), hIntervallRB->getHeight(), *hIntervallRB );
  1626. dghi -= hIntervallRB->getHeight();
  1627. dgy += hIntervallRB->getHeight();
  1628. }
  1629. }
  1630. if( !zRObj.setDrawOptions( 0, dgy, dgbr, dghi ) )
  1631. {
  1632. zRObj.releaseDrawOptions();
  1633. unlockZeichnung();
  1634. return;
  1635. }
  1636. dgy = 0;
  1637. int dgrbr = 0;
  1638. if( hatStyle( Style::DatenRahmen ) && dRam )
  1639. {
  1640. dRam->setSize( dgbr, dghi );
  1641. dRam->render( zRObj );
  1642. dgrbr = dRam->getRBreite();
  1643. }
  1644. if( !zRObj.setDrawOptions( dgrbr, dgrbr, dgbr - dgrbr * 2, dghi - dgrbr * 2 ) )
  1645. {
  1646. zRObj.releaseDrawOptions();
  1647. zRObj.releaseDrawOptions();
  1648. unlockZeichnung();
  1649. return;
  1650. }
  1651. if( hatStyle( Style::DatenHintergrund ) )
  1652. {
  1653. if( hatStyle( Style::DatenHAlpha ) )
  1654. zRObj.alphaRegion( 0, 0, dgbr - dgrbr * 2, dghi - dgrbr * 2, dBgF );
  1655. else
  1656. zRObj.fillRegion( 0, 0, dgbr - dgrbr * 2, dghi - dgrbr * 2, dBgF );
  1657. if( hatStyle( Style::DatenHBild ) && dBgB )
  1658. {
  1659. if( hatStyle( Style::DatenHAlpha ) )
  1660. zRObj.alphaBild( 0, 0, dgbr - dgrbr * 2, dghi - dgrbr * 2, *dBgB );
  1661. else
  1662. zRObj.drawBild( 0, 0, dgbr - dgrbr * 2, dghi - dgrbr * 2, *dBgB );
  1663. }
  1664. }
  1665. if( hatStyle( Style::DatenBuffered ) && dAf )
  1666. {
  1667. dAf->setSize( dgbr - dgrbr * 2, dghi - dgrbr * 2 );
  1668. dAf->render( zRObj );
  1669. }
  1670. if( hatDatenStyle( DiagDaten::Style::Raster ) && daten && daten->rasterDicke && daten->rasterBreite && daten->rasterHeight )
  1671. { // Raster
  1672. int maxBr = dgbr;
  1673. if( horizontalScrollBar && hatStyle( Style::HScroll ) )
  1674. maxBr = horizontalScrollBar->getScroll();
  1675. int maxHi = dghi;
  1676. if( vertikalScrollBar && hatStyle( Style::VScroll ) )
  1677. maxHi = vertikalScrollBar->getScroll();
  1678. for( double x = horizontalScrollBar && hatStyle( Style::HScroll ) ? -horizontalScrollBar->getScroll() : 0; x < maxBr; x += daten->rasterBreite )
  1679. {
  1680. for( int i = 0; i < daten->rasterDicke; ++i )
  1681. {
  1682. if( hatDatenStyle( DiagDaten::Style::RasterAlpha ) )
  1683. zRObj.drawLinieVAlpha( (int)( x + i ), dgy + dgrbr, dghi - dgrbr * 2, daten->rasterFarbe );
  1684. else
  1685. zRObj.drawLinieV( (int)( x + i ), dgy + dgrbr, dghi - dgrbr * 2, daten->rasterFarbe );
  1686. }
  1687. }
  1688. for( double y = maxHi; y > ( vertikalScrollBar && hatStyle( Style::VScroll ) ? -vertikalScrollBar->getScroll() : 0 ); y -= daten->rasterHeight )
  1689. {
  1690. for( int i = 0; i < daten->rasterDicke; ++i )
  1691. {
  1692. if( hatDatenStyle( DiagDaten::Style::RasterAlpha ) )
  1693. zRObj.drawLinieHAlpha( 0, (int)( y + i ), dgbr - dgrbr * 2, daten->rasterFarbe );
  1694. else
  1695. zRObj.drawLinieH( 0, (int)( y + i ), dgbr - dgrbr * 2, daten->rasterFarbe );
  1696. }
  1697. }
  1698. }
  1699. if( daten && daten->werte && daten->werte->getEintragAnzahl() && daten->hIntervallBreite && daten->vIntervallHeight )
  1700. { // Werte
  1701. int wAnz = daten->werte->getEintragAnzahl();
  1702. for( int i = 0; i < wAnz; ++i )
  1703. {
  1704. DiagWert *wert = daten->werte->z( i );
  1705. if( wert && hatWertStyle( i, DiagWert::Style::Sichtbar ) && wert->punkte && wert->punkte->getEintragAnzahl() )
  1706. {
  1707. int pAnz = wert->punkte->getEintragAnzahl();
  1708. int *rf = new int[ pAnz ];
  1709. bool *fertig = new bool[ pAnz ];
  1710. int anz = 0;
  1711. ZeroMemory( fertig, pAnz );
  1712. for( int j = 0; j < pAnz; ++j )
  1713. {
  1714. double min = -1;
  1715. int p = -1;
  1716. for( int pi = 0; pi < pAnz; ++pi )
  1717. {
  1718. if( wert->punkte->hat( pi ) && !fertig[ pi ] && ( p < 0 || wert->punkte->get( pi )->hIntervall < min ) )
  1719. {
  1720. min = wert->punkte->get( pi )->hIntervall;
  1721. p = pi;
  1722. }
  1723. }
  1724. if( p < 0 )
  1725. break;
  1726. rf[ anz ] = p;
  1727. fertig[ p ] = 1;
  1728. ++anz;
  1729. }
  1730. delete[] fertig;
  1731. int rpx = horizontalScrollBar && hatStyle( Style::HScroll ) ? -horizontalScrollBar->getScroll() : 0;
  1732. int rpy = vertikalScrollBar && hatStyle( Style::VScroll ) ? -vertikalScrollBar->getScroll() : 0;
  1733. rpy += dgy;
  1734. int dgmhi = vertikalScrollBar && hatStyle( Style::VScroll ) ? dgy + vertikalScrollBar->getScrollData()->max + dgrbr : dgy + dghi - dgrbr;
  1735. if( hatWertStyle( i, DiagWert::Style::Hintergrund ) )
  1736. {
  1737. DiagPunkt *vorher = 0;
  1738. DiagPunkt *jetzt = 0;
  1739. for( int j = 0; j < anz; ++j )
  1740. {
  1741. jetzt = wert->punkte->get( rf[ j ] );
  1742. if( jetzt && vorher )
  1743. {
  1744. int ax = (int)( rpx + vorher->hIntervall * daten->hIntervallBreite );
  1745. int ay = (int)( dgmhi - vorher->vIntervall * daten->vIntervallHeight );
  1746. int bx = (int)( rpx + jetzt->hIntervall * daten->hIntervallBreite );
  1747. int by = (int)( dgmhi - jetzt->vIntervall * daten->vIntervallHeight );
  1748. if( ax >= bx )
  1749. {
  1750. vorher = jetzt;
  1751. continue;
  1752. }
  1753. if( !( ax > dgbr - dgrbr || bx < 0 || ( ay > dgy + dghi - dgrbr && by > dgy + dghi - dgrbr ) ) )
  1754. {
  1755. double yf = (double)( by - ay ) / ( bx - ax );
  1756. double y = (double)ay;
  1757. ax = ax < 0 ? 0 : ax;
  1758. bx = bx > dgbr - dgrbr ? dgbr - dgrbr : bx;
  1759. if( hatWertStyle( i, DiagWert::Style::HAlpha ) )
  1760. {
  1761. for( int x = ax; x < bx; x++, y += yf )
  1762. zRObj.drawLinieVAlpha( x, (int)( y + 0.5 ), dgmhi - (int)( y + 0.5 ), wert->hintergrund );
  1763. }
  1764. else
  1765. {
  1766. for( int x = ax; x < bx; x++, y += yf )
  1767. zRObj.drawLinieV( x, (int)( y + 0.5 ), dgmhi - (int)( y + 0.5 ), wert->hintergrund );
  1768. }
  1769. if( hatWertStyle( i, DiagWert::Style::Alpha ) )
  1770. zRObj.drawLinieAlpha( Punkt( ax, ay ), Punkt( bx, by ), wert->farbe );
  1771. else
  1772. zRObj.drawLinie( Punkt( ax, ay ), Punkt( bx, by ), wert->farbe );
  1773. }
  1774. }
  1775. vorher = jetzt;
  1776. }
  1777. }
  1778. else
  1779. {
  1780. DiagPunkt *vorher = 0;
  1781. DiagPunkt *jetzt = 0;
  1782. for( int j = 0; j < anz; ++j )
  1783. {
  1784. jetzt = wert->punkte->get( rf[ j ] );
  1785. if( jetzt && vorher )
  1786. {
  1787. if( hatWertStyle( i, DiagWert::Style::Alpha ) )
  1788. zRObj.drawLinieAlpha( Punkt( (int)( rpx + vorher->hIntervall * daten->hIntervallBreite ), (int)( dgmhi - vorher->vIntervall * daten->vIntervallHeight ) ),
  1789. Punkt( (int)( rpx + jetzt->hIntervall * daten->hIntervallBreite ), (int)( dgmhi - jetzt->vIntervall * daten->vIntervallHeight ) ), wert->farbe );
  1790. else
  1791. zRObj.drawLinie( Punkt( (int)( rpx + vorher->hIntervall * daten->hIntervallBreite ), (int)( dgmhi - vorher->vIntervall * daten->vIntervallHeight ) ),
  1792. Punkt( (int)( rpx + jetzt->hIntervall * daten->hIntervallBreite ), (int)( dgmhi - jetzt->vIntervall * daten->vIntervallHeight ) ), wert->farbe );
  1793. }
  1794. vorher = jetzt;
  1795. }
  1796. }
  1797. delete[] rf;
  1798. }
  1799. }
  1800. }
  1801. if( daten && daten->werte && daten->werte->getEintragAnzahl() && textRd && schriftGr )
  1802. {
  1803. int wAnz = daten->werte->getEintragAnzahl();
  1804. int rx = 5;
  1805. int ry = 5;
  1806. textRd->setSchriftSize( schriftGr );
  1807. for( int i = 0; i < wAnz; ++i )
  1808. {
  1809. DiagWert *w = daten->werte->z( i );
  1810. if( w && w->name && hatWertStyle( i, DiagWert::Style::Name ) && hatWertStyle( i, DiagWert::Style::Sichtbar ) )
  1811. {
  1812. int br = textRd->getTextBreite( w->name->getText() );
  1813. zRObj.alphaRegion( rx, ry, br, schriftGr, 0xA0000000 );
  1814. textRd->renderText( rx, ry, w->name->getText(), zRObj, w->farbe );
  1815. ry += 15;
  1816. }
  1817. }
  1818. }
  1819. zRObj.releaseDrawOptions();
  1820. zRObj.releaseDrawOptions();
  1821. zRObj.releaseDrawOptions();
  1822. unlockZeichnung();
  1823. }
  1824. // constant
  1825. Schrift *LDiag::getSchrift() const // Gibt die Schrift zurück
  1826. {
  1827. return textRd ? textRd->getSchrift() : 0;
  1828. }
  1829. Schrift *LDiag::zSchrift() const
  1830. {
  1831. return textRd ? textRd->zSchrift() : 0;
  1832. }
  1833. Rahmen *LDiag::getDatenRahmen() const // Gibt den inneren Rahmen um das eigentliche Diagramm zurück
  1834. {
  1835. return dRam ? dRam->getThis() : 0;
  1836. }
  1837. Rahmen *LDiag::zDatenRahmen() const
  1838. {
  1839. return dRam;
  1840. }
  1841. int LDiag::getDatenRahmenFarbe() const
  1842. {
  1843. return dRam ? dRam->getFarbe() : 0;
  1844. }
  1845. int LDiag::getDatenRahmenBreite() const
  1846. {
  1847. return dRam ? dRam->getRBreite() : 0;
  1848. }
  1849. int LDiag::getDatenHintergrundFarbe() const // Gibt den Hintergrund des eigentlichen Diagramms zurück
  1850. {
  1851. return dBgF;
  1852. }
  1853. Bild *LDiag::getDatenHintergrundBild() const
  1854. {
  1855. return dBgB ? dBgB->getThis() : 0;
  1856. }
  1857. Bild *LDiag::zDatenHintergrundBild() const
  1858. {
  1859. return dBgB;
  1860. }
  1861. AlphaFeld *LDiag::getDatenAlphaFeld() const // Gibt das AlphaFeld des eigentlichen Diagramms zurück
  1862. {
  1863. return dAf ? dAf->getThis() : 0;
  1864. }
  1865. AlphaFeld *LDiag::zDatenAlphaFeld() const
  1866. {
  1867. return dAf;
  1868. }
  1869. int LDiag::getDatenAlphaFeldFarbe() const
  1870. {
  1871. return dAf ? dAf->getFarbe() : 0;
  1872. }
  1873. int LDiag::getDatenAlphaFeldStrength() const
  1874. {
  1875. return dAf ? dAf->getStrength() : 0;
  1876. }
  1877. // Reference Counting
  1878. BaseDiag *LDiag::release()
  1879. {
  1880. --ref;
  1881. if( !ref )
  1882. delete this;
  1883. return 0;
  1884. }