Diagramm.cpp 60 KB

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