\documentclass[12pt,a4paper]{article}
\usepackage[finnish]{babel}
\usepackage{epsf}
\usepackage{t1enc}
\usepackage{latexsym}
\begin{document}

%%%%%%%%%%%%% KANSILEHTI %%%%%%%%%%%%%%%%

\begin{titlepage}
\vspace*{1.8cm}
\noindent
\begin{flushleft}
\setlength{\baselineskip}{2\baselineskip}
{\Huge \bf JouTo} \\
{\large \bf Toimittajan työväline} \\
\vspace{1cm}
{\Large \bf Suunnitteludokumentti} \\
{\large Versio 0.1}
\end{flushleft}
\vspace{2cm}

\noindent

\vspace{\fill}
\vspace{2.5cm}
\begin{tabbing}
mmmmmmmmmmmmmmmmm\= Projektiryhmämmm\= Helena Ahonen-Mykam\= \kill
\> 19.2.2001 \\
\> {\sc Helsingin yliopisto} \\
\> Tietojenkäsittelytieteen laitos \\
\> Ohjelmistotuotantoprojekti, kevät 2001, ryhmä 3\\
\> Projektiryhmä: \> Petri Hellemaa (PH)\\
\>                \> Antti Koskinen (AK)\\
\>                \> Lari Laine (LL)\\
\>                \> Jarno Saarto (JS)\\
\>                \> Eija Teitto (ET)\\
\>                \> Harri Tuuloskoski (HT)\\
\> Ohjaaja:       \> Kim Viljanen\\
\> Vastuuhenkilö: \> Raine Kauppinen\\
\> Asiakkaat:     \> Helena Ahonen-Myka\\
\>                \> Greger Lindén\\
\end{tabbing}
\end{titlepage}

\setlength{\parindent}{0pt}
\setlength{\parskip}{1.0ex plus 0.5ex minus 0.2ex}
\advance\textheight by 15mm
\advance\textwidth by 10mm
\hoffset=-4mm
\advance\hsize by 10mm
\pagestyle{empty}
\markright{}

%%%%%%%%%%%%% VERSIOHISTORIA %%%%%%%%%%%%%%%%

{\large \bf Dokumentin versiohistoria}
{\small
\begin{tabbing}
00.0m\= 00.00.0000mi\= \kill
0.1 \> 19.02.2001 \> Ensimmäinen hahmotelma (AK) \\
\end{tabbing}

Tästä dokumentista vastaa Antti Koskinen (AK).
}

\newpage
\tableofcontents
\newpage

\pagestyle{myheadings}
\markright{}
\setcounter{page}{1}

%%%%%%%%%%%%% ASIASISÄLTÖ %%%%%%%%%%%%%%%%
%%%%%%%%% JOHDANTO %%%%%%%%%
\section{Johdanto (AK)}\label{Johdanto}

Tässä suunnitteludokumentissa esitellaan JouTo-ohjelmistotuotantoprojektin tuotteena syntyvä uutistoimittajan työväline. JouTo on lyhenne englannin kielen sanoista {\it "A Journalist's Tool"}.

\subsection{Määritelmät, termit, lyhenteet}\label{Määritelmät, termit, lyhenteet}

{\small
\begin{description}
\item[CSS] Cascading Style Sheets, W3C:n kehittämä, suosittu
HTML- ja XML-dokumenttien ulkoasun määrittelyyn tarkoitettu kieli. \\
{\footnotesize Lisätietoja: {\tt http://www.w3.org/Style/CSS/}}
\item[DoReMi] Document Management, Information Retrieval, Text and Data Mining.
TKTL:n tutkimusryhmä, joka vetää TYTTI-projektia. \\
{\footnotesize Lisätietoja: {\tt http://www.cs.helsinki.fi/research/doremi/}}
\item[DTD] Document Type Definition, W3C:n kehittämä
rakenteisten dokumenttien rakenteen määrittelykieli. \\
\item[EPS] Encapsulated PostScript, kehystetty versio PostScript-kielisestä
ohjelmasta. Ohjelmatiedostoon lisätty kehys määrittää rajat tiedoston
sisällölle ja mahdollistaa sen sijoittamisen haluttuun kohtaan sivua.
\item[HTML] Hypertext Markup Language, WWW-sivujen sisällön
kuvauksessa käytetty koodaus. \\
{\footnotesize Lisätietoja: {\tt http://www.w3.org/pub/WWW/MarkUp/}}
\item[IPTC] International Press Telecommunications Council, kansainvälinen yhteistyöelin,
joka organisoi uutisten määrittelyä ja ryhmittelyä.\\
{\footnotesize Lisätietoja: {\tt http://www.iptc.org/}}
\item[Java] Sunin kehittämä ohjelmointikieli ja järjestelmäriippumaton
ajoympäristö. \\
{\footnotesize Lisätietoja: {\tt http://www.sun.com/java/}}
\item[Javadoc] Sunin kehittämä java-koodin dokumentointi kieli\\
{\footnotesize Lisätietoja: {\tt http://www.sun.com/java/}}
\item[Java SDK] Sunin kehittämä Java-ohjelmointiympäristö.\\
{\footnotesize Lisätietoja: {\tt http://www.javasoft.com/products/}}
\item[JDBC] Java Database Connectivity, Java-kielen rajapinta tietokantojen käyttöön.
\item[NITF] News Industry Text Format, toimittajien kehittämä ja standardoima
XML-pohjainen uutisartikkelien määrittelykieli.
{\footnotesize Lisätietoja: {\tt http://www.nitf.org}}
\item[PostScript] Adoben kehittämä suosittu sivunkuvauskieli.
Tulostettava sivu voidaan lähettää PostScript-kirjoittimelle tiiviinä
PostScript-ohjelmana tilaavievän raakadatan sijaan.
\item[TKTL] Helsingin yliopiston tietojenkäsittelytieteen laitos. \\
{\footnotesize Lisätietoja: {\tt http://www.cs.helsinki.fi}}
\item[TYTTI] Tietotyöläisen työasema. Vuosina 2000-2002 käynnissä
oleva tutkimusprojekti Helsingin yliopiston tietojenkäsittelytieteen
laitoksella, rahoittajina TEKES sekä viisi
suomalaisyritystä: Nokia, Alma Media, Sanoma-WSOY, Vaisala ja
Lingsoft. TYTTI-projektin vastuuhenkilö Helena Ahonen-Myka ja
projektipäällikkö Greger Lindén toimivat JouTo-projektin
asiakkaina. \\
{\footnotesize Lisätietoja: {\tt http://www.cs.helsinki.fi/research/doremi/TYTTI/index.html}}
\item[W3C] World Wide Web Consortium, kansainvälinen yhteistyöelin,
joka koordinoi WWW-tekniikan ja -standardien kehitystä. \\
{\footnotesize Lisätietoja: {\tt http://www.w3.org/pub/WWW/Consortium/}}
\item[WWW] World-Wide Web, Internetissä toimiva palvelu, joka
mahdollistaa tekstin ja kuvien jakamisen helposti ja edullisesti
verkon lukemattomille käyttäjille. WWW:ssä aineisto jaetaan
sivuihin, jotka sijoitetaan WWW-palvelimelle tavallisina tiedostoina
ja hakemistoina.
\item[XML] Extensible Markup Language, W3C:n kehittämä
rakenteisten dokumenttien määrittelykieli. \\
{\footnotesize Lisätietoja: {\tt http://www.w3.org/XML/}}
\item[XSL] Extensible Stylesheet Language, W3C:n kehittämä
XML-dokumenttien ulkoasun määritykseen tarkoitettu kieli. \\
{\footnotesize Lisätietoja: {\tt http://www.w3.org/Style/XSL/}}
\end{description}
}

\subsection{Viitteet}\label{Viitteet}

{\small
\begin{description}
\item{NITFDTD} News Industry Text Format DTD version 2.5 8/2000, {\tt http://www.nitf.org}
\end{description}
}

\subsection{Dokumentin rakenne}\label{Dokumentin rakenne}

Ensimmäinen luku, Johdanto, esittelee tämän dokumentin rakenteen.

\newpage

%%%%%%%%% YLEISKUVAUS %%%%%%%%%

\section{Yleiskuvaus (AK)}\label{Yleiskuvaus}

\subsection{Sovellusalueen kuvaus}\label{Sovellusalueen kuvaus}

JouTo-ohjelmistotuotanto\-projekti on keväällä 2001 Helsingin yliopiston tietojen\-käsittely\-tieteen laitoksella järjestettävän Ohjelmisto\-tuotanto\-projekti-kurssin näytetyö.

Työ liittyy osittain myös laitoksella käynnissä olevaan DoReMi\--tutkimus\-ryhmän "TYTTI- Tietotyö\-läisen työasema"-projektiin, jossa on mukana rahoittajina joukko suomalaisia teknologia\-yrityksiä ja Teknologian kehittämiskeskus. JouTo-projektin tarkoituksena ei kuitenkaan ole valmistaa valmista tuotetta kaupalliseen tarkoitukseen. Tuotettava ohjelmisto toimii prototyyppinä, jota voidaan kehittää myöhemmin lisää. 

\subsection{Laitteistoympäristö}\label{Laitteistoympäristö}

(Laitteistoympäristö jossa ohjelma toimii. Esimerkiksi mitä oheislaitteita tarvitaan, mitä keskusyksiköltä odotetaan, mitä laitteiden ominaisuuksia ohjelma hyödyntää, mitkä laitteiston ominaisuudet rajoittavat teknisiä ratkaisuja, liittymät muihin tietokoneisiin. )

\subsection{Ohjelmistoympäristö}\label{Ohjelmistoympäristö}

(Ohjelmistoympäristö jossa ohjelma toimii. Esimerkiksi käyttöjärjestelmä, kääntäjä, muut apuvälineet, tietokantaohjelmisto, tietoliikenneohjelmisto, www-selain, littymät muihin ohjelmistoihin/sovelluksiin, muut laitteistossa yhtä aikaa ajettavat ohjelmat. Luonnollisesti tarkkoine versioineen.)

\subsection{Standardit ja Sopimukset}\label{Standardit ja Sopimukset}

\subsubsection{Ohjelmointityyli}\label{Ohjelmointityyli} 

Ohjelmiston käyttöliittymä toteutetaan WWW-selaimen graafisena Java-Applettina, jolloin valmiiden komponettien koodi tulee sellaisenaan. Vain oman kohjelmakoodin laatimiseen sovelletaan omaa ohjelmointityyliä.

Luokkien, muuttujien tms. nimet kirjoitetaan englanniksi noudattaen yleisesti hyväksyttyjä nimeämistapoja. Ohjelmointityylistandardina käytetään Sun Microsystemsin Java Coding Style Guide -käytäntöä {\footnotesize {\tt http://www.sun.com/forte/whitepapers/java-style.pdf}}.

Lohkon aloittavan aaltosulun sijainti on heti lohkon nimen perään samalla rivillä. Lopettava aaltosulku sijaitsee omalla rivillä sisennettynä samalle tasolle kuin lohkon aloittavan rivin ensimmäinen kirjain.

Esimerkki:
\begin{verbatim}
        public class Program {
        //... koodi
        }
\end{verbatim}

Sama tyyli kuin edellä koskee myös esimerkiksi for()- ja while()-silmukkoja.

Esimerkki:

\begin{verbatim}
      int SomeFunction(int i) {
         for(int j = i; j <= i*i; ++j) {
            System.out.println("j:n arvo: " + j);
         }
         return j;
      }
\end{verbatim}

Jokaisen Java-ohjelmatiedoston tai sen osaan kirjoitetaan selostus, mistä ohjelmasta tai ohjelman osasta on kyse, kuka on tekijä, koska ohjelmaa on viimeksi muutettu ja niin edelleen.  

%%%%%%%%% ARKKITEHTUURIN KUVAUS %%%%%%%%%

\section{Arkkitehtuurin kuvaus}

\subsection{Ratkaisun filosofiaa}

\subsection{Tietokanta-arkkitehtuuri}

\subsection{Ohjelmisto-arkkitehtuuri}

%%%%%%%%% LUOKKAKUVAUKSET %%%%%%%%%

\section{Luokkakuvaukset PH ja LL}\label{Luokkakuvaukset}

Luokat eivät ole vielä missään järjestyksessä. Luokkien järjestystä tullaan muuttamaan tulevaisuudessa.

\subsection{ContentManager (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ContentManager-olio huolehtii yhden NITF-dokumentin sisällön hallinnasta.
Dokumentin muokkaaminen tapahtuu luokan aksessorien kautta.
Olio pitää huolen siitä, että jokaisen muutoksen
jälkeen dokumentti noudattaa rakennemäärittelyä.
ContentManager perii luokalta {\em org.xml.sax.helpers.DefaultHandler}
rajapinnan SAX-jäsentimeen tapahtumankäsittelymetodeineen.
Artikkelia säilytetään XML-elementeistä koostuvassa puurakenteessa.
Elementit ovat Elem-olioita ja elementtien attribuutit Attrib-olioita.

Kun sovelma on vastaanottanut DTD:n, luodaan ContentManager-olio
kutsumalla luokan konstruktoria, joka ottaa parametreikseen
mahdollisesti vastaanotetun artikkelin ja DTD:n InputStream-olioina.
Ensin käsitellään DTD
{\em Mark Wutkan} DTD-jäsentimellä\footnote{http://www.wutka.com/dtdparser.html},
joka luo DTD-olion.
Se puolestaan sisältää rakennemäärittelyssä esitellyt elementit
hajautustaulussa. Elementtien ja attribuuttien määrittelyt jäsentyvät eri
luokkien olioiksi. Jäsentimen Javadoc-dokumentaatio on osoitteessa\\
{\tt http://www.wutka.com/dtdparserapi/}

{\footnotesize SUUNNITTELUPERIAATTEISIIN:
Koska nykyiset validoivat XML-jäsentimet vaativat syötteekseen
kokonaisen artikkelin DTD-viitteineen merkkijonomuodossa ja tarkastavat
paitsi artikkelin jokaisen osan rakenteen myös hyvämuotoisuuden,
niiden käyttö olisi aivan liian hidasta jatkuvan validiuden pakottavassa
ohjelmassa.
}

Kun DTD on jäsennetty, ContentManager käy läpi elementtien lapsirajoitteet
ja tekee säännöllisistä lausekkeista epädeterministisiä äärellisiä
automaatteja muistuttavia sääntöverkkoja aina, kun kyseessä ei ole tyhjä
kieli EMPTY tai universaalikieli ANY. Sääntöverkot rakentuvat ANode-olioista.
Sääntöverkot sekä DTDAny- ja DTDEmpty-oliot sijoitetaan hajautustauluun
{\em childConstraints} elementtien nimillä,
joilla validointiin käytettävä {\em acceptChildren}-metodi pääsee niihin käsiksi.

Sääntöverkkojen avulla tarkistetaan, johtaako elementin lapsisarjaan kohdistuva
muok\-kaus\-toi\-minto\footnote{Lapsisarjaan kohdistuvia muutoksia ovat
  lasten lisäys, poisto, järjestyksen muuttaminen ja korvaaminen.}
DTD:n sallimaan rakenteeseen.
Elementin {\em e} lapsisarjaan kohdistuva muutos sallitaan vain, jos {\em e}:n
säännöllinen lauseke tai siitä luotu sääntöverkko tuottaa
muutoksen tuloksena syntyvän lapsisarjan.

Attribuutteihin liittyvät rajoitteet selviävät
DTD-jäsentimen elementtikohtaisesti luomista DTDAttribute-olioista.

Kun tietokannasta ladataan artikkeli, käytetään elementtipuun
rakentamiseen {\em A\-pa\-che Xer\-ces Java}
-kirjaston\footnote{http://xml.apache.org/xerces-j/}
SAX-jäsennintä. XML-kirjaston dokumentaatio on osoitteessa\\
{\tt http://xml.apache.org/xerces-j/api.html}\\
Ennen dokumentin syöttämistä jäsentimelle siitä poistetaan
viite rakennemäärittelyyn, koska DTD:t ovat tietokannassa eikä niillä ole
URL-osoitetta.
SAX-jäsennin tarkistaa siis vain vastaanotettavan dokumentin hyvämuotoisuuden.
Jäsennintä käytetään vain rakennettaessa ladatusta dokumentista
elementtipuuta.

Dokumentin jäsennys SAX-rajapinnalla on tapahtumaohjattua.
Jäsennin lukee dokumenttia suoraviivaisesti alusta loppua kohti ja
jokaisen elementin alkaessa ja loppuessa lähettää SAX-tapahtuman.
XML-elementti validoidaan vasta
jäsentimen kohdatessa elementin lopun, jolloin vastava SAX-tapahtuma siirtää
suorituksen endElement-metodiin.
Vasta tällöin kaikki lapsielementit ovat tiedossa. Lapsisarja validoidaan
sääntöverkoilla ja attribuutit DTD-jäsentimen luomien
DTDAttribute-olioiden tiedoilla.

ContentManagerin {\em toString}-metodi palauttaa artikkelin XML-muodossa.

%BodyCanvas-luokka, jonka kautta artikkelin runkoa muokataan,
%pitää ContentManagerin tiedossa käyttäjän valitseman muokkauskohteen.
%Muokkauskohde on tyypillisesti tekstiä kirjoitettaessa kohdistimen
%osoittama tekstinkohta, tyhjä alue.
%Muokkauskohde voi olla myös "maalattu" alue, joka voi sisältää
%useita elementtejä sisältöineen (ja reunoilla PCDATAa), tai yksi elementti
%ilman sisältöään.
%Valittua kohdetta muokataan kutsumalla {\em edit}-metodia, jolle
%välitettävä ContentEvent-olio kertoo, mitä kohteelle halutaan tehdä.
%ContentEventit jakautuvat korvaus- ja tuhoamistoimintoihin.
%Lisääminen on tyhjän alueen korvaamista ja poistaminen korvaamista
%tyhjällä alueella.

Kun luodaan uusi artikkeli, kutsutaan ContentManagerin konstruktoria
ainoastaan dtd-parametrilla. ContentManager rakentaa hyväksyttävän artikkelipohjan
läpikäymällä sääntöverkkojen solmuja. Elementille lisätään aina
verkon ensimmäisen polun määrittelemä lapsisarja.
Verkot rakennetaan niin, että ensimmäinen polku on lyhin mahdollinen.
Jos elementti ei vaadi lapsielementtejä, niitä ei luoda.

Peruutustoiminto?
% Alue voidaan korvata leikepöydän sisällöllä tai näppäintapahtuman merkillä.
% Kohde voidaan myös tuhota.

Leikepöytä?

\subsubsection{Attribuutit}
{\em private DTD dtd}\\
DTD-jäsentimen palauttama DTD-olio.

{\em private Elem nitf}\\
Elementtipuun juurisolmu, joka esittää NITF-elementtiä.

{\em private Hashtable childConstraints}\\
Hajautustaulu, joka sisältää jokaista DTD:ssä määriteltyä
elementtiä kohti sen lapsirajoitteet esittävän säännöllisen lausekkeen
pohjalta rakennetun sääntöverkon tai DTDAny-olion tai DTDEmpty-olion.
Hajautustaulun avaimina käytetään elementtien nimiä.

\subsubsection{Metodit}
{\em public ContentManager(InputStream dtd)}\\
Luo ContentManager-olion ja pohjan uudelle artikkelille.
Artikkelipohja on minimaalinen hyväksyttävä elementtipuu.
Parametrin {\em dtd} avulla välitetään rakennemäärittely jäsennettäväksi.

{\em public ContentManager(InputStream dtd, InputStream doc)}\\
Luo ContentManager-olion ja rakentaa elementtipuun ladatusta artikkelista {\em doc}.
Parametrin {\em dtd} avulla välitetään rakennemäärittely ja
parametrin {\em doc} avulla dokumentti jäsennettäviksi.

%{\em public boolean canEdit(ContentEvent ev)}\\
%Kertoo, voidaanko elementtipuuhun kohdistaa
%muutos {\em ev}.
%{\em public boolean edit(ContentEvent ev)}\\
%Kohdistaa elementtipuuhun muutoksen {\em ev}, mikäli rakennemäärittely
%sallii sen.
%Palauttaa totuusarvona tiedon muutoksen onnistumisesta.


{\em private boolean addLastChild()}\\
Tällä metodilla lisätään elementin lapsisarjan jatkoksi uusi elementti.
Metodia käytetään vain puuta rakennettaessa.

Artikkelin sisällön muokkaus tapahtuu seuraavanlaisilla metodeilla:

{\em public boolean addAttribute(Attrib a, Elem e)}\\
{\em public boolean delAttribute(Attrib a, Elem e)}\\
{\em public boolean setAttribute(Attrib a, Elem e, String value)}\\
{\em public boolean addChar(PCData e, int index)}\\
{\em public boolean delChar(PCData e, int index)}\\
{\em public boolean addChildAt(Elem child, Elem parent, int index)}\\

Yrittää lisätä elementin {\em child} {\em parent}-elementin lapseksi
lapsisarjan kohtaan {\em index}. Palauttaa tiedon onnistumisesta totuusarvona.

Muokkausrajapintaa kehitetään käyttöliittymäkomponenttien
tarpeiden mukaisesti.

{\em public Elem getRoot()}\\
Palauttaa viitteen puun juurielementtiin.
Metodia käyttää tietoliikenneluokka tallennuksen yhteydessä.

{\em public Elem getHead()}\\
Palauttaa viitteen puun head-elementtiin.
Metodia käyttää artikkelin metatietojen muokkauskomponentti.

{\em public Elem getBody()}\\
Palauttaa viitteen puun body-elementtiin.
Metodia käyttää artikkelin rungon muokkauskomponentti.

{\em public boolean acceptElement(Elem e)}\\
Onko elementti {\em e} hyväksyttävä.

{\em public boolean acceptChildren(Elem e)}\\
Onko elementin {\em e} lapsisarja hyväksyttävä.

{\em public boolean acceptAttributes(Elem e)}\\
Ovatko elementin {\em e} kaikki attribuutit hyväksyttäviä.

{\em public boolean acceptAttribute(Attrib a, String elem)}\\
Onko {\em elem}-nimisen elementin attribuutti {\em a} hyväksyttävä.

{\em public String[] getAcceptableSuccessors(String parent, String[] predecessors)}\\
Palauttaa välittömästi {\em parent}-elementin lapsien {\em predecessors} jälkeen
sisaruksiksi lisättävissä olevien elementtien nimet.

{\em public String toString()}\\
Palauttaa dokumentin XML-muodossa.

%\begin{figure}[!h]
%\begin{center}
%\epsffile{elementtipuu.eps}
%\end{center}
%\caption{Elementtipuu}
%\end{figure}

\subsection{BodyPanel (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Tämän Panelin aliluokan olion avulla selataan dokumentin runkoa.
Se sisältää Scrollbarin, kaksi painiketta ja varsinaisen BodyCanvas-muokkauskomponentin,
joka kuuntelee painikkeita ja Scrollbarien säätötapahtumia.
Scrollbar on dokumentin selaamiseen riveittäin ja
nuolen kuvin varustetut painikkeet sivuttaissuuntaiseen, pitkien esimuotoiltujen
tekstirivien selaamiseen. Painikkeilla liikutaan sivusuunnassa puolen sivun verran kerrallaan.

\subsubsection{Attribuutit}
{\em private Scrollbar lineBar}\\
Scrollbar, jolla dokumenttia selataan riveittäin.

{\em private Button left}\\
Painike vasemmalle selaamiseen.

{\em private Button right}\\
Painike oikealle selaamiseen.

{\em private BodyCanvas bodyCanvas}\\
Varsinainen artikkelin rungon muokkauskomponentti.

\subsubsection{Metodit}
{\em public BodyPanel()}\\
Luo BodyPanel-olion.

\subsection{BodyCanvas (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

BodyCanvas-komponentin kautta käyttäjä muokkaa artikkelin runkoa.
\subsubsection{Attribuutit}
{\em public static final Font  TEXT\_FONT}\\
Käytetty kirjasintyyppi.

{\em public static final int   CHAR\_WIDTH}\\
Merkin leveys pikseleinä.

{\em public static final Color BG\_COLOR}\\
Taustaväri.

{\em public static final Color TEXT\_COLOR}\\
Tekstin väri.

{\em public static final int   LINE\_HEIGHT}\\
Rivikorkeus.

{\em public static final int   TOP\_MARGIN}\\
Ylämarginaali.

{\em public static final int   BOTTOM\_MARGIN}\\
Alamarginaali.

{\em public static final int   LEFT\_MARGIN}\\
Vasen marginaali.

{\em public static final int   RIGHT\_MARGIN}\\
Oikea marginaali.

{\em public static final int   MAX\_COLS}\\
Kuinka monta saraketta voidaan näyttää kerralla.

{\em public static final int   MIN\_COLS}\\
Kuinka monta saraketta rivin tulisi olla vähintään pitkä,
ennen kuin se voidaan katkaista.

{\em public static final int   MAX\_LINES}\\
Kuinka monta riviä voidaan näyttää kerralla.

{\em private int curLine, curCol}\\
Kohdistimen rivi ja sarake.

{\em private int topLine}\\
Yläreunassa näkyvä rivi.

{\em private int leftCol}\\
Vasemmassa reunassa näkyvä sarake.

{\em private BodyPanel bodyPanel}\\
Viite BodyPaneliin, joka sisältää tämän komponentin.

{\em private Scrollbar  lineBar, colBar}\\
Viitteet BodyPanelin Scrollbareihin, joiden säätötapahtumia kuunnellaan.

{\em private Block      body}\\
Viite elementtipuun body-elementtiin.

{\em private Image      hiddenImage}\\
Kuva piirtopuskurista.

{\em private Graphics   hiddenGraphics}\\
Piirtopuskuri, johon teksti piirretään ennen näyttämistä.

{\em private ContentManager man}\\
Viite ContentManager-olioon.


\subsubsection{Metodit}

{\em public BodyCanvas(Scrollbar lineBar, Scrollbar colBar)}\\
Luo BodyCanvas-olion.
Parametreina välitetään viitteet BodyPanelin Scrollbareihin,
joiden säätötapahtumia kuunnellaan.

{\em public void paint(Graphics vg)}\\
Piirtää ja näyttää näkymän artikkelin runkoon.
{\em vg} on viite näkyvään grafiikkaan.

{\em public void keyPressed(KeyEvent e)}\\
Suoritetaan, kun jokin erikoisnäppäin painetaan alas
näppäintapahtumana {\em e}.

{\em public void keyReleased(KeyEvent e)}\\
Suoritetaan, kun jokin erikoisnäppäin vapautetaan
näppäintapahtumana {\em e}.

{\em public void keyTyped(KeyEvent e)}\\
Tapahtumankäsittelymetodi, joka suoritetaan, kun
käyttäjä kirjoittaa jonkin merkin tai painaa
backspace tai delete. {\em e} on vastaava näppäintapahtuma.


\subsection{TreeNode (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


Elementtipuu rakennetaan TreeNode-rajapintaa soveltavista
olioista. TreeNode-rajapinnalta peritään
metodi {\em toString}, joka tulostaa solmun sisällön.

PCData vastaa XML-dokumentin PCDATA-osuutta eli tekstiä.
Tekstisolmuilla ei ole lapsisolmuja.

Elem-luokan olio vastaa XML-elementtiä.
Elem-olioilla on tunnistenimi {\em tagName} ja
vektorit lapsielementeille ja attribuuteille.

Rivielementit ovat Inline-olioita ja
lohkoelementit Block-olioita.
Block on kuin Elem, mutta se muistaa korkeutensa riveinä ja
tuntee isäelementtinsä. Dokumentin selaaminen riveittäin
perustuu lohkojen korkeustietoihin. Kun luodaan uusi
tyhjä lohko, sen korkeudeksi asetetaan 1. Samalla lisätään
isäelementin korkeutta yhdellä rivillä. Aina kun korkeutta
muutetaan, muutetaan elementin isän korkeutta yhtä paljon.
Kun lohko tuhotaan, vähennetään isälohkon korkeutta tuhotun
lohkon korkeuden verran.
Lohkoja käytetään vain dokumentin body-elementin alipuussa.
bodyn isäelementiksi asetetaan null-osoite.
BodyCanvas on linkitetty body-elementtiin.

DTD:ssä ei rivi- ja lohkoelementtejä ole eritelty, vaan
BodyCanvas-luokan hajautustaulussa on kaikkien
lohkotyyppisten elementtien tunnistenimet. Jos body-alipuun
elementti mainitaan taulussa, siitä tehdään Block, muutoin Inline.
body-alipuun ulkopuolella elementit ovat Elem-olioita.

\begin{figure}[!h]
\begin{center}
\epsffile{treenodes.eps}
\end{center}
\caption{Elementtipuun solmujen luokat.}
\end{figure}

\subsection{PCData (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

PCData-olio vastaa PCDATAa XML-dokumentissa.
\subsubsection{Attribuutit}
{\em private StringBuffer text}\\


\subsection{Elem (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Elem-luokan olio esittää XML-dokumentin yhtä elementtiä.
\subsubsection{Attribuutit}
{\em private String tagName}\\
Elementin tunnistenimi.

{\em private Vector children}\\
Elementin lapsielementit.

{\em private Vector attributes}\\
Elementin attribuutit Attrib-olioina.

%\subsubsection{Metodit}

\subsection{Inline (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Rivielementtien luokka.

\subsection{Block (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Block on lohkotyyppinen XML-elementti ja Elem on sen yliluokka.
Dokumentin rungon selaaminen perustuu siihen, että jokainen lohko tuntee korkeutensa riveinä.
Lohkoja ovat muun muassa kappaleet, listat ja otsikot.
Kun uusi lohko luodaan, se saa korkeuden 1. Aina, kun korkeutta muutetaan, lisätään
myös lohkon isäelementin korkeutta muutoksen verran.

\subsubsection{Attribuutit}
{\em private int height}\\
Lohkon korkeus riveinä.

\subsubsection{Metodit}
{\em public Block getParent()}\\
Palauttaa isäelementin.

{\em public int getHeight()}\\
Palauttaa lohkon korkeuden riveinä.

{\em public void setHeight(int height)}\\
Asettaa lohkon korkeudeksi {\em height} riviä.

%\subsection{CommentBlock (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{Attrib (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Tämän luokan olio esittää XML-elementin yhden attribuutin tietosisältöä.

{\em public String toString()}\\
Palauttaa attribuutin XML-esitysmuodossa.

\subsection{ANode (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ANode on sääntöverkon solmu.
Solmuilla on arvo ja taulukko seuraajasolmuja.
Seuraajasolmujen arvot kertovat siirtymät.
Verkon polut päättyvät null-viitteeseen.

Kunkin solmun seuraajataulukkoon asetetaan
seuraajat seuraavaan järjestykseen:
ensiksi mahdollinen ohitussiirtymä,
seuraavaksi kaikki ei-tyhjät siirtymät ja
viimeiseksi mahdollinen silmukkasiirtymä.
Kuvassa \ref{anodeeps} on esitetty verkon rakennussäännöt.

%Käyttäjän lisätessä uuden elementin artikkeliin
%luodaan sille sääntöverkon ensimmäisen polun
%määrittelemä lapsisarja.
%Verkot rakennetaan niin, että soveltamalla aina solmun
%ensimmäisen seuraajan sääntöä ei jouduta ikuiseen silmukkaan.

Käytännössä solmut sisältävät elementtien nimiä ja
verkkoja käytetään elementin lapsisarjan hyväksyttävyyden
tarkistamiseen. ContentManager kutsuu verkon juurisolmun
{\em acceptPath}-metodia
parametreilla {\em path} ja {\em index}. {\em path}in pitää sisältää
lapsisarjan elementtien nimet String-taulukossa ja
{\em index}-muuttujan arvon pitää olla 0. {\em acceptPath} on
rekursiivinen metodi ja {\em index} osoittaa
kohtaa, johon asti polku on hyväksytty.
Silmukoiden välttämiseksi matkan varrella merkitään
tyhjän merkkijonon solmut (lambda-solmut) kulloisellakin indeksillä.
Jos saavutaan lambda-solmuun samalla indeksillä kuin millä se
on merkattu, tiedetään, että jatkamalla jouduttaisiin silmukkaan.
Näissä tilanteissa kurkistus hylätään ja siirrytään seuraavaan
haaraan.

Kun käyttäjä yrittää lisätä elementin, joka vaatii lapsielementtejä,
sovelletaan aina solmun ensimmäisen seuraajan sääntöä.
Esimerkiksi lausekkeella (a | b) luodaan lapsi a,
lausekkeella (a | b)* ei luoda yhtään lasta,
ja lausekkeella (((a | b), c) | d)+ luodaan lapset a ja c.
Myöhemmin käyttäjä voi tietysti korvata
elementit, joihin ei ole tyytyväinen, joillakin toisilla.
Ensimmäisen säännön periaate tulee
ottaa huomioon rakennemäärittelyä kirjoitettaessa.


\subsubsection{Attribuutit}
{\em private String value}\\
Solmun (säännön) tuottama merkkijono.

{\em private int index}\\
Apukenttä, jolla voidaan merkitä kuljettu polku
silmukoiden välttämiseksi.

{\em private ANode[] successors}\\
Solmun seuraajat.

{\em public static final String LAMBDA}\\
Tyhjä merkkijono "".

\subsubsection{Metodit}
{\em public ANode(String value, ANode[] successors)}\\
Luodaan uusi solmu, jolle annetaan arvoksi {\em value} ja
seuraajiksi {\em successors}.

%{\em public String getValue()}\\

%{\em public int getIndex()}\\

%{\em public ANode[] getSuccessors()}\\

{\em public boolean acceptPath(String[] path, int index)}\\
Kertoo, tuottaako jokin solmusta alkava polku
merkkijonot {\em path[index]...path[N]}, missä {\em N} on taulukon suurin
indeksi.

{\em public void addSuccessor(ANode successor)}\\
Lisää solmulle uuden seuraajasolmun {\em successor}.

\begin{center}
\begin{figure}[!h]
\epsffile{anodes.eps}
\caption{Sääntöverkon rakentaminen säännöllisestä lausekkeesta.}\label{anodeeps}
\end{figure}
\end{center}


%\subsection{ContentEvent (PH)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Muokkaustapahtumien abstrakti yliluokka.


% \subsection{AttribEditor (PH)}
% \subsection{PanelFolder (PH)}
% \subsection{ButtonPanel (PH)}
% \subsection{Pääluokka Editor (PH)}
% \subsection{HeadPanel (PH)}





% \begin{itemize}
% \item ulkoasumäärittelyjen lisäys artikkeliin
% \end{itemize}

% \begin{enumerate}
% \item Toimittaja haluaa syöttää uuden artikkelin JouTo-järjestelmään.
% \end{enumerate}

% \begin{description}
% \item[Esiehdot:]    Käyttäjä on käynnistänyt selaimen ja on JouTo-\-järjestelmän pääsivulla.
% \end{description}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SERVERIN KAMA

\subsection{Communications.java}

Tämä olio tarjoaa rajapinnan palvelin puolelle.

\subsubsection{String loadArticle(integer id)}

\begin{description}
\item[parametrit:]	Artikkelin id-numero
\item[palauttaa:]	Tietokannasta ladatun artikkelin yhtenä string oliona.
\item[toiminta:]	Kutsuu loadArticle nimistä servlettiä, joka lataa tietokannasta halutun artikkelin.
\end{description}

\subsubsection{String loadDTD(integer id)}

\begin{description}
\item[parametrit:]	DTD:n id-numero	
\item[palauttaa:]	Tietokannasa ladatun DTD:n yhtenä string oliona.
\item[toiminta:]	Kutsuu loadDTD nimistä servlettiä, joka lataa tietokannasta halutun DTD:n.
\end{description}

\subsubsection{String saveArticle(contentManager artikkeli, boolean uusi)}

\begin{description}
\item[parametrit:]	Haluttu artikkeli contentManager-oliona, tieto siitä halutaanko tallentaa samalla nimellä vai uudella
\item[palauttaa:]	mahdollinen tietokannan virheilmoitus
\item[toiminta:]	Ensin muutetaan artikkeli xml-dokumentin muotoon ja sen jälkeen lähetetään saveArticle-servletille
					artikkeli. Uusi-parametrillä määritellään tehdäänkö tallennus vanhan päälle vai uutena rivinä kantaan. 
\end{description}

\subsubsection{String[] listArticles()}

\begin{description}
\item[parametrit:]	---
\item[palauttaa:]	String taulukon joka sisältää kannassa olevien artikkeleiden listauksen.
\item[toiminta:]	Kutsuu listArticles-servlettiä, joka hakee kannasta artikkelien otsikot.
\end{description}

\subsubsection{String[] listDTD()}

\begin{description}
\item[parametrit:]	---
\item[palauttaa:]	String taulukon joka sisältää kannassa olevien DTD:iden otsikot
\item[toiminta:]	Kutsuu listDTD-servlettiä, joka hakee kannasta DTD:iden otsikot.
\end{description}

\subsection{Servletit}

Kaikki servletit rakentuvat yhdestä \emph{service}-functiosta. Tämän lisäksi ne kutsuvat Database-olion functioita tietokannan käyttämiseksi. 

\subsubsection{loadArticle.java}

\begin{description}
\item[parametrit:]	id = artikkelin id-numero
\item[palauttaa:]	Halutun artikkelin
\item[toiminta:]	Hakee tietokannasta artikkelin id-numeron perusteella oikean artikkelin ja lähettää sen appletille.
\end{description}

\subsubsection{loadDTD.java}

\begin{description}
\item[parametrit:]	id = DTD:n id-numero
\item[palauttaa:]	Halutun DTD:n
\item[toiminta:]	Hakee tietokannasta DTD:n id-numeron perusteella oikean DTD:n ja lähettää sen appletille.
\end{description}

\subsubsection{saveArticle.java}

\begin{description}
\item[parametrit:]	??? Kaikki taulun kentät ja artikkeli kokonaisena
\item[palauttaa:]	ok tai mahdollisen tietokantavirheen tuloste
\item[toiminta:]	Tallentaa artikkelin ja muut artikkeliin liittyvät kentät tietokantaan.
\end{description}

\subsubsection{listArticles.java}

\begin{description}
\item[parametrit:]	---
\item[palauttaa:]	Artikkelin otsikko / id / description / DTD-id
\item[toiminta:]	Hakee tiedon artikkelit taulun sisällöstä ja lähettää sen appletille. 
\end{description}

\subsubsection{listDTD.java}

\begin{description}
\item[parametrit:]	---
\item[palauttaa:]	DTD:n otsikko / id / kuvaus
\item[toiminta:]	Hakee tiedon DTD taulun sisällöstä ja lähettää sen appletille
\end{description}

%%%%%%%%% KÄYTTÖLIITTYMÄ %%%%%%%%%

\section{Käyttöliittymä(HT ja ET)}\label{Käyttöliittymä}

Ohjelmiston käyttöliittymä toteutetaan WWW-selaimeen graafisena Java-Applettina. Käyttöliittymässä käytetään valmiita Java Swing-komponentteja mahdollisimman laajasti. Varsinainen käyttöliittymä totetutetaan käyttäen Bordland JBuilder 4 -kehitystyökalua ja sen ominaisuuksia. Käyttöliittymän kieli on englanti.

\subsection{Käytettävät tekniikat(HT)}\label{Käytettävät tekniikat}

Ohjelmiston kehityksessä käytetään Bordland JBuider 4 -kehitystyökalua ja sen tarjoamia ominaisuuksia. JBuilder 4 käyttää standardia Java-kirjastoa sekä Swing-komponentteja joita tarvitaan käyttöliittymän kehittämisessä.

Ohjelmistossa käytetään Javan versiota 1.2.2 ja vastaavia Swing\--komponentteja.

(Tähän pitäisi kirjoittaa lista käytettävistä UI-komponenteista.!)

\subsection{Käyttöliittymän elementit(HT)}\label{Käyttöliittymän elementit}

Tässä luvussa kuvataan ohjelmiston asiakkaan puolen käyttöliittymä käyttöliittymä ja sen toiminnat. 

\subsubsection{Valikot}\label{Valikot}

Ohjelmiston valikoista käyttäjä pääsee ohjaaman monia ohjelman toimintoja. Ohjelmassa on neljä valikkoa: File, Edit, Options ja About. \\

File-valikosta löytyvät seuraavat toiminnot

\begin{itemize}
\item \emph{New}-toiminnolla käyttäjä voi avata uuden artikkelin.
\item \emph{Open}-toiminnolla käyttäjä voi avata aikaisemmin tallennetun artikkelin.
\item \emph{Save}-toiminnolla käyttäjä tallettaa editorissa olevan artikkelin.
\item \emph{Save As New}-toiminnolla käyttäjä voi tallettaa artikkelin uudella nimellä tallentamatta sitä edellisen artikkelin päälle.
\item  \emph{Exit}-toiminnolla käyttäjä pääsee pois ohjelmasta.
\end{itemize} 
 
Edit-valikosta löytyvät seuraavat toiminnot                                     

\begin{itemize} 
\item \emph{Undo}-toiminnolla käyttäjä voi perua edellisen tekstinmuokkaustoimintonsa.
\item \emph{Redo}-toiminnolla käyttäjä voi perua edellisen Undo-operaation.
\item \emph{Cut}-toiminnolla käyttäjä voi leikata valitun tekstialueen.
\item \emph{Copy}-toiminnolla käyttäjä voi kopioida valitun tekstialueen.
\item \emph{Paste}-toiminnolla valittu tekstialue voidaan joko siirtää tai kopioida.
\end{itemize}

Options-valikosta löytyvät seuraavat toiminnot                                     

\begin{itemize} 
\item \emph{Article Options}-toiminnolla käyttäjä pääsee muokkaamaan ja tarkastelemaan artikkeliin liittyviä tietoja.
\end{itemize}

About-valikosta löytyvät seuraavat toiminnot                                     

\begin{itemize} 
\item \emph{About JouTo}-toiminnolla käyttäjä pystyy tarkastelemaan ohjelman tietoja.
\end{itemize}

%\begin{figure}[!h]
%\begin{center} 
%\epsffile{menu1.eps} 
%\end{center} 
%\caption{Editorin valikot}\label{Valikot_kuva}
%\end{figure}

Kuvassa \ref{Valikot_kuva} nähdään ohjelman valikot Java-elementeillä toteutettuina.

\subsubsection{Metatieto-osio}\label{Metatieto}

Metatiedot tarkoittavat varsinaisesta artikkelista suoraan riippumatonta tietoa. Artikkeliin liittyvää metatietoa voi syöttää tähän osioon. Syötettäviä asioita ovat kirjoittaja, kirjoitusajankohta sekä uutiset tyyppi.

%\begin{figure}[!h]
%\begin{center} 
%\epsffile{menu1.eps} 
%\end{center} 
%\caption{Metatieto-osio}\label{Metatieto-kuva}
%\end{figure}

Kuvassa \ref{Metatieto-kuva} nähdään metatieto-osion ulkoasu Java Swing\--komponenteilla toteutettuna.

\subsubsection{Artikkelin tiedot-osio}\label{Artikkelin tiedot}

Artikkelin tiedot tarkoittavat valittuun artikkelityyppiin liittyviä tiedoja, jotka artikkelin kirjoittajan on ehdottomasti täytettävä ennenkuin artikkeli voidana hyväksyä.

%\begin{figure}[!h]
%\begin{center} 
%\epsffile{menu1.eps} 
%\end{center} 
%\caption{Artikkelin tiedot}\label{Artikkelin tiedot-kuva}
%\end{figure}


Kuvassa \ref{Artikkelin tiedot-kuva} nähdään Artikkelin tiedot-osion toteutus Java Swing-komponenteilla. Ulkoasu kuitenkin riippuu valitusta artikkelityypistä.

\subsubsection{Varsinainen artikkeli}\label{Varsinainen artikkeli}

Varsinainen artikkeli-osio sisältää varsinaisen artikkelin ja siihen liittyvät muotoilutiedot.

%\begin{figure}[!h]
%\begin{center} 
%\epsffile{menu1.eps} 
%\end{center} 
%\caption{Varsinainen artikkeli}\label{Varsinainen artikkeli-kuva}
%\end{figure}

Kuvassa \ref{Varsinainen artikkeli-kuva} nähdään esimerkki osion toteutuksesta.

\subsection{Käyttöliittymän dialogit (ET)}\label{Käyttöliittymän dialogit}

Ohjelmistossa dialogeja käytetään ottamaan vastaan käyttäjän syötteitä sekä  näyttämään käyttäjälle ohjelman vaihtoehtoja.

Valikot

Käyttöliittymän dialogeja ovat New, Open, Save ja Save As New -toiminnot. Käyttöliittymässä näytetään myös työn eteneminen käyttäjälle. Tällöin käyttäjälle annetaan palautetta siitä, että järjestelmä suorittaa pyydettyä toimenpidettä.
 
\subsubsection{New-dialogi}\label{New-dialogi}
 
Käyttöliittymään tuodaan Servletiltä listaus DTD:istä, joista listan ensimmäinen on se tyypillisin DTD. Tyypillisin DTD on myös valittu, jolloin käyttäjän ei tarvitse muuta kuin jatkaa suoraan eteenpäin mikäli käyttäjä ei halua valita jotakin muuta DTD:tä. Valitulta DTD:ltä saadaan sen id, jonka perusteella haetaan Servletiltä DTD:n mukainen artikkelipohja. Käyttöliittymässä on OK -ja Cancel -painikkeet. 

%\begin{figure}[!h]
%\begin{center} 
%\epsffile{menu1.eps} 
%\end{center} 
%\caption{New-dialogi}\label{New-kuva}
%\end{figure}
 
Kuvassa \ref{New-kuva} nähdään Java Swing-komponenteilla toteutettu dialogi.
 
\subsection{Open-dialogi}\label{Open-dialogi}

Käyttöliittymään tuodaan Serletiltä listaus artikkeleista laskevassa järjestyksessä kirjoituspäivämäärän mukaan, joista viimeisin artikkeli on valittuna. Liittymässä näytetään vain kymmenen ensimmäistä artikkelia. lisää artikkeleita saa vierittämällä palkista. Artikkelista liittymässä näytettävät tiedot ovat: pääotsikko, kuvaus, kirjoittaja ja kirjoituspäivämäärä. Pääotsikon kentän pituus on 25 merkkiä ja kuvauksen 50 merkkiä. Mikäli merkkijonot ovat pitempiä kuin mitä liittymässä on mahdollista näyttää, näytetään käyttäjälle merkkijonon jatkuminen kolmella pisteellä. Valitulta artikkelista saadaan sen id, jonka perusteella saadaan Servletiltä artikkelin DTD:n id. Käyttöliittymään haetaan ensin DTD:n mukainen artikkelipohja ja sen jälkeen täydennetään pohjaan artikkelin tiedot. Käyttöliittymässä on OK -ja Cancel -painikkeet. 

%\begin{figure}[!h]
%\begin{center} 
%\epsffile{menu1.eps} 
%\end{center} 
%\caption{Open-dialogi}\label{Open-kuva}
%\end{figure}

Kuvassa \ref{Open-kuva} nähdään Java Swing-komponenteilla toteutettu dialogi.

\subsubsection{Save-dialogi}\label{Save-dialogi} 
 
Tallennetaan käyttäjän kirjoittama artikkeli sellaisenaan vanhan artikkelin päälle. Tallenuksen eteneminen näytetään käyttöliittymässä joko palkkirivistönä tai jollakin liikkuvalla kuvalla. Käyttäjälle annetaan palautetta siitä, että järjestelmä suorittaa pyydettyä toimenpidettä. Tätä palautetta käyttöliittymässä näytetään myös new ja open -toimintojen yhteydessä. 

%\begin{figure}[!h]
%\begin{center} 
%\epsffile{menu1.eps} 
%\end{center} 
%\caption{Save-dialogi}\label{Save-kuva}
%\end{figure}
 
Kuvassa \ref{Save-kuva} nähdään Java Swing-komponenteilla toteutettu dialogi.
 
\subsubsection{Save As New-dialogi}\label{Save As New-dialogi}
 
Käyttöliittymässä näytetään artikkelin nimi ja kuvaus. Artikkelin nemä käytetään pääotsikkoa. Mikäli käyttäjä on kirjoittanut artikkelille kuvauksen, tuodaan se liittymään esille, käyttäjä voi tarvittaessa muuttaa kuvausta. Artikkelin kuvaus ei ole pakollinen. Tallennus-toiminnon yhteydessä artikkelille muodostetaan sen id. Käyttöliittymässä on OK -ja Cancel -painikkeet. 

%\begin{figure}[!h]
%\begin{center} 
%\epsffile{menu1.eps} 
%\end{center} 
%\caption{Save As New-dialogi}\label{Save As New-kuva}
%\end{figure}

Kuvassa \ref{Save As New-kuva} nähdään Java Swing-komponenteilla toteutettu dialogi

\subsection{Käyttöliittymän virheilmoitukset (ET)}\label{Käyttöliittymän virheilmoitukset} 
 
Järjestelmä voi antaa käyttäjälle kolmea eri tyyppiä olevia virheilmoituksia joko antaa ei toimenpiteitä vaativan ilmoituksen, kertoa tilarivillä tilanteen tai kertoa toimenpiteen epäonnistumisesta ja vaatia käyttäjältä hyväksymisen. Tässä kappaleessa esitellään virheilmoituksen yleinen rakenne, metodien kuvauksissa kerrotaan kyseisen metodin virheilmoitukset ja niiden tyyppi.

\subsubsection{Ei toimenpiteitä-virheilmoitus}\label{Ei toimenpiteitä-virheilmoitus}  
 
Jos pyydettyä toimenpidettä, esimerkiksi tekstin siirtäminen, kopioiminen tai liittäminen, ei voida suorittää, ilmoitetaan virheestä käyttäjälle esiin pomppaavassa ikkunassa. Tällöin pyydetty toimenpide jätetään kokonaan suorittaamatta, toisin sanoen liittymässä ei tapahdu mitään muutoksia. Esiin pompannut ikkuna pysyy näytössä kolme sekunttia. Mikäli käyttäjä haluaa sulkea virheilmoituksen aikaisemmin, käyttäjä voi sulkea sen oikeassa ylälaidassa olevasta ruksista.

%\begin{figure}[!h]
%\begin{center} 
%\epsffile{menu1.eps} 
%\end{center} 
%\caption{Ei toimenpiteitä-virheilmoitus}\label{Ei toimenpiteitä-kuva}
%\end{figure}
 
Kuvassa \ref{Ei toimenpiteitä-kuva} nähdään Java Swing-komponenteilla toteutettu dialogi.
 
\subsubsection{Tilarivi}\label{Tilarivi}     
 
Käyttöliittymän alareunassa tilarivillä kerrotaan suorittamatta jätetystä toimenpiteestä. Tilarivi on vaihtoehtoinen tapa esiin pomppaavalle ikkunalle. Virheen vakavuus ratkaisee sen kumpaa tapaa käytetään, kun kerrotaan käyttäjälle suorittamatta jätetystä toimenpiteestä. 

%\begin{figure}[!h]
%\begin{center} 
%\epsffile{menu1.eps} 
%\end{center} 
%\caption{Tilarivi}\label{Tilarivi-kuva}
%\end{figure}

Kuvassa \ref{Tilarivi-kuva} nähdään Java Swing-komponenteilla toteutettu komponentti.

\subsubsection{Toimenpiteitä vaativa virheilmoitus}\label{Toimenpiteitä vaativa virheilmoitus}
 
Jos pyydetyn toimenpiteen seurauksena joko tietoja tuhoutuisi tai toimenpidettä ei voida suorittaa, käyttäjälle kerrotaan virheestä esiin pomppaavassa ikkunassa ja käyttäjältä vaaditaan hyväksyntä suorittamatta jätetystä toimenpiteestä. Tällainen toimenpide voisi esimerkiksi olla tallennuksen epäonnistuminen. Käyttöliittymässä ja järjestelmässä palataan pyydettyä toimenpidettä edeltävään tilaan. Käyttöliittymässä on vain OK -painike.

%\begin{figure}[!h]
%\begin{center} 
%\epsffile{menu1.eps} 
%\end{center} 
%\caption{Toimenpiteitä vaativa virheilmoitus}\label{Toimenpiteitä vaativa ilmoitus-kuva}
%\end{figure}

Kuvassa \ref{Toimenpiteitä vaativa ilmoitus-kuva} nähdään Java Swing-komponenteilla toteutettu esimerkki.

\subsection{Rajapinnat}\label{Rajapinnat}

Tässä luvussa kuvataan käyttöliittymän ohjelmisto-rajapinnat ulospäin sekä luokan tarjoamat rajapinnat muille luokille. Kappaleen tarkoituksena on antaa lukijalle kuva käyttöliittymän tarvitsemista resursseista ja sen tarjoamista operaatioista. 

\subsubsection{Sisäiset rajapinnat}\label{Sisäiset rajapinnat}

Tässä luvussa kuvaillaan järjestelmän sisäiset rajapinnat ja niiden käyttö järjestelmän toiminnassa.

\subsubsection{Rajapinnat ulospäin}\label{Rajapinnat ulospäin} 

Tässä luvussa kerrotaan luokan tarjoamat ulkoiset rajapinnat ja niiden käyttötarkoitus.

%%%%%%%%% VIRHEKÄSITTELY %%%%%%%%%

\section{Virhekäsittely}

\end{document}
