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:
os DB por:MENU :: NAME: STR POS: STR COLOR: STR SEL : STR OPCS: Option-list; Option :: GI: EvId NAME: STR;
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.