Diagram.cpp 60 KB

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