\chapter{Behavior} \label{chapter_behavior} \section{Inleiding} Wat gebeurt er als een bepaalde conditie waar is? Met andere woorden, wat gebeurt er als de gebruiker op een knop klikt? De bedoeling is het bereiken van een interface die interageert met de gebruiker. Wanneer er een behavior (of gedrag) in het document is gespecifieerd, kan de UI interactief worden. Er kan duidelijk omschreven worden wanneer er iets moet gebeuren. Als de gebruiker op een knop klikt, dan moet een server starten bijvoorbeeld. Dit is echter niet goed genoeg. Stel, je hebt een programma waarbij de gebruiker een aantal velden kan invullen en dat het formulier enkel mag verwerkt worden wanneer alle velden ingevuld zijn. Hiervoor zijn een soort van condities nodig om te testen of alle velden wel degelijk zijn ingevuld. \section{Opbouw} \label{opbouw} Om gedrag te specifi\"eren moet je jezelf eerst twee vragen stellen: \begin{enumerate} \item Wat moet er gebeuren? \item Wanneer moet dit gebeuren? \end{enumerate} \begin{figure}[h] \center \includegraphics[scale=2]{images/behavior.png} \caption{Behavior} \label{condition_action} \end{figure} De oplossingen op deze vragen zorgen ervoor dat je komt tot een regel. Deze regel omvat dus een conditie en een actie (zie figuur \ref{condition_action}). In element van UIML wordt dit vertaald naar een \texttt{$<$rule$>$} element die een \texttt{$<$condition$>$} element en een bijhorend \texttt{$<$action$>$} element bevat. De actie wordt enkel uitgevoerd wanneer deze conditie naar \textit{waar} evauleert. Meer informatie over het evalueren van condities is te vinden in sectie \ref{eval_conditions}. \section{Condities} \label{conditions} Iedere conditie maakt deel uit van een \texttt{$<$rule$>$} element, hierin bevindt zich het $<$condition$>$ element. In dit element kunnen, zoals de naam het al aangeeft, condities worden geschreven. In de volgende lijst staan de elementen die toegelaten zijn: \begin{description} \item[equal] Dit is een booleaanse expressie die evalueert naar \textit{true} of \textit{false}. Het kan maximum twee kinderen hebben en wordt gebruikt om te kijken of de twee kinderen tot hetzelfde resultaat of dezelfde waarde komen. \item[event] Dit event kan op twee verschillende manieren gebruikt worden. Ten eerste als test binnen $<$condition$>$, de bijhorende actie wordt dan uitgevoerd wanneer dit event plaatsvindt. Ten tweede in het $<$action$>$ element, het event wordt dan getriggerd wanneer aan de bijhorende conditie voldaan werd. \item[op] Het $<$op$>$ element zorgt ervoor dat er meer complexere structuren gemaakt kunnen worden. Verdere uitleg wordt gegeven in de volgende sectie. \end{description} \section{Op} \label{op} Voorlopig hebben we enkel besproken dat je onder het $<$condition$>$ element slechts \'e\'en conditie kon zetten die naar \textit{true} moest evalueren, het meest gebruikte was dan een $<$event$>$ element. In de vorige sectie (zie sectie \ref{conditions}) zagen we dat je met $<$equal$>$ al een iets complexere structuur kan maken. Het nadeel van dit element is dat het maximaal twee elementen mag bevatten. Een $<$op$>$ element heeft deze beperking niet. Je kan zoveel elementen als je wilt hieronder plaatsen. Bovendien bestaat de mogelijkheid om $<$op$>$ elementen willekeurig diep te nesten (zie figuur \ref{op_nesting}). Hierdoor kan je een complexe situatie opvangen met slechts \'e\'en conditie. Het enige dat verplicht is, is het aangeven welke operatie je wilt toepassen door middel van het attribuut \textit{`name'}. Er is keuze uit 6 verschillende operaties en deze zijn te vinden in tabel \ref{semantics}. \begin{figure}[h] \center \includegraphics[scale=.75]{images/op_nesting.jpg} \caption{Willekeurig diep nesten} \label{op_nesting} \end{figure} \begin{table} \begin{tabular}{l|l|l} \textbf{Naam} & \textbf{Operatie} & \textbf{Defintie} \\ \hline equal & == & A == B Geeft \textit{true} als A gelijk is aan B \\ notequal & != & A != B Geeft \textit{true} terug als A NIET gelijk is aan B \\ and & \&\& & A \&\& B Geeft \textit{true} terug als en slechts als zowel A als B \textit{true} zijn \\ or & $\mid\mid$ & A $\mid\mid$ B Geeft \textit{true} als ofwel A ofwel B \textit{true} is \\ lessthan & $<$ & A $<$ B Geeft \textit{true} terug als A kleiner is dan B \\ greaterthan & $>$ & A $>$ B Geeft \textit{true} terug als A groter is dan B \end{tabular} \caption{\label{semantics} Operaties van $<$op$>$\cite{specs}} \end{table} \section{Evaluatie van condities} \label{eval_conditions} Condities worden ge\"evalueerd volgens een string waarde. Als je bijvoorbeeld een \textit{equal} operatie hebt, dan worden deze string waarden vergeleken om te kijken of ze exact hetzelfde zijn. Het voorbeeld in listing \ref{condition_op} geeft een operatie weer, waarbij twee waarden met elkaar worden vergeleken. \lstset{basicstyle=\footnotesize, frameround=fttt, numbers=left, numberstyle=\tiny, language=XML} \begin{lstlisting}[float, frame=bt, caption=Equal \&\& Op, label=condition_op] \end{lstlisting} Als er een event ge\"evalueerd moet worden, dan wordt niet de string waarde genomen, maar wordt er een \textit{true} of \textit{false} waarde genomen naargelang dit event was opgevangen of niet. In listing \ref{condition_op2} wordt het vorige voorbeeld uitgebreid. De actie behorende bij deze conditie wordt slechts uitgevoerd wanneer er ook nog eens op een knop wordt geklikt. Hier wordt ineens gebruikt gemaakt van de eigenschap dat $<$op$>$ elementen genest kunnen worden. Deze elementen resulteren ook in \textit{true} of \textit{false}. Bij het berekenen wordt deze boolean dan ook gebruikt om te kijken of de conditie in zijn geheel naar \textit{true} of \textit{false} evalueert. \lstset{basicstyle=\footnotesize, frameround=fttt, numbers=left, numberstyle=\tiny, language=XML} \begin{lstlisting}[float, frame=bt, caption=Geneste $<$op$>$, label=condition_op2] \end{lstlisting} % \section{DTD} % % Een DTD is te vinden in listing \ref{dtd} % % \lstset{basicstyle=\footnotesize, frameround=fttt, numbers=left, numberstyle=\tiny, language=XML} % \begin{lstlisting}[float, frame=bt, caption=DTD, label=dtd] % % % % % % % % % % % % % % % \end{lstlisting}