
\documentstyle[a4,finnish]{report}
\begin{document}

\begin{titlepage}
\begin{center}

\vspace{3.0in}

\Huge{
        MapDrawer
}

\vspace{1.0in}

\large{
        Panu A. Kalliokoski \\
        Albertinkatu 22-24 d 38 \\
        00120 Helsinki

        5. toukokuuta 1999
}

\vspace{1.0in}

\small{
        TKTL:n ohjelmoinnin harjoitusty\"o java-kielell\"a \\
        ohjaaja Antti Kerminen
}

\end{center}
\end{titlepage}

\tableofcontents
\newpage

\section{Tiivistelm\"a}

\subsection{Motivaatio}

        Www-sivut, joiden tarkoitus on yleens\"a v\"alitt\"a\"a tietoa
        lukijoilleen, sis\"al\-t\"a\-v\"at monissa yhteyksiss\"a karttoja. Yleens\"a
        n\"am\"a kartat talletetaan bittikarttakuvina (.gif tai .jpeg),
        mik\"a tekee muutokset mahdollisesti ty\"ol\"aiksi ja karttojen
        teke\-mi\-sen mahdottomaksi ilman erillisi\"a ongelmia. Lis\"aksi .gif
        -tiedostoihin liittyy joskus my\"os tekij\"anoikeusongelmia -
        niiden tuottaminen on maksutonta vain yksityiseen
        k\"aytt\"o\"on. MapDrawerin on tarkoitus ratkaista n\"am\"a ongelmat
        ainakin osittain.

\subsection{Kuvaus}

        MapDrawer lukee piirto-ohjeensa sille parametrin\"a annetusta
        URL:sta. Tiedoston tulee olla MapML-muodossa, joka on
        MapDraweria varten kehitetty SGML-muunnelma. MapDrawer muuntaa
        tiedoston ohjeet hierarkkiseksi rakennelmaksi muistiinsa, joka
        sis\"alt\"a\"a kaikki karttaelementit ja niiden ominaisuudet --- kukin
        elementti on yksi olio. 

        MapDrawer pit\"a\"a muistissaan, mit\"a aluetta kartasta ollaan
        tarkastelemassa. Kartassa voi tarkentaa haluamaansa kohtaan
        klikkaamalla sit\"a.

\subsection{MapML}

        MapML (Map Markup Language), MapDrawerin ``kieli'', noudattaa
        SGML-konventioita. Yksi tagipari vastaa yht\"a
        karttaelementti\"a, esi\-mer\-kiksi tagi ``\texttt{<icon>}'' ilmaisee, ett\"a
        senhetkisell\"a elementill\"a on alaelementti, joka on yksitt\"ainen
        merkki --- vaikkapa kyl\"an tai aarrearkun paikka. Elementtien
        ominaisuudet, esimerkiksi se, mik\"a merkki on kyseess\"a,
        kirjoitetaan tagiparin v\"aliin muotoon ``ominaisuus arvo;'',
        joka asettaa ominaisuuden ``ominaisuus'' arvoksi
        ``arvo''. Ominaisuusm\"a\"arittelyiden j\"alkeen elementti suljetaan
        sulkutagilla --- t\"ass\"a tapauksessa ``\texttt{</icon>}''.

        Jotta MapML k\"avisi hyvin sek\"a oikeiden ett\"a kuvitteellisten
        paikkojen kuvaamiseen, siin\"a on tarkkoja ja ep\"am\"a\"ar\"aisi\"a
        m\"a\"arittelyit\"a. Luonnollisemman j\"aljen takaamiseksi
        (esimerkiksi hieman kiemurtelevat tiet) MapDrawer k\"aytt\"a\"a
        jonkin verran pseudosatunnaislukuja. Satunnaisuuden voimakkuus
        on my\"os asetettavissa ominaisuuksin. Satunnaisluvut tuotetaan
        itse tehdyll\"a generaattorilla, joka takaa, ett\"a lukusekvenssi
        on samalle kartalle joka kerralla sama.

\subsection{Tulkintavaiheet}

        Jo ohjetiedostoa luettaessa m\"a\"arittelyt muutetaan tarkoiksi,
        mutta relatiivisiksi arvoiksi. N\"ain v\"altyt\"a\"an kartan
        muuntumiselta satunnaislukujen takia esim. sit\"a
        skaalattaessa. Arvot pidet\"a\"an relatiivisina siksi, ett\"a samaa
        elementti\"a saatetaan k\"aytt\"a\"a useammassa paikassa ja usein
        ominaisuuksien tulkinta riippuu kontekstista. Piirt\"amist\"a
        jatketaan vain tietylle tarkkuusasteelle saakka; t\"at\"a
        tarkkuusastetta voi kasvattaa tarkentamalla johonkin kohtaan
        kartasta.

\newpage
\chapter{Asennus}

        MapDrawerin asennus on suhteellisen helppoa. Noudata seuraavia
        ohjeita:

\begin{enumerate}
\item   Ensiksi, jos tied\"at jonkin paikan, jossa on MapDrawer 
        asennettuna, sinun ei v\"altt\"am\"att\"a tarvitse asentaa sit\"a
        uudelleen. Voit kutsua valmiiksi asennettua versiota.
\item   Pura MapDrawer sopivaan, http:n kautta saatavilla olevaan
        kansioon. Esimerkki: \begin{ttfamily} \\ \$ cd public\_html
        \\ \$ tar xzvf ../tmp/MapDrawer.tar.gz \end{ttfamily}
\item   (T\"am\"an kohdan voit ohittaa, mik\"ali kysess\"a on valmiiksi 
        k\"a\"annetty paketti) K\"a\"ann\"a appletti. Esimerkki: \begin{ttfamily}
        \\ \$ cd MapD \\ \$ javac MapDrawer.java \end{ttfamily}
\end{enumerate}

\chapter{K\"aytt\"o}

        MapDraweria k\"aytt\"a\"aksesi pit\"a\"a tehd\"a seuraavat tiedostot: 

\begin{enumerate}
\item   Www-sivu, joka sis\"alt\"a\"a kartan
\item   Karttatiedosto itse
\item   Kartassa mahdollisesti k\"aytetyt kuvat
\end{enumerate}

\section{Www-sivu}

        MapDraweria kutsutaan normaalin appletin tapaan. Se ottaa
        yhden parametrin: kartan URL:n (suhteellisissa URL:issa
        k\"aytet\"a\"an pohjana www-sivun kanta-URL:\"a). Esimerkki:

        Tiedosto kartta.html sis\"alt\"a\"a seuraavat rivit:
        \begin{ttfamily} \\
        <applet codebase="http://mun.serveri.int/~tunnus/MapD/" \\
        code="MapDrawer.class" width=500 height=500> \\
        <param name="mapfile" value="esimerkki.map"> \\
        </applet>
        \end{ttfamily}

        Kartan nimen (t\"ass\"a ``esimerkki.map'') ei tarvitse noudattaa
        mit\"a\"an erityist\"a muotoa, ja se voi olla yht\"a hyvin t\"aydellinen
        URL. Esimerkiss\"a oletettiin kartan sijaitsevan samas\-sa
        kansiossa HTML-tiedoston kanssa. My\"os leveyden ja korkeuden
        voi m\"a\"aritt\"a\"a mieleisikseen, MapDrawer skaalaa kartan halutun
        kokoiseksi.

\section{Karttatiedosto}

        Karttatiedostot kirjoitetaan MapML:ll\"a, jonka tarkempi
        selvitys on sivulla \pageref{cha:MapML}.

\section{Kuvat}

        MapDrawerissa on mahdollista k\"aytt\"a\"a kartoissa kuvia, vaikka
        kuvat\-to\-mankin kartan kirjoittaminen on helppoa. Kuvat tulisi
        sijoittaa samaan kansioon kuin MapDrawer itse (eli kansioon,
        johon applet-tagin ``codebase'' viittaa), ja niiden pit\"aisi
        olla muodossa, jota www-selaimet osaavat lukea. N\"ait\"a muotoja
        ovat t\"all\"a hetkell\"a .gif- ja .jpeg-tiedostot, sek\"a pikku
        hiljaa yleistyv\"an\"a standardina .png-tiedostot. MapDrawerin
        mukana tulee muutamia yleisk\"aytt\"oisi\"a kuvia.

\chapter{Toiminta}

        Www-seikkailijan tullessa kartan sis\"alt\"av\"alle sivulle tapahtuu
        seuraavaa:

\begin{enumerate}
\item   Selain tulkitsee sivun, n\"aytt\"a\"a v\"alitt\"om\"asti n\"aytett\"aviss\"a olevat
        kohdat ja alkaa ladata MapDraweria muistiinsa.
\item   MapDrawer k\"aynnistyy, katsoo, mist\"a kartta pit\"aisi lukea, ja
        alkaa lukea sit\"a.
\item   Kun karttatiedosto on luettu loppuun, MapDrawer piirt\"a\"a sen.
\item   MapDrawer j\"a\"a odottamaan, ett\"a jotain tapahtuu. Se piirt\"a\"a
        kartan tarvittaessa uudelleen, ja jos k\"aytt\"aj\"a napauttaa 
        hiirell\"a\"an jotain kartan ala-aluetta, MapDrawer n\"aytt\"a\"a kyseisen
        ala-alueen.
\end{enumerate}

\chapter{MapML} \label{cha:MapML}

        MapML on karttojen m\"a\"arittelyyn suunniteltu SGML-kehitelm\"a,
        jossa on my\"os vaikutteita CSS:st\"a, W3C:n
        tyylim\"a\"aritysstandardista. MapDrawer j\"att\"a\"a huo\-mi\-otta
        tiedoston SGML-jaksojen ulkopuolella olevat alueet.

        MapML on lyhenne sanoista ``Map Markup Language'', vapaasti
        suomennettuna ``karttamerkint\"akieli''.

\section{Rakenne}

        Kuten kaikissa SGML-muotoisissa tiedostoissa, MapML:ss\"a
        tiedosto koostuu \textit{elementeist\"a}: joko yksin\"aisest\"a
        tagista tai alku- ja lopputagista, joiden v\"a\-lis\-s\"a on
        tietoja. Yksin\"aiset tagit eiv\"at ole k\"ayt\"oss\"a MapML:ss\"a. Yksi
        \textit{tagi} noudattaa muotoa: ``\texttt{<tagi>}'' (yksin\"aisille ja
        aloitustageille) tai ``\texttt{</tagi>}'' (lopetustageille). Elementin
        alku- ja lopetustagin pit\"aisi sis\"alt\"a\"a sama
        teksti. Elementtej\"a voi sijoittaa sis\"akk\"ain; Elementin sis\"all\"a
        olevaa toista elementti\"a kutsutaan ensimm\"aisen
        \textit{alaelementiksi}.

        Yksin\"aiset ja alkutagit voivat sis\"alt\"a\"a \textit{parametreja}:
        tagin sis\"all\"a olevia, tagista itsest\"a\"an v\"alily\"onnein
        erotettuja lis\"am\"a\"arittelyit\"a. MapML:ss\"a parametreja k\"aytet\"a\"an
        antamaan ohje elementin \textit{kyvyist\"a}: siit\"a, mit\"a kaikkia
        ominaisuuksia elementille voi m\"a\"aritt\"a\"a.

        Alku- ja lopputagin v\"aliss\"a olevat tiedot ovat MapML:ss\"a
        \textit{omi\-nai\-suus\-m\"a\"a\-rit\-te\-lyi\-t\"a}. Ne noudattavat muotoa
        ``ominaisuus arvo;'' (para\-metrit\-to\-mille ominaisuuksille) tai
        ``ominaisuus:parametri arvo;'' (parametrillisille
        ominaisuuksille). Ne tulkitaan j\"arjestyksess\"a ensimm\"aisest\"a
        viimeiseen, ja niiden v\"aliss\"a saa olla kuinka paljon tahansa
        \textit{tyhj\"a\"a} (v\"alily\"ontej\"a, sarakkeenvaihtoja ja
        rivinvaihtoja).

\section{Elementit}

        MapDrawerissa on kolmen tyyppisi\"a elementtej\"a: jako-,
        asettelu- ja piirtoelementtej\"a. Jakoelementin tagi on
        ``\texttt{<divide>}'', asetteluelementin ``\texttt{<layout>}'' ja
        piirtoelementtej\"a ovat ``\texttt{<area>}'', ``\texttt{<stripe>}'', ``\texttt{<icon>}'' ja
        ``\texttt{<text>}''.

\subsection{Jakoelementit}

        Jakoelementeill\"a on olennainen osa MapDrawerin
        toiminnassa. Niiden perustarkoitus on kertoa, kuinka elementin
        alaelementit sijoittuvat elementiss\"a. Niiss\"a m\"a\"aritet\"a\"an
        \textit{ala-alueita}, joihin alaelementit sijoittuvat (samassa
        j\"ar\-jes\-tyk\-sess\"a). Lis\"aksi niist\"a tutkitaan, mihin ala-alueeseen
        k\"aytt\"aj\"a haluaa tarkentaa hiirt\"a napauttaessaan. Seuraavassa
        esitell\"a\"an valittavissa olevat jakoelementit.

\subsubsection{\texttt{<divide>}}

        T\"am\"a on yksinkertaisin jakoelementti. Sille voi kirjoittaa
        alaelementeiksi \texttt{<layout>}-tagilla ala-alueita. Ala-alueet
        lis\"at\"a\"an samassa j\"arjestyksess\"a, kuin ne ovat tiedostossa.

\subsubsection{\texttt{<divide window>}}

        T\"am\"a jakoelementti jakaa is\"ant\"aelementtins\"a nelj\"a\"an
        suorakulmaiseen alu\-ee\-seen, joiden kokoa voi muuttaa. Lis\"aksi
        siihen voi lis\"at\"a \texttt{<layout>}-tagilla lis\"a\-alu\-eita.

        Ominaisuudet: hdiv, vdiv (s.\pageref{prop:divs})

\subsection{Asetteluelementit}

        Asetteluelementit antavat ohjeet siit\"a, millaista
        koordinaattisysteemi\"a piirtoelementti k\"aytt\"a\"a. Oletuksena on
        suora, koko piirtoalueen t\"aytt\"av\"a koordinaattisysteemi (joka
        ei muunna koordinaatteja ollenkaan). T\"ah\"an menness\"a kaikki
        koordinaattisysteemit ovat erilaisia nelikulmioita, joiden
        sis\"a\"an koordinaatit skaalataan. Valittavina ovat seuraavat
        asettelut.

\subsubsection{\texttt{<layout>}}

        Suorakulmainen asettelu. Hyvin helppo tapa pienent\"a\"a
        aluetta. \texttt{<divide window>} k\"aytt\"a\"a suorakulmaisia asetteluja
        toteuttakseen jaon nelj\"a\"an ala-alueeseen.

        Ominaisuudet: left, right, top, bottom (s.\pageref{prop:edges}),
        scale (s.\pageref{prop:scale})

\subsubsection{\texttt{<layout free>}}

        Vapaa nelikulmioasettelu. Skaalaa koordinaatit nelikulmioon,
        jonka jokaisen kulman koordinaatin saa m\"a\"aritt\"a\"a
        erikseen. Kulmat ovat: ``pt:0'' (va\-sen yl\"a\-kulma), ``pt:1''
        (oikea yl\"akulma), ``pt:2'' (oikea alakulma) ja ``pt:3'' (va\-sen
        ala\-kulma).

        Ominaisuudet: left, right, top, bottom (s.\pageref{prop:edges}),
        scale (s.\pageref{prop:scale}), rotation
        (s.\pageref{prop:rotation}), pt (s.\pageref{prop:pt})

\subsubsection{\texttt{<layout round>}}

        Py\"ore\"a asettelu. Skaalaa nelikulmion alueen koordinaatit
        ympyr\"an alueelle siten, ett\"a koordinaatin origokulma pysyy
        samana. Oletuskoko on suurin neli\"on sis\"a\"an mahtuva ympyr\"a ---
        t\"am\"a vastaa keskipistett\"a (pt) $ (0, 0) $ ja s\"adett\"a (scale)
        1.0.

        Ominaisuudet: pt (s.\pageref{prop:pt}), scale (s.\pageref{prop:scale})

\subsection{Piirtoelementit}

        Piirtoelementtej\"a ovat kaikki MapDrawerin varsinaiset
        piirtyv\"at elementit. T\"all\"a hetkell\"a MapDrawerissa voi piirt\"a\"a
        alueita, viivoja, merkkej\"a ja teksti\"a.

        Jokaisessa piirtoelementiss\"a voi olla alaelementtein\"a
        asetteluita, jakoja ja muita piirtoelementtej\"a. Vain alueissa
        jaoilla ja alapiirtoelementeill\"a on jotain merkityst\"a --- muut
        elementit eiv\"at piirr\"a alaelementtej\"a\"an. Asetteluista vain
        viimeisell\"a on vaikutusta. Se kertoo, miten elementti
        asetellaan.

        Jokaisella piirtoelementill\"a on seuraavat ominaisuudet: color
        (s.\pageref{prop:color}), name (s.\pageref{prop:name}), place
        (s.\pageref{prop:place}), randomize (s.\pageref{prop:randomize})

\subsubsection{\texttt{<area>}}

        Koko asettelualueensa t\"aytt\"av\"a alue.

\subsubsection{\texttt{<area formed>}}

        Alue, jolle voi asettaa muodon. Muoto m\"a\"aritet\"a\"an
        p\"a\"ate\-pis\-tein\"a.

        Ominaisuudet: pt (s.\pageref{prop:pt}), interp
        (s.\pageref{prop:interp}), deviate (s.\pageref{prop:deviate})

\subsubsection{\texttt{<stripe>}}

        Piirtyy viivana. Viiva m\"a\"aritet\"a\"an p\"a\"atepistejoukkona.

        Ominaisuudet: pt (s.\pageref{prop:pt}), interp
        (s.\pageref{prop:interp}), deviate (s.\pageref{prop:deviate})

\subsubsection{\texttt{<icon>}}

        Piirt\"a\"a merkin. Merkki luetaan kuvatiedostosta, jonka tulee
        olla samas\-sa kansiossa kuin MapDrawerin.

        Ominaisuudet: pt (s.\pageref{prop:pt}), icon (s.\pageref{prop:icon})

\subsubsection{\texttt{<text>}}

        Kirjoittaa teksti\"a johonkin kohtaan karttaa. 

        Ominaisuudet: pt (s.\pageref{prop:pt}), text (s.\pageref{prop:text})

\section{Ominaisuudet}

        MapML:n ominaisuuksia ei k\"asitell\"a samalla tavoin. Jotkin
        ominaisuudet kumoavat edellisen m\"a\"arittelyn, jotkin vain
        muuntelevat sit\"a; ja usein samaan asiaan vaikuttaa useampi
        ominaisuus. T\"ass\"a ominaisuudet on luokiteltu niiden
        vaikutustavan mukaan.

\subsection{Edellisen m\"a\"arittelyn kumoavat ominaisuudet}

\subsubsection{left, right, top, bottom} \label{prop:edges}

        M\"a\"aritt\"a\"a asettelun vasemman, oikean, yl\"a- tai alareunan,
        vastaavasti. Ottavat arvokseen yhden luvun.

\subsubsection{color} \label{prop:color}

        M\"a\"aritt\"a\"a elementin v\"arin. Ottaa arvokseen kolme lukua:
        punai\-sen, vih\-re\-\"an ja sinisen m\"a\"ar\"an v\"ariss\"a.

\subsubsection{name} \label{prop:name}

        M\"a\"aritt\"a\"a elementin nimen.

\subsubsection{randomize} \label{prop:randomize}

        M\"a\"aritt\"a\"a elementtikohtaisen satunnaislukugeneraattorin
        siemenluvun. Jos et pid\"a jonkin elementin sattumanvaraisesti
        m\"a\"ar\"aytyneest\"a muodosta, voit ko\-keil\-la jotain toista siement\"a
        generaattorille, jolloin tuloksen pit\"aisi olla
        erilainen. Normaalista poiketen arvon tulee olla kokonaisluku.

\subsubsection{hdiv, vdiv} \label{prop:divs}

        M\"a\"aritt\"a\"a vaaka- tai pystysuuntaisen jakokohdan, vastaavasti.

\subsubsection{icon} \label{prop:icon}

        M\"a\"aritt\"a\"a, milt\"a merkki n\"aytt\"a\"a. Ottaa arvokseen kuvatiedoston
        nimen.

\subsubsection{text} \label{prop:text}

        Kertoo tekstielementin varsinaisen sis\"all\"on.

\subsection{Edellist\"a m\"a\"arittely\"a muuntelevat ominaisuudet}

\subsubsection{pt} \label{prop:pt}

        M\"a\"aritt\"a\"a pisteen paikan. Ottaa parametrikseen pisteen
        j\"arjestysnumeron niill\"a elementeill\"a, jotka tarvitsevat
        useampia pisteit\"a. Samaan pisteeseen kohdistuva m\"a\"arittely
        kumoaa edellisen, mutta eri pisteet vain talletetaan
        erillisesti.

        Ottaa arvokseen pisteen x- ja y-koordinaatin.

\subsubsection{interp} \label{prop:interp}

        Interpoloi p\"a\"atepistejoukon pisteet uusiin, entisten v\"alill\"a
        oleviin paik\-koi\-hin, muuntaen samalla niiden m\"a\"ar\"a\"a. Ottaa
        arvokseen kertoimen, joka kertoo, kuinka mo\-nin\-kertaiseksi
        pisteiden m\"a\"ar\"a kasvatetaan.

\subsubsection{deviate} \label{prop:deviate}

        Siirtelee pisteit\"a sattumanvaraisesti, enint\"a\"an arvonsa
        verran.

\subsection{Kasautuvat ominaisuudet}

\subsubsection{place} \label{prop:place}

        Ei oikeastaan varsinainen ominaisuus; sijoittaa elementtiin
        alaelementin, jonka nimi on annettu arvo. Vastaa t\"aysin
        samanlaisen elementin kirjoittamista.

\subsubsection{scale} \label{prop:scale}

        M\"a\"aritt\"a\"a elementin koon. Kertoo kaikki koordinaatit annetulla
        arvolla; skaalaus on suhteessa origoon.

\subsubsection{rotation} \label{prop:rotation}

        M\"a\"aritt\"a\"a elementille, kuinka paljon se on k\"a\"antynyt
        normaalista asennostaan. K\"a\"ann\"osm\"a\"ar\"a annetaan radiaaneissa.

\chapter{Koordinaattisysteemi}

        MapDrawerin koordinaattisysteemi k\"aytt\"a\"a pelk\"ast\"a\"an
        liukulukuja, joten koordinaatit voi m\"a\"aritt\"a\"a l\"ahes
        mielivaltaisella tarkkuudella. Alueen vasemman yl\"akulman
        koordinaatti on $ (-1, -1) $ ja oikean alakulman koordinaatti
        $ (1, 1) $.

        Koordinaattialueen ylitt\"av\"at tai alittavat koordinaatit ovat
        sallittuja; ne sijoittuvat annetun alueen ulkopuolelle. Liian
        kauas alueen ulkopuolelle sijoittuvat koordinaatit saattavat
        tuottaa yll\"atyksi\"a. Lis\"aksi ne rikkovat kartan hierarkkisuuden
        perusperiaatetta, joten niit\"a ei v\"altt\"am\"att\"a kannata k\"aytt\"a\"a.

\chapter{Virheilmoitukset}

        MapDrawer yritt\"a\"a havaita mahdollisimman suuren osan virheist\"a
        jo kartan tulkinnan aikana. Jotkin (harvinaiset) virheet
        kuitenkin huomataan vasta karttaa piirrett\"aess\"a.

        MapDrawer ei n\"ae erityist\"a vaivaa l\"oyt\"a\"akseen virheit\"a
        kartasta, vaan generoi virheilmoituksen vain tilanteessa,
        jossa luontaista oletustulkintaa ei ole. Esi\-merkiksi
        tunnistamattomista ominaisuuksista ei ilmoiteta erikseen,
        koska ne saattavat olla tarkoitetut MapDrawerin tulevien
        versioiden ymm\"arrett\"aviksi.

\section{Tulkinnanaikaiset virheilmoitukset}

\subsection{Non-layout child for combined layout}

        T\"am\"a virheilmoitus annetaan, jos jakoelementill\"a on
        alaelementtin\"a\"an jokin muu elementti kuin
        asetteluelementti. Virheen saa korjatuksi poistamalla kyseisen
        elementin.

\subsection{Sub-layout for non-combined layout}

        Ilmaisee, ett\"a asetteluelementille on yritetty antaa
        alaelementti. Asetteluelementeill\"a ei voi olla
        alaelementtej\"a. Virheen saa korjatuksi poistamalla kyseisen
        elementin.

\subsection{I/O error during connect}

        Karttaa ei pystytty lukemaan, koska sen URL:a ei saatu
        avatuksi. Yleisin syy on karttatiedoston puuttuminen tai
        puuttuvat lukuoikeudet. Tarkista n\"am\"a asiat sek\"a se, onko
        karttatiedoston nimi kirjoitettu ``param''-tagissa oikein.

\subsection{Top element is not map element}

        Kartan hallitseva elementti, eli ylimm\"an tason elementti, ei
        ole piirtoelementti. Tarkista, onko karttatiedostosi
        ensimm\"ainen tagi piirtoelementin tagi.

\subsection{Start tag not found}

        Karttatiedostosta ei l\"oytynyt yht\"ak\"a\"an tagia.

\subsection{Empty tag error}

        Karttatiedostossa on tyhj\"a tai puutteellinen tagi.

\subsection{Unidentified tag}

        Tiedostosta l\"oytyi tunnistamaton tagi. Tarkista, ettei
        tiedoston tageissa ole kirjoitusvirheit\"a. Huomaa, ett\"a tagien
        tunnistamattomat parametrit eiv\"at aiheuta virhetilannetta,
        vaan tulkitaan tuleviksi laajennuksiksi. Niinp\"a esimerkiksi
        ``divide zyxxy'' ei ole virhe.

\subsection{I/O error during read}

        Karttaa lukiessa tapahtui virhe. Katso virheen
        lis\"atietoja. Pelkk\"a sivun uudel\-leen\-lataa\-minen saattaa auttaa.

\subsection{No map name given}

        MapDrawer ei saanut kartan nime\"a. T\"am\"a saattaa johtua siit\"a,
        ett\"a kutsun ``param''-tagi on kirjoitettu v\"a\"arin.

\subsection{Error with URL}

        Kartan nimi on virheellinen. Tarkista, oletko kirjoittanut
        kunnollisen URL:n kartan nimeksi.

\subsection{Bad image name}

        Kartassa on merkki, jonka tiedostonime\"a ei pystytty
        tulkitsemaan. Tarkista kartan merkkien nimet.

\subsection{MapElement child for non-MapElement}

        Jollain asettelu- tai jakoelementill\"a on
        piirto\-ala\-ele\-mentti. T\"am\"a ei ole sallittua.

\section{Piirt\"amisenaikaiset virheilmoitukset}

\subsection{Inconsistent layout}

        Jollain asetteluelementill\"a on ominaisuuksia, joita se ei osaa
        tulkita. T\"am\"an virheilmoituksen todenn\"ak\"oisin syy on se, ett\"a
        kyseisell\"a elementill\"a v\"a\"ar\"anlaisia alaelementtej\"a.

\chapter{Sis\"ainen toiminta}

\section{Luokkien k\"aytt\"o}

        MapDrawerissa jokaista elementti\"a vastaa yksi olio. Jokaiselle
        tagille on oma luokkansa. Kaikkien n\"aiden luokkien
        esirajapinta on ``ParseElement'', joka l\"ahinn\"a m\"a\"aritt\"a\"a
        metodit kartan tulkitsemiseksi. Kaikkien piirtoelementtien
        yl\"aluokka on ``MapElement'', asetteluelementtien
        ``LayoutObject'' ja jakoelementtien ``CombinedLayout''.

        Helpoin tapa laajentaa MapDrawerin toimintaa on kirjoittaa
        uusia luokkia, joille m\"a\"aritt\"a\"a uuden tagiparametrin. Uusia
        tageja ei tule m\"a\"aritt\"a\"a, sill\"a tagijoukon on tarkoitus pysy\"a
        pienen\"a. Uuden luokan kirjoittaessaan on syyt\"a tehd\"a my\"os
        lis\"ays MapDParser-luokan parseTag-metodiin, jotta se tunnistaa
        uuden elementin tagiparametrin.

        Toinen mahdollisuus on muutella olemassa olevien luokkien
        setProperty-metodia ymm\"art\"am\"a\"an uusia ominaisuuksia. Parempi
        tapa kuitenkin on periyt\-t\"a\"a kyseisest\"a luokasta oma
        alaluokkansa, ja korvata setProperty-metodi ymm\"ar\-t\"a\-m\"a\"an uuden
        ominaisuuden.

\section{Luokkien kuvaukset}

\subsection{CombinedLayout}

        Jakoelementtien kantaluokka. Osaa lis\"at\"a ja k\"asitell\"a
        ala-alueita. Ala-alueet sijaitsevat tietoj\"aseness\"a ``areas''.

\subsection{FormedContainer}

        Piirtoelementti, joka piirtyy v\"arillisen\"a monikulmiona.

\subsection{FourEdgeScaler}

        Vapaasti muuteltava nelikulmioasettelu.

\subsection{LayoutObject}

        Asetteluelementtien esiluokka. Kaikissa asetteluelementeiss\"a
        on seuraavat meto\-dit: ``scalePoint'', joka muuntaa
        koordinaatit asettelun systeemin mukaiseksi; ``toPolygon'',
        joka palauttaa aset\-telu\-ele\-mentin muo\-don listana pisteit\"a; ja
        ``getBoundRect'', joka palauttaa koko aset\-telu\-ele\-mentin alueen
        sis\"alt\"av\"an suorakulmion.

\subsection{MapDParser}

        Luokka, joka tulkitsee karttatiedostot.

\subsection{MapDProp}

        Suojaukseton luokka, jota k\"aytet\"a\"an tiedon v\"alitt\"amiseen
        ``set\-Property''-meto\-deil\-le.

\subsection{MapDrawer}

        Ohjelman p\"a\"aluokka. Tekee alustustoimet ja tulkitsee
        hiirenpainallukset.

\subsection{MapElement}

        Piirtoelementtien yl\"aluokka. Sis\"alt\"a\"a monia yleis\-hy\"odyl\-lisi\"a
        meto\-deita, kuten alaelementtien k\"asittelymetodit,
        koordinaattien muuntometodin, satunnaisgeneraattorin,
        alaelementtien piirt\"amisen jne. Kaikkien piirtoelementtien
        tulee m\"a\"aritt\"a\"a metodi ``draw'', jota kutsutaan, kun kyseinen
        elementti halutaan piirt\"a\"a.

\subsection{NullScaler}

        MapDrawerin oletusasettelu.

\subsection{ParseElement}

        Kaikkien elementtien esirajapinta. Uusien elementtien tulisi
        m\"a\"aritt\"a\"a ainakin metodi ``setProperty'', jota kutsutaan
        elementin ominaisuuksien tulkitsemiseksi.

\subsection{PointElement}

        Merkkipiirtoelementti.

\subsection{RectLayout}

        Vapaasti muunneltava suorakulmioasettelu.

\subsection{RelPoint}

        MapDrawerin koordinaattien s\"ailytt\"amiseen k\"aytt\"am\"a
        luokka. Sis\"al\-t\"a\"a tieto\-j\"ase\-net x ja y, jotka ovat liukulukuja.

\subsection{RelRect}

        MapDrawerin suorakulmioiden s\"ailytt\"amiseen k\"aytt\"am\"a luokka.

\subsection{RoundLayout}

        Pisteet py\"ore\"asti skaalaava asetteluluokka. Koska asetteluiden
        pit\"a\"a osata palauttaa muotonsa monikulmiona, RoundLayout
        palauttaa mahdollisimman py\"ore\"an 41-kulmion.

\subsection{StripeElement}

        Viivapiirtoelementti.

\subsection{TextElement}

        Tekstipiirtoelementti.

\subsection{WindowLayout}

        Nelj\"a\"an osaan jakava jakoelementti.

\end{document}
