1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324 |
- #include "Liste.h"
- #include "AlphaFeld.h"
- #include "Array.h"
- #include "Bild.h"
- #include "Globals.h"
- #include "MausEreignis.h"
- #include "Rahmen.h"
- #include "Schrift.h"
- #include "Scroll.h"
- #include "TastaturEreignis.h"
- #include "Text.h"
- #include "TextFeld.h"
- using namespace Framework;
- // Inhalt der AuswahlListe Klasse aus Liste.h
- // Konstruktor
- AuswahlListe::AuswahlListe()
- : ZeichnungHintergrund(),
- tfListe(0),
- auswahl(-1),
- ahFarbe(0xFF000000),
- ahBild(0),
- aBuffer(0),
- aRahmen(0),
- styles(0),
- ahFarbeListe(0),
- ahBildListe(0),
- aBufferListe(0),
- aRahmenListe(0),
- schrift(0)
- {
- style = 0;
- this->setMausEreignis(_ret1ME);
- this->setTastaturEreignis(_ret1TE);
- }
- // Destruktor
- AuswahlListe::~AuswahlListe()
- {
- if (tfListe) tfListe->release();
- if (ahBild) ahBild->release();
- if (aBuffer) aBuffer->release();
- if (aRahmen) aRahmen->release();
- if (styles) styles->release();
- if (ahFarbeListe) ahFarbeListe->release();
- if (ahBildListe) ahBildListe->release();
- if (aBufferListe) aBufferListe->release();
- if (aRahmenListe) aRahmenListe->release();
- if (schrift) schrift->release();
- }
- void AuswahlListe::doMausEreignis(MausEreignis& me, bool userRet)
- {
- if (!userRet || hatStyleNicht(Style::Erlaubt)) return;
- if (ZeichnungHintergrund::hatStyle(Style::VScroll) && vertikalScrollBar)
- {
- int rbr = 0;
- if (rahmen && ZeichnungHintergrund::hatStyle(Style::Rahmen))
- rbr = rahmen->getRBreite();
- if (((me.mx > gr.x - 15 - rbr) || me.id == ME_UScroll
- || me.id == ME_DScroll)
- && me.id != ME_Betritt && me.id != ME_Leaves)
- {
- vertikalScrollBar->doMausMessage(
- gr.x - rbr - 15, rbr, 15, gr.y - rbr * 2, me);
- me.verarbeitet = 1;
- }
- }
- if (!me.verarbeitet && me.id == ME_RLinks)
- {
- int eintr = getKlickEintrag(me.my);
- if (eintr >= 0)
- {
- if (hatStyleNicht(Style::MultiSelect))
- {
- auswahl = eintr;
- rend = 1;
- }
- else
- {
- bool shift = getTastenStand(T_Shift);
- bool strg = getTastenStand(T_Strg);
- if (strg)
- {
- setMsStyle(eintr,
- Style::Selected,
- hatMsStyleNicht(eintr, Style::Selected));
- auswahl = eintr;
- }
- else if (shift && auswahl != -1)
- {
- deSelect();
- int beg = auswahl, end = eintr;
- if (beg > end)
- {
- int tmp = end;
- end = beg;
- beg = tmp;
- }
- for (int i = beg; i <= end; ++i)
- {
- addMsStyle(i, Style::Selected);
- }
- }
- else
- {
- deSelect();
- addMsStyle(eintr, Style::Selected);
- auswahl = eintr;
- }
- }
- }
- else
- deSelect();
- }
- me.verarbeitet = 1;
- }
- bool AuswahlListe::hatStyle(int styleSet, int styleCheck) const
- {
- return (styleSet | styleCheck) == styleSet;
- }
- // nicht constant
- void AuswahlListe::update() // aktualisiert die Auswahl Liste
- {
- int rbr = 0;
- if (rahmen)
- {
- rbr = rahmen->getRBreite();
- rahmen->setPosition(0, 0);
- rahmen->setSize(gr.x, gr.y);
- }
- if (hintergrundFeld)
- {
- hintergrundFeld->setPosition(rbr, rbr);
- hintergrundFeld->setSize(gr.x - rbr * 2, gr.y - rbr * 2);
- }
- if (hatStyleNicht(Style::MultiStyled) && tfListe)
- {
- bool FeldRahmen = ZeichnungHintergrund::hatStyle(Style::FeldRahmen);
- bool FeldHintergrund
- = ZeichnungHintergrund::hatStyle(Style::FeldHintergrund);
- bool FeldHBild = ZeichnungHintergrund::hatStyle(Style::FeldHBild);
- bool FeldHAlpha = ZeichnungHintergrund::hatStyle(Style::FeldHAlpha);
- bool FeldBuffer = ZeichnungHintergrund::hatStyle(Style::FeldBuffer);
- for (TextFeld* tf : *tfListe)
- {
- tf->setStyle(TextFeld::Style::Rahmen, FeldRahmen);
- tf->setStyle(TextFeld::Style::Hintergrund, FeldHintergrund);
- tf->setStyle(TextFeld::Style::HBild, FeldHBild);
- tf->setStyle(TextFeld::Style::HAlpha, FeldHAlpha);
- tf->setStyle(TextFeld::Style::Buffered, FeldBuffer);
- if (schrift)
- tf->setSchriftZ(dynamic_cast<Schrift*>(schrift->getThis()));
- }
- }
- if (ZeichnungHintergrund::hatStyle(Style::MultiStyled) && tfListe && styles)
- {
- auto style = styles->begin();
- for (auto tf = tfListe->begin(); tf; tf++, style++)
- {
- tf->setStyle(
- TextFeld::Style::Rahmen, hatStyle(style, Style::FeldRahmen));
- tf->setStyle(TextFeld::Style::Hintergrund,
- hatStyle(style, Style::FeldHintergrund));
- tf->setStyle(
- TextFeld::Style::HBild, hatStyle(style, Style::FeldHBild));
- tf->setStyle(
- TextFeld::Style::HAlpha, hatStyle(style, Style::FeldHAlpha));
- tf->setStyle(
- TextFeld::Style::Buffered, hatStyle(style, Style::FeldBuffer));
- }
- }
- rend = 1;
- }
- void AuswahlListe::addEintrag(Text* txt) // fügt einen Eintrag hinzu
- {
- TextFeld* tf = new TextFeld();
- tf->setStyle(TextFeld::Style::Center | TextFeld::Style::Sichtbar
- | TextFeld::Style::Rahmen);
- tf->setSchriftFarbe(0xFFFFFFFF);
- tf->setRahmenBreite(1);
- tf->setRahmenFarbe(0xFFFFFFFF);
- tf->setTextZ(txt);
- tf->setSize(0, 20);
- addEintragZ(tf);
- rend = 1;
- }
- void AuswahlListe::addEintrag(const char* txt)
- {
- Text* tx = new Text(txt);
- addEintrag(tx);
- rend = 1;
- }
- void AuswahlListe::addEintragZ(TextFeld* tf)
- {
- if (!tfListe) tfListe = new RCArray<TextFeld>();
- if (schrift && (!tf->zSchrift() || hatStyleNicht(Style::MultiStyled)))
- tf->setSchriftZ(dynamic_cast<Schrift*>(schrift->getThis()));
- tfListe->add(tf);
- rend = 1;
- }
- void AuswahlListe::addEintrag(
- int pos, Text* txt) // fügt einen Eintrag bei position pos ein
- {
- TextFeld* tf = new TextFeld();
- tf->setStyle(TextFeld::Style::Center | TextFeld::Style::Sichtbar
- | TextFeld::Style::Rahmen);
- tf->setSchriftFarbe(0xFFFFFFFF);
- tf->setRahmenBreite(1);
- tf->setRahmenFarbe(0xFFFFFFFF);
- tf->setTextZ(txt);
- tf->setSize(0, 20);
- addEintragZ(pos, tf);
- rend = 1;
- }
- void AuswahlListe::addEintrag(int pos, const char* txt)
- {
- Text* tx = new Text(txt);
- addEintrag(pos, tx);
- rend = 1;
- }
- void AuswahlListe::addEintragZ(int pos, TextFeld* tf)
- {
- if (!tfListe) tfListe = new RCArray<TextFeld>();
- if (schrift && (!tf->zSchrift() || hatStyleNicht(Style::MultiStyled)))
- tf->setSchriftZ(dynamic_cast<Schrift*>(schrift->getThis()));
- tfListe->add(tf, pos);
- rend = 1;
- }
- void AuswahlListe::setEintrag(
- int pos, Text* txt) // ändert den pos - ten Eintrag
- {
- TextFeld* tf = 0;
- if (tfListe) tf = tfListe->z(pos);
- if (!tf)
- {
- tf = new TextFeld();
- tf->setStyle(TextFeld::Style::Center | TextFeld::Style::Sichtbar
- | TextFeld::Style::Rahmen);
- tf->setSchriftFarbe(0xFFFFFFFF);
- tf->setRahmenFarbe(0xFFFFFFFF);
- tf->setRahmenBreite(1);
- tf->setTextZ(txt);
- tf->setSize(0, 20);
- setEintragZ(pos, tf);
- rend = 1;
- return;
- }
- tf->setTextZ(txt);
- rend = 1;
- }
- void AuswahlListe::setEintrag(int pos, const char* txt)
- {
- Text* tx = new Text(txt);
- setEintrag(pos, tx);
- rend = 1;
- }
- void AuswahlListe::setEintragZ(int pos, TextFeld* tf)
- {
- if (!tfListe) tfListe = new RCArray<TextFeld>();
- if (schrift && (!tf->zSchrift() || hatStyleNicht(Style::MultiStyled)))
- tf->setSchriftZ(dynamic_cast<Schrift*>(schrift->getThis()));
- tfListe->set(tf, pos);
- rend = 1;
- }
- void AuswahlListe::tauschEintragPos(
- int vpos, int npos) // taucht den Eintrag vpos mit dem Eintrag npos
- {
- if (tfListe)
- {
- tfListe->tausch(vpos, npos);
- if (styles) styles->tausch(vpos, npos);
- if (ahFarbeListe) ahFarbeListe->tausch(vpos, npos);
- if (ahBildListe) ahBildListe->tausch(vpos, npos);
- if (aBufferListe) aBufferListe->tausch(vpos, npos);
- if (aRahmenListe) aRahmenListe->tausch(vpos, npos);
- rend = 1;
- }
- }
- void Framework::AuswahlListe::setEintragPos(int vpos, int npos) {
- if (tfListe)
- {
- tfListe->setPosition(vpos, npos);
- if (styles) styles->setPosition(vpos, npos);
- if (ahFarbeListe) ahFarbeListe->setPosition(vpos, npos);
- if (ahBildListe) ahBildListe->setPosition(vpos, npos);
- if (aBufferListe) aBufferListe->setPosition(vpos, npos);
- if (aRahmenListe) aRahmenListe->setPosition(vpos, npos);
- rend = 1;
- }
- }
- void AuswahlListe::removeEintrag(int pos) // löscht den Eintrag pos
- {
- tfListe->remove(pos);
- rend = 1;
- }
- void AuswahlListe::setSchriftZ(
- Schrift* schrift) // legt die Schrift der Einträge fest
- {
- if (this->schrift) this->schrift->release();
- this->schrift = schrift;
- rend = 1;
- }
- void AuswahlListe::setVScrollZuEintrag(int eintrag) // scrollt zum Eintrag
- {
- if (vertikalScrollBar)
- {
- if (eintrag > tfListe->getLastIndex())
- eintrag = tfListe->getLastIndex();
- int y = 0;
- for (int i = 0; i < eintrag; i++)
- y += tfListe->z(i) ? tfListe->z(i)->getHeight() : 0;
- vertikalScrollBar->scroll(y);
- }
- }
- void AuswahlListe::updateVScroll() // scrollt zur Curser Position oder nach
- // Unten
- {
- if (vertikalScrollBar)
- {
- int y = 0;
- for (TextFeld* tf : *tfListe)
- y += (TextFeld*)tf ? tf->getHeight() : 0;
- vertikalScrollBar->update(y,
- gr.y
- - ((rahmen
- && ZeichnungHintergrund::hatStyle(
- TextFeld::Style::Rahmen))
- ? rahmen->getRBreite()
- : 0));
- }
- }
- void AuswahlListe::setALRZ(Rahmen*
- rahmen) // setzt einen Zeiger zum Auswahl Rahmen (nur ohne MulitStyled)
- {
- if (aRahmen) aRahmen->release();
- aRahmen = rahmen;
- rend = 1;
- }
- void AuswahlListe::setALRBreite(
- int br) // setzt die Breite des Auswahl Rahmens (nur ohne MultiStyled)
- {
- if (!aRahmen) aRahmen = new LRahmen();
- aRahmen->setRamenBreite(br);
- rend = 1;
- }
- void AuswahlListe::setALRFarbe(
- int fc) // setzt die Farbe des Auswahl Rahmens (nur ohne MultiStyled)
- {
- if (!aRahmen) aRahmen = new LRahmen();
- aRahmen->setFarbe(fc);
- rend = 1;
- }
- void AuswahlListe::setAAFZ(AlphaFeld* buffer) // setzt einen Zeiger zum Auswahl
- // AlpaFeld (nur ohne MultiStyled)
- {
- if (aBuffer) aBuffer->release();
- aBuffer = buffer;
- rend = 1;
- }
- void AuswahlListe::setAAFStrength(
- int st) // setzt die Stärke des Auswahl Hintergrund Buffers (nur ohne
- // MultiStyled)
- {
- if (!aBuffer) aBuffer = new AlphaFeld();
- aBuffer->setStrength(st);
- rend = 1;
- }
- void AuswahlListe::setAAFFarbe(
- int fc) // setzt die Farbe des Auswahl Hintergrund Buffers (nur ohne
- // MultiStyled)
- {
- if (!aBuffer) aBuffer = new AlphaFeld();
- aBuffer->setFarbe(fc);
- rend = 1;
- }
- void AuswahlListe::setAHBild(
- Bild* bild) // setzt das Auswahl Hintergrund Bild (nur ohne MultiStyled)
- {
- if (!ahBild) ahBild = new Bild();
- ahBild->neuBild(bild->getBreite(), bild->getHeight(), 0);
- int* buff1 = ahBild->getBuffer();
- int* buff2 = bild->getBuffer();
- for (int i = 0; i < bild->getBreite() * bild->getHeight(); ++i)
- buff1[i] = buff2[i];
- bild->release();
- rend = 1;
- }
- void AuswahlListe::setAHFarbe(int f) // setzt einen Zeiger zur Auswahl
- // Hintergrund Farbe (nur ohne MultiStyled)
- {
- ahFarbe = f;
- rend = 1;
- }
- void AuswahlListe::setAHBildZ(
- Bild* b) // setzt einen Zeiger zum Hintergrund Bild (nur ohne MultiStyled)
- {
- if (ahBild) ahBild->release();
- ahBild = b;
- rend = 1;
- }
- void AuswahlListe::setALRZ(int pos,
- Rahmen*
- rahmen) // setzt einen Zeiger zum Auswahl Rahmen (nur mit MulitStyled)
- {
- if (!aRahmenListe) aRahmenListe = new RCArray<Rahmen>();
- aRahmenListe->set(rahmen, pos);
- rend = 1;
- }
- void AuswahlListe::setALRBreite(int pos,
- int br) // setzt die Breite des Auswahl Rahmens (nur mit MultiStyled)
- {
- if (!aRahmenListe) aRahmenListe = new RCArray<Rahmen>();
- if (!aRahmenListe->z(pos)) aRahmenListe->set(new LRahmen(), pos);
- aRahmenListe->z(pos)->setRamenBreite(br);
- rend = 1;
- }
- void AuswahlListe::setALRFarbe(int pos,
- int fc) // setzt die Farbe des Auswahl Rahmens (nur mit MultiStyled)
- {
- if (!aRahmenListe) aRahmenListe = new RCArray<Rahmen>();
- if (!aRahmenListe->z(pos)) aRahmenListe->set(new LRahmen(), pos);
- aRahmenListe->z(pos)->setFarbe(fc);
- rend = 1;
- }
- void AuswahlListe::setAAFZ(int pos,
- AlphaFeld*
- buffer) // setzt einen Zeiger zum Auswahl AlpaFeld (nur mit MultiStyled)
- {
- if (!aBufferListe) aBufferListe = new RCArray<AlphaFeld>();
- aBufferListe->set(buffer, pos);
- rend = 1;
- }
- void AuswahlListe::setAAFStrength(
- int pos, int st) // setzt die Stärke des Auswahl Hintergrund Buffers (nur
- // mit MultiStyled)
- {
- if (!aBufferListe) aBufferListe = new RCArray<AlphaFeld>();
- if (!aBufferListe->z(pos)) aBufferListe->set(new AlphaFeld(), pos);
- aBufferListe->z(pos)->setStrength(st);
- rend = 1;
- }
- void AuswahlListe::setAAFFarbe(
- int pos, int fc) // setzt die Farbe des Auswahl Hintergrund Buffers (nur mit
- // MultiStyled)
- {
- if (!aBufferListe) aBufferListe = new RCArray<AlphaFeld>();
- if (!aBufferListe->z(pos)) aBufferListe->set(new AlphaFeld(), pos);
- aBufferListe->z(pos)->setFarbe(fc);
- rend = 1;
- }
- void AuswahlListe::setAHBild(int pos,
- Bild* bild) // setzt das Auswahl Hintergrund Bild (nur mit MultiStyled)
- {
- if (ahBildListe) ahBildListe = new RCArray<Bild>();
- if (!ahBildListe->z(pos)) ahBildListe->set(new Bild(), pos);
- ahBildListe->z(pos)->neuBild(bild->getBreite(), bild->getHeight(), 0);
- int* buff1 = ahBildListe->z(pos)->getBuffer();
- int* buff2 = bild->getBuffer();
- for (int i = 0; i < bild->getBreite() * bild->getHeight(); ++i)
- buff1[i] = buff2[i];
- bild->release();
- rend = 1;
- }
- void AuswahlListe::setAHFarbe(
- int pos, int f) // setzt einen Zeiger zur Auswahl Hintergrund Farbe (nur miz
- // MultiStyled)
- {
- if (ahFarbeListe) ahFarbeListe = new Array<int>();
- ahFarbeListe->set(f, pos);
- rend = 1;
- }
- void AuswahlListe::setAHBildZ(int pos,
- Bild* b) // setzt einen Zeiger zum Hintergrund Bild (nur mit MultiStyled)
- {
- if (ahBildListe) ahBildListe = new RCArray<Bild>();
- ahBildListe->set(b, pos);
- rend = 1;
- }
- void AuswahlListe::setMsStyle(int pos,
- __int64 style) // setzt den Style des Eintrags (nur mit MultiStyled)
- {
- if (!styles) styles = new Array<__int64>();
- styles->set(style, pos);
- rend = 1;
- }
- void AuswahlListe::setMsStyle(int pos, __int64 style, bool add_remove)
- {
- if (!styles) styles = new Array<__int64>();
- if (add_remove)
- styles->set(styles->get(pos) | style, pos);
- else
- styles->set(styles->get(pos) & ~style, pos);
- rend = 1;
- }
- void AuswahlListe::addMsStyle(int pos, __int64 style)
- {
- if (!styles) styles = new Array<__int64>();
- styles->set(styles->get(pos) | style, pos);
- rend = 1;
- }
- void AuswahlListe::removeMsStyle(int pos, __int64 style)
- {
- if (!styles) styles = new Array<__int64>();
- styles->set(styles->get(pos) & ~style, pos);
- rend = 1;
- }
- void AuswahlListe::doTastaturEreignis(TastaturEreignis& te)
- {
- bool ntakc = !te.verarbeitet;
- if (hatStyleNicht(Style::Fokus) || !tak || te.verarbeitet) return;
- getThis();
- if (tak(takParam, this, te))
- {
- if (te.id == TE_Press)
- {
- if (hatStyleNicht(Style::MultiSelect))
- {
- switch (te.virtualKey)
- {
- case T_Unten:
- ++auswahl;
- if (auswahl > tfListe->getEintragAnzahl())
- auswahl = tfListe->getEintragAnzahl();
- rend = 1;
- break;
- case T_Oben:
- --auswahl;
- if (auswahl < -1) auswahl = -1;
- rend = 1;
- break;
- }
- }
- else
- {
- switch (te.virtualKey)
- {
- case T_Unten:
- deSelect();
- ++auswahl;
- if (auswahl > tfListe->getEintragAnzahl())
- auswahl = tfListe->getEintragAnzahl();
- if (auswahl >= 0) addMsStyle(auswahl, Style::Selected);
- rend = 1;
- break;
- case T_Oben:
- deSelect();
- --auswahl;
- if (auswahl < -1) auswahl = -1;
- if (auswahl >= 0) addMsStyle(auswahl, Style::Selected);
- rend = 1;
- break;
- }
- }
- }
- te.verarbeitet = 1;
- }
- if (ntakc && te.verarbeitet && nTak)
- te.verarbeitet = nTak(ntakParam, this, te);
- release();
- }
- void AuswahlListe::render(Bild& zRObj) // zeichnet nach zRObj
- {
- if (!ZeichnungHintergrund::hatStyle(Style::Sichtbar)) return;
- removeStyle(Style::HScroll);
- ZeichnungHintergrund::render(zRObj);
- lockZeichnung();
- if (!zRObj.setDrawOptions(innenPosition, innenSize))
- {
- unlockZeichnung();
- return;
- }
- int rbr = 0;
- if (rahmen && ZeichnungHintergrund::hatStyle(Style::Rahmen))
- rbr = rahmen->getRBreite();
- if (tfListe)
- {
- int maxHeight = 0;
- int dx = 0, dy = 0;
- if (vertikalScrollBar && ZeichnungHintergrund::hatStyle(Style::VScroll))
- dy -= vertikalScrollBar->getScroll();
- int mdy = innenSize.y + rbr;
- auto style = styles ? styles->begin() : Array<__int64>().begin();
- int i = 0;
- for (auto tf = tfListe->begin(); tf; tf++, style++, i++)
- {
- if (dy + tf->getHeight() > mdy
- && !(vertikalScrollBar
- && ZeichnungHintergrund::hatStyle(Style::VScroll)))
- break;
- tf->setPosition(dx, dy);
- tf->setSize(innenSize.x, tf->getHeight());
- maxHeight += tf->getHeight();
- bool selected = 0;
- if (ZeichnungHintergrund::hatStyle(Style::MultiSelect) && styles)
- selected = hatStyle(style, Style::Selected);
- else
- selected = auswahl == i;
- AlphaFeld* tmpBuffer = 0;
- bool tmpB = 0;
- int tmpHFarbe = 0;
- bool tmpH = 0;
- Bild* tmpHBild = 0;
- bool tmpHB = 0;
- bool tmpHAlpha = 0;
- Rahmen* tmpRahmen = 0;
- bool tmpR = 0;
- if (selected)
- {
- if (hatStyleNicht(Style::MultiStyled) || !styles)
- {
- if (ZeichnungHintergrund::hatStyle(Style::AuswahlBuffer)
- && aBuffer)
- {
- tmpBuffer = tf->getAlphaFeld();
- tf->setAlphaFeldZ(
- dynamic_cast<AlphaFeld*>(aBuffer->getThis()));
- tmpB = tf->hatStyle(TextFeld::Style::Buffered);
- tf->setStyle(TextFeld::Style::Buffered,
- ZeichnungHintergrund::hatStyle(
- Style::AuswahlBuffer));
- }
- if (ZeichnungHintergrund::hatStyle(
- Style::AuswahlHintergrund))
- {
- tmpH = tf->hatStyle(TextFeld::Style::Hintergrund);
- tmpHFarbe = tf->getHintergrundFarbe();
- tf->setHintergrundFarbe(ahFarbe);
- tf->setStyle(TextFeld::Style::Hintergrund,
- ZeichnungHintergrund::hatStyle(Style::Hintergrund));
- if (ZeichnungHintergrund::hatStyle(Style::AuswahlHBild)
- && ahBild)
- {
- tmpHBild = tf->getHintergrundBild();
- tf->setHintergrundBildZ(
- dynamic_cast<Bild*>(ahBild->getThis()));
- tmpHB = tf->hatStyle(TextFeld::Style::HBild);
- tf->setStyle(TextFeld::Style::HBild,
- ZeichnungHintergrund::hatStyle(Style::HBild));
- }
- if (ZeichnungHintergrund::hatStyle(
- Style::AuswahlHAlpha))
- {
- tmpHAlpha = tf->hatStyle(TextFeld::Style::HAlpha);
- tf->setStyle(TextFeld::Style::HAlpha,
- ZeichnungHintergrund::hatStyle(
- Style::AuswahlHAlpha));
- }
- }
- if (ZeichnungHintergrund::hatStyle(Style::AuswahlRahmen)
- && aRahmen)
- {
- tmpRahmen = tf->getRahmen();
- tf->setRahmenZ(
- dynamic_cast<Rahmen*>(aRahmen->getThis()));
- tmpR = tf->hatStyle(TextFeld::Style::Rahmen);
- tf->setStyle(TextFeld::Style::Rahmen,
- ZeichnungHintergrund::hatStyle(
- Style::AuswahlRahmen));
- }
- }
- else
- {
- if (hatStyle(style, Style::AuswahlBuffer) && aBufferListe)
- {
- tmpBuffer = tf->getAlphaFeld();
- tf->setAlphaFeldZ(aBufferListe->get(i));
- tmpB = tf->hatStyle(TextFeld::Style::Buffered);
- tf->setStyle(TextFeld::Style::Buffered,
- hatStyle(style, Style::AuswahlBuffer));
- }
- if (hatStyle(style, Style::AuswahlHintergrund))
- {
- tmpH = tf->hatStyle(Style::Hintergrund);
- tf->setStyle(TextFeld::Style::Hintergrund,
- hatStyle(style, Style::AuswahlHintergrund));
- if (ahFarbeListe && ahFarbeListe->hat(i))
- {
- tmpHFarbe = tf->getHintergrundFarbe();
- tf->setHintergrundFarbe(ahFarbeListe->get(i));
- }
- if (hatStyle(style, Style::AuswahlHBild) && ahBildListe)
- {
- tmpHBild = tf->getHintergrundBild();
- tf->setHintergrundBildZ(ahBildListe->get(i));
- tmpHB = tf->hatStyle(TextFeld::Style::HBild);
- tf->setStyle(TextFeld::Style::HBild,
- hatStyle(style, Style::HBild));
- }
- if (hatStyle(style, Style::AuswahlHAlpha))
- {
- tmpHAlpha = tf->hatStyle(TextFeld::Style::HAlpha);
- tf->setStyle(TextFeld::Style::HAlpha,
- hatStyle(style, Style::AuswahlHAlpha));
- }
- }
- if (hatStyle(style, Style::AuswahlRahmen) && aRahmenListe)
- {
- tmpRahmen = tf->getRahmen();
- tf->setRahmenZ(aRahmenListe->get(i));
- tmpR = tf->hatStyle(TextFeld::Style::Rahmen);
- tf->setStyle(TextFeld::Style::Rahmen,
- hatStyle(style, Style::AuswahlRahmen));
- }
- }
- }
- tf->render(zRObj);
- if (selected)
- {
- if (hatStyleNicht(Style::MultiStyled) || !styles)
- {
- if (ZeichnungHintergrund::hatStyle(Style::AuswahlBuffer))
- {
- tf->setAlphaFeldZ(tmpBuffer);
- tf->setStyle(TextFeld::Style::Buffered, tmpB);
- }
- if (ZeichnungHintergrund::hatStyle(
- Style::AuswahlHintergrund))
- {
- tf->setHintergrundFarbe(tmpHFarbe);
- tf->setStyle(TextFeld::Style::Hintergrund, tmpH);
- if (ZeichnungHintergrund::hatStyle(Style::AuswahlHBild))
- {
- tf->setHintergrundBildZ(tmpHBild);
- tf->setStyle(TextFeld::Style::HBild, tmpHB);
- }
- if (ZeichnungHintergrund::hatStyle(
- Style::AuswahlHAlpha))
- tf->setStyle(TextFeld::Style::HAlpha, tmpHAlpha);
- }
- if (ZeichnungHintergrund::hatStyle(Style::AuswahlRahmen))
- {
- tf->setRahmenZ(tmpRahmen);
- tf->setStyle(TextFeld::Style::Rahmen, tmpR);
- }
- }
- else
- {
- if (hatMsStyle(i, Style::AuswahlBuffer) && aBufferListe)
- {
- tf->setAlphaFeldZ(tmpBuffer);
- tf->setStyle(TextFeld::Style::Buffered, tmpB);
- }
- if (hatMsStyle(i, Style::AuswahlHintergrund))
- {
- tf->setStyle(TextFeld::Style::Hintergrund, tmpH);
- if (ahFarbeListe && ahFarbeListe->hat(i))
- tf->setHintergrundFarbe(tmpHFarbe);
- if (hatMsStyle(i, Style::AuswahlHBild) && ahBildListe)
- {
- tf->setHintergrundBildZ(tmpHBild);
- tf->setStyle(TextFeld::Style::HBild, tmpHB);
- }
- if (hatMsStyle(i, Style::AuswahlHAlpha))
- tf->setStyle(TextFeld::Style::HAlpha, tmpHAlpha);
- }
- if (hatMsStyle(i, Style::AuswahlRahmen) && aRahmenListe)
- {
- tf->setRahmenZ(tmpRahmen);
- tf->setStyle(TextFeld::Style::Rahmen, tmpR);
- }
- }
- }
- dy += tf->getHeight();
- }
- if (vertikalScrollBar)
- vertikalScrollBar->getScrollData()->max = maxHeight;
- }
- zRObj.releaseDrawOptions();
- unlockZeichnung();
- }
- int AuswahlListe::getKlickEintrag(int my)
- {
- if (!tfListe) return -1;
- int y = 0;
- if (ZeichnungHintergrund::hatStyle(Style::VScroll) && vertikalScrollBar)
- y -= vertikalScrollBar->getScroll();
- int i = 0;
- for (auto tf = tfListe->begin(); tf; tf++, i++)
- {
- y += tf->getHeight();
- if (y > my) return i;
- }
- return -1;
- }
- void AuswahlListe::setAuswahl(int ausw) // setzt die Auswahl
- {
- if (hatStyleNicht(Style::MultiSelect))
- auswahl = ausw;
- else if (styles)
- {
- for (int i = 0; i < styles->getEintragAnzahl(); ++i)
- removeMsStyle(i, Style::Selected);
- addMsStyle(ausw, Style::Selected);
- }
- }
- void AuswahlListe::deSelect()
- {
- if (hatStyleNicht(Style::MultiSelect))
- auswahl = -1;
- else if (styles)
- {
- for (int i = 0; i < styles->getEintragAnzahl(); ++i)
- removeMsStyle(i, Style::Selected);
- }
- }
- // constant
- int AuswahlListe::getEintragAnzahl()
- const // gibt die Anzahl der Einträge zurück
- {
- return tfListe ? tfListe->getEintragAnzahl() : 0;
- }
- int AuswahlListe::getAuswahl()
- const // gibt den ersten ausgewählten Eintrag zurück
- {
- return auswahl;
- }
- int AuswahlListe::getEintragPos(
- Text* eintragText) // gibt die Position des eintrages mit dem entsprechenden
- // Textes zurück
- {
- int i = 0;
- for (auto tf = tfListe->begin(); tf; tf++, i++)
- {
- if (tf->zText()->istGleich(eintragText->getText()))
- {
- eintragText->release();
- return i;
- }
- }
- return -1;
- }
- TextFeld* AuswahlListe::getEintrag(
- int pos) const // gibt den pos- ten Eintrag zurück
- {
- if (!tfListe) return 0;
- TextFeld* ret = (TextFeld*)tfListe->get(pos);
- if (ret) return dynamic_cast<TextFeld*>(ret->getThis());
- return 0;
- }
- TextFeld* AuswahlListe::zEintrag(int pos) const
- {
- if (!tfListe) return 0;
- return (TextFeld*)tfListe->z(pos);
- }
- Rahmen* AuswahlListe::getARahmen()
- const // gibt den Auswahl Rahmen zurück (ohne MultiStyled)
- {
- if (aRahmen) return dynamic_cast<Rahmen*>(aRahmen->getThis());
- return 0;
- }
- Rahmen* AuswahlListe::zARahmen() const
- {
- return aRahmen;
- }
- int AuswahlListe::getAHFarbe()
- const // gibt die Auswahl Hintergrund Farbe zurück (ohne MultiStyled)
- {
- return ahFarbe;
- }
- Bild* AuswahlListe::getAHBild()
- const // gibt das Auswahl Hintergrund Bild zurück (ohne MultiStyled)
- {
- if (ahBild) return dynamic_cast<Bild*>(ahBild->getThis());
- return 0;
- }
- Bild* AuswahlListe::zAHBild() const
- {
- return ahBild;
- }
- AlphaFeld* AuswahlListe::getABuffer()
- const // gibt den Auswahl Buffer zurück (ohne MultiStyled)
- {
- if (aBuffer) return dynamic_cast<AlphaFeld*>(aBuffer->getThis());
- return 0;
- }
- AlphaFeld* AuswahlListe::zABuffer() const
- {
- return aBuffer;
- }
- Rahmen* AuswahlListe::getARahmen(
- int pos) const // gibt den Auswahl Rahmen zurück (mit MultiStyled)
- {
- Rahmen* ret = 0;
- if (aRahmenListe) ret = (Rahmen*)aRahmenListe->get(pos);
- if (ret) return dynamic_cast<Rahmen*>(ret->getThis());
- return 0;
- }
- Rahmen* AuswahlListe::zARahmen(int pos) const
- {
- Rahmen* ret = 0;
- if (aRahmenListe) ret = (Rahmen*)aRahmenListe->z(pos);
- return ret;
- }
- int AuswahlListe::getAHFarbe(int pos)
- const // gibt die Auswahl Hintergrund Farbe zurück (mit MultiStyled)
- {
- if (ahFarbeListe && ahFarbeListe->hat(pos)) return ahFarbeListe->get(pos);
- return 0;
- }
- Bild* AuswahlListe::getAHBild(
- int pos) const // gibt das Auswahl Hintergrund Bild zurück (mit MultiStyled)
- {
- Bild* ret = 0;
- if (ahBildListe) ret = (Bild*)ahBildListe->get(pos);
- if (ret) return dynamic_cast<Bild*>(ret->getThis());
- return 0;
- }
- Bild* AuswahlListe::zAHBild(int pos) const
- {
- Bild* ret = 0;
- if (ahBildListe) ret = (Bild*)ahBildListe->z(pos);
- return ret;
- }
- AlphaFeld* AuswahlListe::getABuffer(
- int pos) const // gibt den Auswahl Buffer zurück (mit MultiStyled)
- {
- AlphaFeld* ret = 0;
- if (aBufferListe) ret = (AlphaFeld*)aBufferListe->get(pos);
- if (ret) return dynamic_cast<AlphaFeld*>(ret->getThis());
- return 0;
- }
- AlphaFeld* AuswahlListe::zABuffer(int pos) const
- {
- AlphaFeld* ret = 0;
- if (aBufferListe) ret = (AlphaFeld*)aBufferListe->z(pos);
- return ret;
- }
- bool AuswahlListe::hatMsStyle(
- int pos, __int64 style) const // prüft ob style vorhanden (mit MultiStyled)
- {
- __int64 st = 0;
- if (styles) st = styles->get(pos);
- return (st | style) == st;
- }
- bool AuswahlListe::hatMsStyleNicht(int pos,
- __int64 style) const // prüft obt style nicht vorhanden (mit MultiStyled)
- {
- __int64 st = 0;
- if (styles) st = styles->get(pos);
- return (st | style) != st;
- }
- //! Konstruktor
- ZListe::ZListe()
- : ZeichnungHintergrund()
- {
- entrySeperatorSize = 1;
- entrySeperatorColor = 0xFFFFFFFF;
- setRahmenBreite(1);
- setRahmenFarbe(0xFFFFFFFF);
- setHintergrundFarbe(0xFF000000);
- }
- //! Destruktor
- ZListe::~ZListe() {}
- //! Verarbeitet Tastatur Nachrichten
- //! \param me Das Ereignis, was durch die Tastatureingabe ausgelößt wurde
- void ZListe::doMausEreignis(MausEreignis& me, bool userRet)
- {
- if (ZeichnungHintergrund::hatStyle(Style::VScroll) && vertikalScrollBar)
- {
- int rbr = 0;
- if (rahmen && ZeichnungHintergrund::hatStyle(Style::Rahmen))
- rbr = rahmen->getRBreite();
- if (((me.mx > gr.x - 15 - rbr) || me.id == ME_UScroll
- || me.id == ME_DScroll)
- && me.id != ME_Betritt && me.id != ME_Leaves)
- {
- vertikalScrollBar->doMausMessage(
- gr.x - rbr - 15, rbr, 15, gr.y - rbr * 2, me);
- me.verarbeitet = 1;
- }
- me.my += vertikalScrollBar->getScroll();
- }
- me.my -= (rahmen && ZeichnungHintergrund::hatStyle(TextFeld::Style::Rahmen))
- ? rahmen->getRBreite() * 2
- : 0;
- me.mx -= (rahmen && ZeichnungHintergrund::hatStyle(TextFeld::Style::Rahmen))
- ? rahmen->getRBreite() * 2
- : 0;
- int ySum = 0;
- int index = 0;
- for (Zeichnung* entry : list)
- {
- entry->doPublicMausEreignis(me);
- ySum += entry->getHeight();
- me.my -= entry->getHeight();
- if (index < list.getLastIndex())
- {
- ySum
- += ZeichnungHintergrund::hatStyle(ZListe::Style::EntrySeperator)
- ? entrySeperatorSize
- : 0;
- me.my
- -= ZeichnungHintergrund::hatStyle(ZListe::Style::EntrySeperator)
- ? entrySeperatorSize
- : 0;
- }
- index++;
- }
- me.my
- += ySum
- + (rahmen
- && ZeichnungHintergrund::hatStyle(TextFeld::Style::Rahmen))
- ? rahmen->getRBreite() * 2
- : 0;
- me.mx += (rahmen && ZeichnungHintergrund::hatStyle(TextFeld::Style::Rahmen))
- ? rahmen->getRBreite() * 2
- : 0;
- if (ZeichnungHintergrund::hatStyle(Style::VScroll) && vertikalScrollBar)
- me.my -= vertikalScrollBar->getScroll();
- }
- //! Fügt einen Eintrag hinzu
- //! \param entry Die Zeichnung die hinzugefügt werden soll
- void ZListe::addEintrag(Zeichnung* entry)
- {
- rend = 1;
- list.add(entry);
- }
- //! Ändert einen Eintrag
- //! \param pos Der Index des Eintrags
- //! \param entry Die neue Zeichnung
- void ZListe::setEintrag(int pos, Zeichnung* entry)
- {
- rend = 1;
- list.set(entry, pos);
- }
- //! Vertauscht die Positionen zweier Einträge
- //! \param vpos Der Index des ersten Eintrags
- //! \param npos Der Index des zweiten Eintrags
- void ZListe::tauschEintragPos(int vPos, int nPos)
- {
- rend = 1;
- list.tausch(vPos, nPos);
- }
- void Framework::ZListe::setEintragPos(int vpos, int npos)
- {
- list.setPosition(vpos, npos);
- }
- //! Löscht einen Eintrag
- //! pos: Der Index des Eintrags
- void ZListe::removeEintrag(int pos)
- {
- rend = 1;
- list.remove(pos);
- }
- //! Scrollt zu einem bestimmen Eintrag
- //! \param eintrag Der Index des Eintrags
- void ZListe::setVScrollZuEintrag(int eintrag)
- {
- if (vertikalScrollBar)
- {
- if (eintrag > list.getLastIndex()) eintrag = list.getLastIndex();
- int y = 0;
- int index = 0;
- for (Zeichnung* entry : list)
- {
- y += entry->getHeight();
- if (index < list.getLastIndex())
- y += ZeichnungHintergrund::hatStyle(
- ZListe::Style::EntrySeperator)
- ? entrySeperatorSize
- : 0;
- index++;
- }
- vertikalScrollBar->scroll(y);
- }
- }
- //! Aktualisiert die maximale Scroll Höhe indem die Höhe aller Einträge addiert
- //! wird
- void ZListe::updateVScroll()
- {
- if (vertikalScrollBar)
- {
- int y = 0;
- int index = 0;
- for (Zeichnung* entry : list)
- {
- y += entry->getHeight();
- if (index < list.getLastIndex())
- y += ZeichnungHintergrund::hatStyle(
- ZListe::Style::EntrySeperator)
- ? entrySeperatorSize
- : 0;
- index++;
- }
- vertikalScrollBar->update(y,
- gr.y
- - ((rahmen
- && ZeichnungHintergrund::hatStyle(
- TextFeld::Style::Rahmen))
- ? rahmen->getRBreite() * 2
- : 0));
- }
- }
- //! sets the size of the entry seperator
- void ZListe::setEntrySeperatorSize(int size)
- {
- entrySeperatorSize = size;
- }
- //! sets the color of the entry seperator
- void ZListe::setEntrySeperatorColor(int color)
- {
- entrySeperatorColor = color;
- }
- //! Verarbeitet ein Tastatur Ereignis. Wird vom Framework automatisch aufgerufen
- //! \param te Das Ereignis
- void ZListe::doTastaturEreignis(TastaturEreignis& te)
- {
- for (Zeichnung* entry : list)
- entry->doTastaturEreignis(te);
- }
- //! Aktualisiert die zeichnung
- //! \param tickVal Die vergangene Zeit in Sekunden, die seit dem Letzten Aufruf
- //! dieser Funktion verstrichen ist \return 1, wenn sich die Zeichnung seit dem
- //! letzten aufruf verändert hat
- bool ZListe::tick(double tickVal)
- {
- bool ret = ZeichnungHintergrund::tick(tickVal);
- for (Zeichnung* entry : list)
- ret |= entry->tick(tickVal);
- return ret;
- }
- //! Zeichnet das Objekt nach zRObj, falls es sichtbar ist
- //! \param zRObj Das Bild, in welches gezeichnet werden soll
- void ZListe::render(Bild& rObj)
- {
- ZeichnungHintergrund::render(rObj);
- int index = 0;
- int rbr = rahmen && ZeichnungHintergrund::hatStyle(TextFeld::Style::Rahmen)
- ? rahmen->getRBreite()
- : 0;
- bool vs = vertikalScrollBar && hatStyle(Style::VScroll);
- if (rObj.setDrawOptions(pos + Punkt(rbr, rbr),
- gr - Punkt(rbr, rbr) * 2 - Punkt(vs ? 15 : 0, 0)))
- {
- if (vs) rObj.addScrollOffset(0, vertikalScrollBar->getScroll());
- for (Zeichnung* entry : list)
- {
- entry->setWidth(gr.x - rbr * 2 - (vs ? 15 : 0));
- entry->render(rObj);
- rObj.addScrollOffset(0, -entry->getHeight());
- if (index < list.getLastIndex()
- && ZeichnungHintergrund::hatStyle(
- ZListe::Style::EntrySeperator))
- {
- for (int i = 0; i < entrySeperatorSize; i++)
- {
- rObj.drawLinieHAlpha(
- 0, 0, gr.x - rbr - (vs ? 15 : 0), entrySeperatorColor);
- rObj.addScrollOffset(0, -1);
- }
- }
- index++;
- }
- rObj.releaseDrawOptions();
- }
- }
- //! Gibt den Index eines Eintrags zurück, auf den die Maus zeigt
- //! \param my Die Position der Maus auf der Y Achse basierend auf dem oberend
- //! Rand der Liste
- int ZListe::getKlickEintrag(int my)
- {
- if (my < 0) return -1;
- int index = 0;
- int y = 0;
- for (Zeichnung* entry : list)
- {
- if (my < y) return index;
- y += entry->getHeight();
- if (index < list.getLastIndex())
- y += ZeichnungHintergrund::hatStyle(ZListe::Style::EntrySeperator)
- ? entrySeperatorSize
- : 0;
- index++;
- }
- return -1;
- }
- //! Gibt die Anzahl an Einträgen zurück
- int ZListe::getEintragAnzahl() const
- {
- return list.getEintragAnzahl();
- }
- //! Gibt den Index eines Eintrags zurück
- //! \param zEntry Die Zeichnung
- int ZListe::getEintragPos(Zeichnung* zEntry)
- {
- int index = 0;
- for (Zeichnung* entry : list)
- {
- if (zEntry == entry) return index;
- index++;
- }
- return -1;
- }
- //! Gibt einen Eintrag zurück
- //! \param pos Der Index des Eintrags
- Zeichnung* ZListe::getEintrag(int pos) const
- {
- return list.get(pos);
- }
- //! Gibt einen Eintrag ohne erhöhten reference Counter zurück
- //! \param pos Der Index des Eintrags
- Zeichnung* ZListe::zEintrag(int pos) const
- {
- return list.get(pos);
- }
- //! Gibt die benötigte Höhe zurück
- int ZListe::getNeededHeight() const
- {
- int y = (rahmen && ZeichnungHintergrund::hatStyle(TextFeld::Style::Rahmen))
- ? rahmen->getRBreite() * 2
- : 0;
- int index = 0;
- for (Zeichnung* entry : list)
- {
- y += entry->getHeight();
- if (index < list.getLastIndex())
- y += ZeichnungHintergrund::hatStyle(ZListe::Style::EntrySeperator)
- ? entrySeperatorSize
- : 0;
- index++;
- }
- return y;
- }
- //! returns the size of the entry seperator
- int ZListe::getEntrySeperatorSize() const
- {
- return entrySeperatorSize;
- }
- //! returns the color of the entry seperator
- int ZListe::getEntrySeperatorColor() const
- {
- return entrySeperatorColor;
- }
|