O Modelo da Apresentação pode ser dividido num módulo genérico (ModApr) de processamento de eventos - cuja principal responsabilidade é implementar as comunicações com o Controlador de Diálogo - e um frontend que implementará o aspecto gráfico da interface e a tradução dos diferentes eventos de e para o utilizador, tanto em Modo Menu como em Modo Comando.
É em ModApr que é colocada a informação resultante da compilação dos Descritores de Apresentação, ele conterá ainda informação relativa aos canais para comunicação com o Controlador de Diálogo e o Modelo da Apresentação.
A Descritores do tipo MENU são modelados pelos tuplos:
MENU :: NAME: STR
POS: STR
COLOR: STR
SEL : STR
OPCS: Option-list;
Option :: GI: EvId
NAME: STR;
os DB por:
DB :: NAME: STR
POS: STR
COLOR: STR
VARS: VarId -> ViewType
GIS: EvId -> DBGIView
CMDS: CmdId -> LxDef;
Na descrição gráfica das variáveis, se elas forem de um dos tipos pré-definidos, poder-se-á utilizar um dos métodos de visualização também pré-definidos:
Todos eles partilham um conjunto de definições léxicas descritas no tipo LexDef. Actualmente, estão contempladas a posição, o nome, e a cor. Mais características podem ser introduzidas sem perturbar o funcionamento de frontends já existentes uma vez que cada um utiliza apenas aquelas que consegue implementar ou de que tem conhecimento.
ViewType = PreDefView | GISym;
PreDefView = HimSelf | RadioBox | OptionMenu | Scale;
HimSelf :: DEF: LxDef;
RadioBox :: VALS: STR -> Value
DEF: LxDef;
OptionMenu :: VALS: STR -> Value
DEF: LxDef;
Scale :: MIN: Value
MAX: Value
DEF: LxDef;
DBGIView :: DEF: LxDef
OPEN: Bool;
LxDef :: POS: STR
NAME: STR
COLOR: STR;
Caso se trate de uma variável cujo tipo é definido utilizando modelos, é feita a indicação do Guião de Interacção responsável pelo seu controlo. Nesta situação é criada uma instância desse Guião e o diálogo referente à variável é desviado para ela. O valor da variável é enviado à instância referida através da mensagem SetValMsg e a instância é activada; quando termina, o valor devolvido por ela é enviado de novo para o Controlador de Diálogo, à instância onde a variável está declarada, como valor lido para a variável em causa.
A definição léxica dos GI's contém, para além das definições léxicas normais, o valor booleano que indica se a descrição léxica do Guião deve ser apresentada automaticamente ou não
.
Os comandos são descritos utilizando simplesmente LexDef.
Podemos então definir ModApr:
ModApr :: GLOBAL: GISym -> GlobalInfo
VIEWS: ViewId -> ViewDescr
DEFAULT: ViewId
MAIN: GISym
INST: CHAN
INSM: CHAN
OUTST: CHAN
OUTSM: CHAN;
GlobalInfo = VarId -> TypeId;
ViewDescr = GISym -> GIView;
GIView = MENU | DB;
Como é evidente, as definições léxicas descritas são relevantes apenas quando o frontend está a funcionar em Modo Menu, uma vez que o Modo Comando terá uma sintaxe fixa
.
Pelo mesmo motivo, em Modo Comando não é necessário recorrer aos Guiões de síntese de modelos.
Para estudar a implementação de um frontend procedeu-se ao desenvolvimento de um para XMetoo.
Dada a quase inexistência de facilidades de input/output da linguagem
, o resultado obtido não prima pela "user frendliness", no entanto possui todas as características necessárias a um frontend mais poderoso (em X11 por exemplo).
A principal tarefa que lhe compete é, por um lado, apresentar ao utilizador a implementação da descrição gráfica dos diferentes elementos da interface, por outro, gerir o input/output de valores. Para tal, é mantida uma tabela das instâncias actualmente criadas onde se regista, para além da hierarquia em que elas estão organizadas (selectores FATHER e CHILDREN), os valores das suas variáveis e qual a variável a que o resultado da sua conclusão deve ser atribuído se ele existir (VALUES e VAR) e ainda uma máscara onde estão definidos os eventos válidos (EVMASK) e a indicação se a instância já foi activada (ACTIVE).
InstInfo :: FATHER: OpcInstId
EVMASK: EvMask
VAR: OpcVarId /* Vari'avel do Pai */
VALUES: VarId -> OpcValue
CHILDREN: EvId -> InstId
ACTIVE: Bool;
Quando em Modo Menu, em cada instante o utilizador deve escolher de entre todas as instâncias activas qual a que pretende utilizar (corresponderá à colocação do rato sobre uma janela). De seguida, e dentro dessa instância, pode interactuar com todos os seus elementos que geram eventos válidos nesse contexto.
Em Modo Comando é utilizada uma sintaxe semelhante à do XMetoo. Os Guiões e os argumentos são vistos como funções, os comandos não são utilizados sendo as frases confirmadas com Return. A invocação do Guião GInsPal é feita do seguinte modo (neste caso está a utilizar-se o sinónimo do Guião):
cmd> (inspal (pal "Ola") (sig "Hello"))
Caso seja detectado um erro na frase (quer sintático quer semântico) o Modelo da Apresentação muda automaticamente para Modo Menu, preservando o estado em que o erro ocorreu. Assim, se no exemplo anterior em vez de sig tivesse sido escrito sgi - ou se em vez de uma string tivesse sido escrito um inteiro - a interface passava para Modo Menu apresentando a Dialog Box de GInsPal, tendo o argumento pal o valor "Ola".
Figure 25: Composição do Modelo da Apresentação
Na fig. 25 são apresentados os ficheiros que compõem o Modelo da Apresentação. Os ficheiros io.n e leituras.n implementam o input/output, neste caso os métodos pré-definidos são considerados apenas para leitura (a apresentação do valor é sempre feita directamente) à excepção dos métodos HimSelf e Scale que são traduzidos para leituras simples (embora no caso do segundo os limites sejam verificados), todos os outros são implementados como menus. O ficheiro fexm.n é o corpo principal do front-end e modapr.n o do ModApr, maprcom.n implementa as comunicações.