Tapahtumat Johdanto Ikkunointi Ikkunatapahtumat Päätapahtumasilmukka Tapahtumien käsittely Olioiden välinen kommunikointi Petri Vuorimaa 1
Johdanto Tapahtumien käsittely muodostaa vuorovaikutteisen käyttöliittymän ytimen Se huolehtii käyttöliittymän elementtien ja syöttölaitteiden välisestä kommunikoinnista Yleensä tapahtumien käsittely on toteutettu ikkunointijärjestelmän avulla Sovellukset kommunikoivat ikkunointijärjestelmän kanssa tapahtumien avulla Petri Vuorimaa 2
Ikkunointi Graaffiset käyttöjärjestelmät mahdollistavat usean sovelluksen yhtä aikaisen suoritukset Ikkunointijärjestelmä koordinoi koko järjestelmän toimintaa Ikkunointijärjestelmä tarjoaa sovelluksille mahdollisuuden käyttöliittymän toteuttamiseen Käyttäjälle ikkunointijärjestelmä mahdollistaa ikkunoiden paikan ja koon määrittämisen Petri Vuorimaa 3
Ohjelmistonäkökulma Yhden ikkunan sisältö voidaan esittää puuna Rakenne koostuu sisäkkäistä suorakuutioista (kuva 4-1) Petri Vuorimaa 4
Display Screen Macintosh HD window Title bar Horizontal scroll bar Vertical scroll bar Folder contents area System Folder Folder WordNet file Research folder Desktop Folder folder TOG folder Plan folder Grow box Classes window Similar tree
Juuri-ikkunat Puiden juuria kutsutaan juuri-ikkunoiksi Jokaisella sovelluksella on oma juuri-ikkunansa Object Linking and Embedding (OLE) mahdollistaa kuitenkin sovellusten sijoittamisen toisten sovellusten sisään Petri Vuorimaa 6
Ohjaus Vierityspalkkeja ym. kutsutaan kontrollielementeiksi Syöttökentistä, painonapeista, vierityspalkeista ym. käytetään myös nimitystä Widget Petri Vuorimaa 7
Ikkunamanagerit Ikkunoinen sijoittelusta, ohjauksesta ym. vastaa ns. ikkunamanageri Ikkunamanageri vastaa tavallaan työpöydän siistinä pitämisestä Yleensä käyttöjärjestelmissä on tarkoin määritelty ja standardoitu ikkunamanageri Petri Vuorimaa 8
Ikkunatapahtumat Käyttäjän syöttölaitteilla tekemät operaatiot muutetaan ohjelmistotapahtumiksi Tapahtumat välitetään aktiivisena olevalla ikkunalle Jokaisella tapahtumalla on tietty tyyppi Lisäksi tapahtuma sisältää tiedon esim. hiiren sijainnista tai painetusta näppäimestä Myös ikkuna, jolle tapahtuma on tarkoitettu, on ilmoitettava Petri Vuorimaa 9
Ikkunatapahtumien jaottelu Ikkunatapahtumat voidaan jakaa: + syöttötapahtumiin + ikkunointitapahtumiin + uudelleenpiirtoon Petri Vuorimaa 10
Syöttötapahtumat Hiiren näppäimet Muokkaajat (Modifiers) Tuplaklikkaus Hiiren liikkeet Hiiri esiin ja pois Näppäimistö Petri Vuorimaa 11
Hiiren näppäimet Hiiri on nykyään tärkein vuorovaikutusväline Yleisin toiminto on osoita-ja-klikkaa Sovelluksen on varmistettava, että hiiri on oikella alueella näppäimen painamisen aikana Erikseen tapahtumat näppäin-alas ja näppäin-ylös Syynä hiiren mahdollinen liikkuminen näppäimen painamisen aikana Petri Vuorimaa 12
Muokkaajat (Modifiers) Hiiren näppäimiä on yleensä vain 2-3, mutta eri toimintoja on enemmän Harvinaisemmat toiminnot saadaan aikaiseksi käyttämällä varsinaisen näppäimistön muokkaaja-näppäimiä + Shitf, Control, Alt, Meta Näiden näppäimien painallukset voidaan välittää erillisinä tapahtumina Yleensä ne kuitenkin välitetään muiden tapahtumien yhteydessä esim. lippuina + Control-Alt-Shift-MiddleButton_up Petri Vuorimaa 13
Tuplaklikkaus Alkuperäisessä Macintosh-tietokoneessa oli vain yksi hiiren näppäin sekä Shift- ja Commandnäppäimet Koska nämä eivät riitä kaikkien toimintojen määrittelemiseen, kehitettiin tuplaklikkaus Tuplaklikkaus on oma erillinen tapahtuma + esim. Windows-käyttöjärjestelmässä on tuplaklikkaus erikseen jokaiselle hiiren näppäimelle Petri Vuorimaa 14
Hiiren liikkeet Ensimmäisissä ikkunointijärjestelmissä sovellukset seurasivat tarvittaessa hiiren liikkeitä jatkuvasti Tämä vei kuitenkin ylimääräistä laskentateho + Normaalisi syöttötietoa tarvitaa 1/5 sekunnin välein + Hiiren liikkeitä pitää kuitenkin seurata 1/60 sekunnin välein Nykyään käyttöjärjestelmä generoi tapahtuman jokaisesta hiiren liikkeestä + Hiiren liikuttaminen hidastaa siis merkittävästi tietokoneen toimintaa + Jos hiirtä ei liikuteta, ylimääräistä kuormitusta ei kuitenkaan ole Petri Vuorimaa 15
Hiiri-esiin ja -pois Hiiri-esiin ja -pois -tapahtumia käytetään, kun hiiri tulee tietyn ikkunan alueelle tai poistuu siltä Näiden tapahtumien avulla ikkuna/sovellus tietää, koska käyttäjän toimenpiteet pitää huomioida Esim. käyttäjä painaa ikkunan painonappia, mutta poistuu ikkunan alueelta, kun näppäin on painettuna Petri Vuorimaa 16
Näppäimistö Näppäimistön tapahtumat eivät ole niin yksinkertaisia kuin luulisi + eri maissa erilaiset näppäimistöt + näppäimeimet toimivat yhdessä (Shift, Alt, Control ym.) + näppäimiä voidaan painaa yhdessä (esim. pianon soitto, pelit) + oikotie (Shortcut) -näppäimet Yleensä jokaisesta näppäimistön tilan muutoksesta lähetetään ns. skannauskoodi (scan code) Ikkunointijärjestelmä muuntamaa nämä raakatapahtumat abstraktimpaan muotoon Petri Vuorimaa 17
Ikkunointitapahtumat Ikkunointijärjestelmä luo myös itse tapahtumia: + ikkunan luonti ja tuhoaminen + ikkunan avaaminen tai sulkeminen Myös ikkunan koon muuttuminen on tärkeä tapahtuma Petri Vuorimaa 18
Uudelleenpiirto Ikkunoiden sisällön päivitys toteutetaan uudelleenpiirto-tapahtumalla Tapahtuma kertoo, myös päivitettävän alueen, jolloin päivitys on nopeampaa Ikkunaan voi piirtää vain uudelleenpiirtotapahtuman tullessa Sovellus ei siis piirrä silloin kuin se haluaa vaan silloin kun ikkunointijärjestelmä niin määrää! Petri Vuorimaa 19
Päätapahtumasilmukka Tapahtumien käsittelyyn pohjaustuva ohjelma eroaa hyvin paljon normaalista ohjelmasta Päärutiini on yleensä hyvin yksinkertainen Initialization while (not time to quit) { Get Next Event E Dispatch Event E } Petri Vuorimaa 20
Alustus Alustus-vaiheessa: + määritetään sovelluksen ikkunat + ladataan data + asetetaan tarvittavat asiat Varsinaiset ikkunat tulevat näkyviin vasta kun uudelleenpiirto-tapahtuma saapuu Petri Vuorimaa 21
Tapahtumajonot Käyttäjän ym. tapahtumat asetataan yleensä tapahtumajonoon Tapahtumat käsitellään yksi kerrallaan jonosta Aina jonoja ei käytetä, vaan tapahtumat lähetetään suoraan käsiteltäväksi Päätapahtumasilmukka vastaa kuitenkin aina tapahtumien käsittelystä Petri Vuorimaa 22
Tapahtumien suodatus Kaikkia tapahtumia ei tarvitse käsitellä + esim. Shift, Ctrl ym. näppäimet Initialization while (not time to quit) { Get Next Event E If (not FilteredEvent(E)) { Dispatch Event E } Petri Vuorimaa 23
Tapahtumien maskaus Sovellusten ei suinkaan tarvitse tietää kaikkia tapahtumia + esim. hiiren tarkat liikkeet Sovellus voi usein kertoa päätapahtumasilmukalle mitkä tapahtumat voi maskata Maskauksen voi tehdä joko sovellus tai ikkuna kohtaisesti Petri Vuorimaa 24
Sovelluksen lopettaminen Alussa käytettiin erityistä lippua, joka kertoi kuinka kauan sovellus on toiminnassa Nykyään käytetään erityistä lopetus-tapahtumaa, joka välitetään kaikille sovelluksen ikkunoille Näin kaikki tarvittavat lopetustoimenpiteet saadaan tehtyä Vasta tämän jälkeen asetetaan lopetuslippu ja päätapahtumasilmukka päätetään Petri Vuorimaa 25
Tapahtumien käsittely Tapahtumat voidaan välittää esim. alimmalla tasolla päälimmäisenä olevalla ali-ikkunalle + Bottom-First (kuvat 4-12 ja 4-13) Petri Vuorimaa 26
Tapahtumien käsittely (jatk.) Toinen vaihtoehto on välittää tapahtumat aina ylimmällä tasolla olevalle ikkunalle + Top-Down Ylin ikkuna välittää tapahtumat edelleen aliikkunoille Näin sovellus voi itse vaikuttaa tapahtumien käsittelyyn Petri Vuorimaa 27
Näppäimistötapahtumat Näppäimistötapahtumat voidaan välittää esim. hiiren osoittamalle ikkunalle Toinen vaihtoehto on klikkaa ja kirjoita, jossa ikkuna on ensin aktivoitava hiirellä Tässä vaihtoehdossa ikkuna voi erikseen pyytää näppäimistö-fokuksen (key focus) Jossakin ikkunointijärjestelmissä aktiivista ikkunaan voi myös vaihtaa erikoisnäppäimillä Petri Vuorimaa 28
Hiirifokus Ali-ikkunat voivat mahdollisesti pyytää myös hiirifokusta ikkunointijärjestelmältä Tällöin ei haittaa vaikka hiiri liikkuisi välillä aliikkunan ulkopuolella Kätevä esim. vierityspalkkien yhteydessä Petri Vuorimaa 29
Olioiden välinen kommunikointi Myös ali-ikkunoiden välinen kommunikointi voidaan hoitaa ns. pseudotapahtumien avulla (kuva 4-15) Petri Vuorimaa 30
Kommunikointitavat Yksinkertainen takaisinsoitto Ilmoitus vanhemmalle Yhteysmalli Petri Vuorimaa 31
Yksinkertainen takaisinsoitto Jokainen widgetti luo joukon takaisinsoittorutiineja, joilla widgetin tilaa voidaan muuttaa Rutiinit rekisteröidään erilliseen listaan Sovelluksen sisällä widgetit voivat muuttaa toistensa tilaa listan avulla Ongelmana on, että eri liitoksia ei hallita mitenkään Petri Vuorimaa 32
Ilmoitus vanhemmalle Tässä mallissa ali-ikkuna ilmoittaa vanhemmalleen tärkeistä muutoksista Tämän jälkeen ylemmän tason ikkuna päättä ämiten ali-ikkunoiden tilaa muutetaan ja välittää tarvittavat tapahtumat niille Etuna on, että ohjauskoodi on selkeästi yhdessä paikassa Petri Vuorimaa 33
Yhteysmalli Tässä mallissa mikä tahansa oli voi suoraan kutsua toisen olion metodeja Hankala malli kahdesta syystä: + olion on tiedettävä mitä kutsuja pitää milloinkin käyttää + tiedot eri metodeista pitää välittää kaikille olioille Em. syistä tarvitaan erityistä tukea ohjelmointikieleltä + esim. JavaBeans Petri Vuorimaa 34