\chapter{Designovervejelser}
\begin{intro}
Følgende afsnit beskriver overordnet opbygningen og ideerne bag opbygningen af editoren. Desuden gennemgås brugergrænsefladen for editoren.
\end{intro}

%fil format (to slags, serialize og xml til c++)
%data repræsentation (model pakken)
%canvas etc opbygning (ui pakken)
%overordnet uml diagram
%patterns   
%MVC
%abstraktion

%centrale algo og patterns
%alternativer
%ui overvejelser


\section{Generelle design ideer}

I designet af en større grafisk applikation i et objekt orienteret sprog som Java, er det nærliggende at benytte sig af Model/View/Controller (MVC) mønstret \cite{patterns},\cite{swing}. Dette passer godt ind i Java Swing da det jo netop er bygget op omkring MVC mønstret.  

Programmet består derfor af tre dele. En model, et view og en controller-del. Model-delen består af selve banerepræsentationen dvs. polygoner, punkter og kanter. Controller-delen består af dele, der manipulerer modellen, dvs. klasser der kan flytte og danne polygoner, kanter og punkter. Endelig består view delen af klasser, der kan tegne modellen og håndtere brugerens interaktion med programmet gennem controller delen.

Udover at være bygget over MVC mønstret, der i forvejen fordrer nem udvidelse af programmet, er der i designet lagt vægt på at gøre programmet nemt at udvide med f.eks. mere avancerede polygonmanipulationer. Det kunne f.eks. være rotation af polygoner, teksturer på polygoner eller sågar visuel feedback på operationer. 

\section{Brugergrænseflade}
\label{sec:ui}

I designet af brugergrænsefladen er der \emph{ikke} benyttet metoder til at sikre at applikation tilbyder de faciliteter, der kræves på nemmest og mest overskuelig vis. Der er derfor heller ikke udført undersøgelser af om brugergrænsefladen opfylder en brugers behov. 

Programmet er bygget op omkring et Multiple Document Interface (MDI). Hvorvidt et MDI er godt eller dårligt diskuteres jævnligt. Men da det er den eneste måde at behandle flere dokumenter i et Java-program på en nem og overskuelig måde, blev denne metode valgt. Java's implementation af MDI er dog ikke helt uproblematisk på platforme, hvor MDI ikke eksisterer f.eks. Mac OS X. Men dette er for langt fra projektets egentlige fokus til at der er blevet overevejet alternative måder at løse problemet på.

\begin{figure}[h]
\begin{center}
    \begin{minipage}[t]{\textwidth}
        \begin{center}
        \includegraphics[width=0.9\textwidth]{gfx/editormockup2.png}
            \caption{Mockup af editor}
            \label{fig:mockup}
        \end{center}
    \end{minipage}
\end{center}
\end{figure}

Programmet indeholder to paletter. Én til at skifte mellem to mulige funktionalitets tilstande. At lave polygoner vha af punkter og at vælge polygoner, kanter og punkter samt at flytte disse. En anden palette indeholder en tabel over alle de mulige egenskaber for det valgte polygon, kant eller for hele banen.

Alle baner åbnes i et nyt vindue der kan lukkes, maksimeres og minimeres. Titlen på vinduet er identisk med banens titel.

Programmets værktøjsbjælke indeholder knapper til at lave en ny bane, hente en bane, gemme en gane og eksportere en bane til formatet, der bruges i selve spillet. Det samme gælder menubjælken.


\section{Overordnet design}

Det er forsøgt at overføre kravene fra kravspecifikationen og brugergrænsefladens begrænsinger til et design efter MVC mønstret. Det er dog ikke alle steder at opdelingen er lykkedes lige godt, eller at opdelingen har været hensigtsmæssig. MVC mønstret er ikke svaret på alle bønner, og det kan i visse situationer forvirre mere end det gavner, særligt i simple programmer som editoren må antages at være. En inddeling af områderne efter MVC kan ses i figur \ref{fig:editormvc} på side \pageref{fig:editormvc}

\subsection{Model}

Banen, polygoner, kanter og punkter kan umiddelbart anskues som klasser. Deres ansvar er at indeholde data om objekters placering i banen og deres egenskaber samt banens egenskaber. Da der er en del fælles funktioner på objekterne vil det være naturligt at lade dem alle arve fra en fælles superklasse. Dette gør det muligt at behandle klasserne via en fælles grænseflade. Den fælles grænseflade indholder metoder til at sætte egenskaber, hente egenskaber og flytte samt vælge objekter.

\subsection{View og Controller}

Hver bane skal tegnes i et vindue, der er en del af selve applikations vinduet. Der er derfor brug for en del der kan tegne banen samt modtage input fra brugeren til at manipulere banen. Denne skal kunne eksistere i flere instanser i selve applikationen. 

For at opnå en bedre fordeling af ansvaret deles dette i to hovedgrupper. Selve view delen, der sørger for at tegne banen og en input og manipulations del kaldet controller. Input-delen sørger for at delegere input til manipulationsdelen. Manipulations-delen sørger for at kalde metoder på banens objekter for at manipulere objekterne.

\begin{figure}[h]
\begin{center}
    \begin{minipage}[t]{\textwidth}
        \begin{center}
    \scalebox{0.4}{\includegraphics{gfx/mvceditor.pdf}}
            \caption{Klasserne indelt i MVC}
            \label{fig:editormvc}
        \end{center}
    \end{minipage}
\end{center}
\end{figure}

Selve brugergrænsefladen består af hovedklassen \texttt{BlasterEditor} der indeholder hvert vindue, hvor banen konstrueres. Hver vindue repræsenteres af \texttt{MapFrame}. BlasterEditor indeholder desuden de to paletter \texttt{FloatingToolBar} og \texttt{PropertyFloat}, der begge er implementeret som singletons, da de skal kunne bruges fra flere forskellige klasser, og for begges vedkommende kun bør findes en instans.

Manipulationer håndteres af \texttt{AbstractMode} og klasser der arver fra denne henholdsvis \texttt{MoveMode} og \texttt{PolygonMode}. Disse modtager input BlasterEditor der lytter på selve events fra brugeren og sørger for at udføre manipulationen af banen. 

Den sidste del er eksport og lagring af banefiler. Dette hører til i controller-delen og henter blot informationer fra et baneobjekt for at skrive relevante informationer til filsystemet.

En oversigt over klasserne og deres sammenhæng kan ses på figur \ref{fig:editoroverblik}. 

\begin{figure}[h]
\begin{center}
    \begin{minipage}[t]{\textwidth}
        \begin{center}
    \scalebox{0.6}{\includegraphics{gfx/editoroverblik.pdf}}
            \caption{Klasserne i editoren og deres sammenhæng}
            \label{fig:editoroverblik}
        \end{center}
    \end{minipage}
\end{center}
\end{figure}

