Glade Com Lazarus
Glade Com Lazarus
Glade Com Lazarus
BIBLIOTECA GTK+
JOSIMAR ZIMERMANN
BLUMENAU
2011
2011/2-12
JOSIMAR ZIMERMANN
BIBLIOTECA GTK+
BLUMENAU
2011
2011/2-12
FERRAMENTA PARA CONVERSÃO DE INTERFACES
BIBLIOTECA GTK+
Por
JOSIMAR ZIMERMANN
______________________________________________________
Presidente: Profª. Joyce Martins, Mestre – Orientadora, FURB
______________________________________________________
Membro: Prof. Aurélio Faustino Hope, Mestre – FURB
______________________________________________________
Membro: Prof. José Roque Voltolini da Silva – FURB
The current work describes the specification and implementation of a tool for conversion of
graphical users interfaces built in Delphi to a readable format for the GTK+ library. Uses
lexical, syntactic and semantic analyzers for interpretation the input of the tool. The content
readed from the input file is loaded into memory and converted to XML format readable for
the Libglade, wich defines user interface for the GTK+.
Figura 1 - Exemplo de software reprodutor de mídia com interface gráfica do usuário .......... 16
Figura 2 - Uma interface gráfica simples produzida no ambiente Delphi ................................ 18
Quadro 1 - Conteúdo do arquivo .dfm correspondente à interface apresentada ...................... 18
Quadro 2 - Arquivo gerado pelo Glade com as definições da interface gráfica ....................... 23
Figura 3 - Interface gráfica simples para GTK+ produzida pelas definições apresentadas no
Quadro 2 ................................................................................................................ 24
Quadro 3 - Características dos trabalhos correlatos ................................................................. 27
Quadro 4 - Requisitos funcionais ............................................................................................. 30
Quadro 5 - Requisitos não funcionais ...................................................................................... 30
Quadro 6 - Equivalência dos componentes de tradução simples.............................................. 31
Quadro 7 - Equivalência dos componentes de tradução condicionada às propriedades .......... 32
Quadro 8 - Especificação de uma interface gráfica GTK+ ...................................................... 34
Figura 4 - Interface gráfica gerada como resultado das especificações do Quadro 8 .............. 35
Figura 5 - Diagrama de classes dos analisadores léxico, sintático e semântico ....................... 36
Figura 6 - Diagrama de casos de uso ........................................................................................ 37
Quadro 9 - Caso de uso UC01 .................................................................................................. 38
Quadro 10 - Caso de uso UC02 ................................................................................................ 39
Quadro 11 - Caso de uso UC03 ................................................................................................ 39
Quadro 12 - Caso de uso UC04 ................................................................................................ 40
Quadro 13 - Caso de uso UC05 ................................................................................................ 40
Figura 7 - Diagrama de pacotes ................................................................................................ 41
Figura 8 - Diagrama de classes do pacote VCL Abstract ....................................................... 42
Quadro 14 - Classes para interpretação de valores de propriedades ........................................ 43
Quadro 15 - Elementos declarados na enumeração TVCLValueKind ....................................... 43
Figura 9 - Diagrama de classes do pacote Glade ..................................................................... 44
Quadro 16 - Classes que implementam a interface IPropertyValue ..................................... 45
Figura 10 - Diagrama de classes do pacote Component Mapping ............................................ 46
Figura 11 - Diagrama de classes do pacote Property Translation ...................................... 48
Figura 12 - Diagrama de classes do pacote Event Mapping .................................................... 49
Figura 13 - Diagrama de classes do pacote Glade Transform ................................................ 50
Quadro 17 - Classes transformadoras e seus respectivos transformados ................................. 51
Figura 14 - Diagrama de classes do pacote Project ............................................................... 52
Quadro 18 - Definição de mapeamento de um componente de tradução simples .................... 53
Quadro 19 - Mapeamento de um componente de tradução condicionada à propriedade ......... 54
Quadro 20 - Valores válidos para o atributo type da tag property ........................................ 54
Quadro 21 - Exemplo de mapeamento da categoria especial ................................................... 55
Quadro 22 - Exemplo de mapeamento que contém atributos requeridos ................................. 55
Quadro 23 - Exemplo de mapeamento de propriedades ........................................................... 56
Quadro 24 - Exemplo de mapeamento de eventos de um componente .................................... 57
Quadro 25 - Trecho do código do método NextToken da classe TLexicon ............................ 59
Figura 15 - Erro disparado em decorrência de falha na chamada recursiva a NextToken ....... 59
Quadro 26 - Código do método Load da classe TComponentMapLoader ................................. 63
Quadro 27 - Código fonte do método Translate da classe TDFMTranslator ........................ 64
Quadro 28 - Conteúdo do método Translate da classe TComponentTranslator ................. 65
Quadro 29 - Código fonte do método TranslateSimple da classe TComponentTranslator 65
Quadro 30 - Trecho inicial do código do método TranslatePropertied .............................. 66
Quadro 31 - Trecho de código responsável por avaliar as condições para tradução ................ 67
Quadro 32 - Código fonte do método TranslateSpecial da classe TComponentTranslator
............................................................................................................................... 67
Quadro 33 - Código fonte do método TranslateProperties da classe TDFMTranslator.... 69
Quadro 34 - Trecho do código do método PerformTranslate responsável atribuir as
propriedades traduzidas ......................................................................................... 69
Quadro 35 - Código fonte do método TranslateEvents da classe TDFMTranslator............ 70
Quadro 36 - Trecho de código do método PerformTranslation que atribui os sinais
traduzidos............................................................................................................... 71
Quadro 37 - Possibilidades de alinhamento de componentes VCL.......................................... 71
Quadro 38 - Propriedades do componente VCL que condicionam seu posicionamento ......... 71
Quadro 39 - Trecho do método PerformTranslation responsável pela verificação do
alinhamento vertical............................................................................................... 72
Quadro 40 - Código responsável pela verificação dos componentes alinhados horizontalmente
............................................................................................................................... 73
Quadro 41 - Código do método PerformTranslation que verifica componentes sem
alinhamento............................................................................................................ 74
Quadro 42 - Código que percorre os componentes contidos e realiza sua tradução ................ 74
Quadro 43 - Código fonte do método AsDOMNode da classe TTransformerProperty ........ 76
Figura 16 - Janela principal da ferramenta DelphiToGTK+ .................................................... 76
Figura 17 - Seleção do diretório de localização dos mapas ...................................................... 77
Figura 18 - Seleção do diretório de entrada .............................................................................. 78
Figura 19 - Seleção do diretório de saída ................................................................................. 78
Figura 20 - Botão para executar a tradução .............................................................................. 79
Figura 21 - Interface gráfica - primeiro caso de teste ............................................................... 80
Figura 22 - Interface gráfica traduzida - primeiro caso de teste ............................................... 80
Figura 23 - Interface gráfica - segundo caso de teste ............................................................... 80
Figura 24 - Interface gráfica traduzida - segundo caso de teste ............................................... 80
Figura 25 - Interface gráfica - terceiro caso de teste ................................................................ 81
Figura 26 - Interface gráfica traduzida - terceiro caso de teste ................................................ 82
Figura 27 - Interface gráfica - quarto caso de teste .................................................................. 82
Figura 28 - Interface gráfica traduzida - quarto caso de teste .................................................. 82
Quadro 44 - Quadro comparativo entre as ferramentas ............................................................ 83
Quadro 45 - Sugestões de melhorias e extensões para a ferramenta ........................................ 86
Quadro 46 - Modelo de código para carregamento da interface .............................................. 89
Quadro 47 - Gramática do .dfm ............................................................................................... 90
LISTA DE SIGLAS
RF – Requisito Funcional
1 INTRODUÇÃO .................................................................................................................. 11
1.1 OBJETIVOS DO TRABALHO ........................................................................................ 12
1.2 ESTRUTURA DO TRABALHO ...................................................................................... 12
2 FUNDAMENTAÇÃO TEÓRICA .................................................................................... 14
2.1 DEFINIÇÃO DE PADRÕES E COMPORTAMENTO COM XML ............................... 14
2.2 GERADORES DE INTERFACES GRÁFICAS COM O USUÁRIO .............................. 15
2.3 GUI .................................................................................................................................... 16
2.4 DESENVOLVIMENTO DE INTERFACES GRÁFICAS NO DELPHI ......................... 17
2.5 GTK+................................................................................................................................. 18
2.5.1 GLib ................................................................................................................................. 19
2.5.2 GLib Object System ou GObject ................................................................................. 20
2.5.3 GIMP Drawing Kit (GDK) ............................................................................................... 20
2.5.4 GdkPixbuf ....................................................................................................................... 21
2.5.5 Pango ............................................................................................................................... 21
2.5.6 Accessibility Toolkit (ATK) ..................................................................................... 21
2.6 GLADE.............................................................................................................................. 22
2.7 TRABALHOS CORRELATOS ........................................................................................ 25
2.7.1 DelphiToWeb .................................................................................................................. 25
2.7.2 Extensão da ferramenta Delphi2Java-II para suportar componentes de banco de dados 25
2.7.3 ScriptCase ....................................................................................................................... 26
2.7.4 Funcionalidades dos trabalhos correlatos........................................................................ 27
3 DESENVOLVIMENTO DA FERRAMENTA ............................................................... 29
3.1 REQUISITOS PRINCIPAIS DO PROBLEMA A SER TRABALHADO ....................... 30
3.2 COMPONENTES CONVERTIDOS ................................................................................ 30
3.2.1 Componentes de tradução simples .................................................................................. 31
3.2.2 Componentes de tradução condicionada ......................................................................... 32
3.2.3 Componentes de tradução especial ................................................................................. 32
3.3 ESPECIFICAÇÃO DA SAÍDA ........................................................................................ 33
3.4 ANÁLISE DA ENTRADA DA FERRAMENTA ............................................................ 35
3.5 ESPECIFICAÇÃO DA FERRAMENTA ......................................................................... 36
3.5.1 Casos de uso .................................................................................................................... 37
3.5.2 Diagramas de classes....................................................................................................... 41
3.5.2.1 Pacote VCL Abstract ................................................................................................... 42
3.5.2.2 Pacote Glade ................................................................................................................. 44
3.5.2.3 Pacote Component Mapping ......................................................................................... 45
3.5.2.4 Pacote Property Translation ................................................................................... 47
3.5.2.5 Pacote Event Mapping ................................................................................................. 49
3.5.2.6 Pacote Glade Transform .............................................................................................. 50
3.5.2.7 Pacote Project ............................................................................................................. 51
3.5.3 Mapas de tradução........................................................................................................... 52
3.5.3.1 Mapa de componentes .................................................................................................. 53
3.5.3.2 Mapa de propriedades ................................................................................................... 55
3.5.3.3 Mapa de eventos ........................................................................................................... 56
3.6 IMPLEMENTAÇÃO ........................................................................................................ 57
3.6.1 Técnicas e ferramentas utilizadas.................................................................................... 58
3.6.2 Implementação da ferramenta ......................................................................................... 58
3.6.2.1 Customização das classes geradas pelo GALS ............................................................. 58
3.6.2.2 Inicialização dos mapas de tradução ............................................................................. 62
3.6.2.3 Inicialização do tradutor de interfaces .......................................................................... 63
3.6.2.4 Tradução do componente .............................................................................................. 64
3.6.2.5 Tradução das propriedades ........................................................................................... 68
3.6.2.6 Tradução dos eventos ................................................................................................... 69
3.6.2.7 Posicionamento dos elementos gráficos ....................................................................... 71
3.6.2.8 Geração do arquivo .glade ....................................................................................... 75
3.6.3 Operacionalidade da implementação .............................................................................. 76
3.7 RESULTADOS E DISCUSSÃO ...................................................................................... 79
4 CONCLUSÕES .................................................................................................................. 84
4.1 PROBLEMAS E LIMITAÇÕES ...................................................................................... 84
4.2 EXTENSÕES .................................................................................................................... 85
REFERÊNCIAS BIBLIOGRÁFICAS ................................................................................. 87
APÊNDICE A – Modelo de código para carregamento da interface ................................ 89
ANEXO A – Gramática do .dfm ........................................................................................... 90
11
1 INTRODUÇÃO
1
GIMP Toolkit (GTK+).
12
2 FUNDAMENTAÇÃO TEÓRICA
XML é um padrão para documentos de marcação que define uma sintaxe genérica
usada para marcação de dados com tags, de forma simples e legível. É um formato flexível e
pode ser customizado para atender diferentes domínios como sites da web, dados eletrônicos
para integração, vetores gráficos, genealogia, serialização de objetos, chamadas a
procedimentos remotos, sistemas de correio por voz, entre outros (HAROLD; MEANS, 2002,
p. 3).
Uma das vantagens na utilização de documentos XML é a sua portabilidade entre as
diferentes linguagens de programação e sistemas operacionais. Segundo Harold e Means
(2002, p. 3), há uma grande variedade de bibliotecas livres para diferentes linguagens de
programação que são capazes de ler e escrever documentos XML. Existem ferramentas
desenvolvidas exclusivamente para leitura e escrita de documentos XML, enquanto outras são
15
Segundo Herrington (2003, p. 3), geradores de código são programas criados para
escrever outros programas. Geradores de interfaces gráficas são igualmente geradores de
código. Contudo, o resultado não é necessariamente um programa ou aplicação, mas sim uma
interface gráfica para o usuário final do produto, o software.
Um gerador de interface gráfica do usuário recebe sua entrada de um arquivo de
definição de interface gráfica e de uma definição de Application Programming Interface
(API). Alguns programas especialistas na criação de interfaces gráficas utilizam um arquivo
com um formato distinto para construir interfaces gráficas, ao passo que outros utilizam
formatos consagrados como o XML. A adoção desta abordagem no processo de
desenvolvimento de software possibilita a criação de uma camada de abstração entre as regras
de negócio para a interface e sua implementação (HERRINGTON, 2003, p. 100).
Para Herrington (2003, p. 101-102), alguns benefícios chaves na utilização de
geradores de interfaces gráficas são:
a) consistência: geração em massa de formulários criam formulários consistentes e
que apresentam padrões de usabilidade;
b) flexibilidade: usando ferramentas para desenhar interfaces, pode-se rapidamente
efetuar modificações requeridas para esta interface. Modificações nas regras de
segurança podem destacar esta flexibilidade, pois ao modificar e melhorar a API de
segurança da aplicação pode-se alterar os modelos para recriar as interfaces que
estarão em conformidade com as novas regras de segurança;
16
2.3 GUI
2
Framework multi-plataforma para desenvolvimento de aplicativos com interface gráfica (QT, 2010).
3
Ambiente gráfico desktop e plataforma de desenvolvimento para o sistema operacional Linux (KDE, 2010).
4
GNU Network Object Model Environment (GNOME, 2010).
18
seus eventos. A Figura 2 exibe uma interface gráfica simples produzida no Delphi e o Quadro
1 apresenta o arquivo .dfm correspondente à interface.
2.5 GTK+
extensivamente utilizada na confecção de aplicações Linux com GUI, com destaque para os
ambientes de desktop GNOME e Xfce5. Apesar da sua origem no sistema operacional Linux,
a biblioteca tem sido expandida para suportar outros sistemas operacionais, tais como:
Microsoft Windows, BeOS, Solaris, Mac OS X e outros (KRAUSE, 2007, p. 2).
A GTK+ é um sistema baseado em sinais e funções de call-back. Um sinal é uma
notificação para a aplicação na qual o usuário efetuou alguma ação. É possível executar uma
função para responder a este sinal através da GTK+. Estas funções são conhecidas como
funções de call-back (KRAUSE, 2007, p. 27).
Uma aplicação GTK+ é iniciada por uma chamada à função gtk_main(). A partir
deste ponto o programa entra no laço principal e fica em estado de espera até receber um
sinal, como o clique do mouse sobre um botão, por exemplo. Os sinais são emitidos pelo
sistema gerenciador de janelas do sistema operacional, responsável pelo controle dos
componentes gráficos da aplicação, e capturados pela GDK, que por usa vez repassa para a
GTK+. A GTK+ procura uma função de call-back associada ao sinal ou evento e efetua a sua
chamada (LIRA, 2010).
A GTK+ é constituída por bibliotecas, cada uma fornecendo ao desenvolvedor uma
classe de funcionalidades específicas. As seis bibliotecas que a compõem são apresentadas
nos tópicos subsequentes.
2.5.1 GLib
A biblioteca GLib é uma coleção de funções que são usadas em larga escala pela
GTK+. Listas encadeadas, árvores, manipuladores de exceções, gerenciadores de memória e
temporizadores são parte dos recursos oferecidos por esta biblioteca. A GTK+ requer a GLib e
baseia-se nela para a implementação de portabilidade e funcionalidade. A GLib pode ser
usada sem a GTK+ para desenvolvimento de aplicações que não necessitam de interação com
o usuário através de uma interface gráfica (HARLOW, 1999, p. 7).
Um dos principais benefícios oferecidos pela utilização da GLib é que esta biblioteca
provê uma interface multi-plataforma que possibilita o desenvolvimento de aplicativos
portáveis entre os diferentes sistemas operacionais suportados pela GTK+, com pequenas ou
nenhuma alteração no código fonte (KRAUSE, 2007, p. 5).
5
Ambiente gráfico desktop para sistemas baseados em UNIX e similares (XFCE, 2010).
20
2.5.4 GdkPixbuf
2.5.5 Pango
2.6 GLADE
Figura 3 - Interface gráfica simples para GTK+ produzida pelas definições apresentadas no Quadro 2
O processamento das interfaces gráficas desenhadas no Glade realiza-se através da
utilização de uma biblioteca de leitura de definição de interface. A primeira biblioteca
desenvolvida para esta finalidade denomina-se Graphical Interface Description Loader API
(Libglade), distribuída como parte componente da biblioteca GTK+.
A Libglade fornece uma classe denominada GladeXML, usada para criar e manter a
uma interface gráfica do usuário carregada a partir de um arquivo XML. Também é
disponibilizada uma função que permitir associar os sinais dos componentes gráficos
definidos no Glade às funções de call-back codificadas na aplicação (KRAUSE, 2007, p.
372).
Uma vez que a interface gráfica é carregada para a aplicação, a Libglade permite
acessar cada componente gráfico presente na interface através do seu identificador único,
definido durante a criação da interface (KRAUSE, 2007, p. 375). Desta forma, é possível
modificar aspectos inerentes a um componente gráfico em tempo de execução. Por exemplo,
em uma aplicação cujo acesso às funcionalidades é controlado por regras de permissão, pode-
se usar a Libglade para habilitar ou desabilitar os componentes gráficos que fornecem acesso
à funcionalidade em questão.
Os eventos associados aos componentes gráficos da interface podem ser vinculados às
funções de call-back da aplicação através da utilização da função
glade_xml_signal_autoconnect. Esta função procura na aplicação uma função cujo nome é
similar ao nome definido para o manipulador do sinal do componente gráfico (KRAUSE,
2007, p. 375).
25
2.7.1 DelphiToWeb
Silveira (2006, p. 13) diz que a ferramenta Delphi2Java-II é utilizada para migração de
aplicações desenvolvidas em Delphi para a plataforma Java, efetuando a leitura de
formulários Delphi e gerando classes Java, preservando a estrutura originalmente desenhada.
26
2.7.3 ScriptCase
Interbase e Firebird) e criação de aplicações que se interligam com o Delphi e o Visual Basic,
através da instanciação do Component Object Model (COM).
O software é desenvolvido pela empresa brasileira NetMake e atualmente encontra-se
na sua versão 5.2, sendo utilizado por diversos clientes no território nacional (NETMAKE,
2010).
3 DESENVOLVIMENTO DA FERRAMENTA
TCheckBox
Caixa de seleção para marcar ou desmarcar GtkCheckButton
opções.
TRadioButton
Botão do tipo rádio para selecionar apenas uma GtkRadioButton
entre várias opções.
TComboBox Caixa de texto com opções para seleção. GtkComboBox
TImage Componente usado para exibir uma imagem. GtkImage
TScrollBox
Caixa de composição provida de barras de GtkScrolledWindow
rolagem vertical e horizontal.
TStaticText Componente semelhante ao TLabel. GtkLabel
TPageControl
Controle de abas, sendo que cada aba é uma GtkNotebook
composição com seus próprios componentes.
TRichEdit Componente semelhante ao TMemo. GtkTextView
TProgressBar Barra de progresso. GtkProgressBar
TMonthCalendar Calendário que permite selecionar uma data. GtkCalendar
TStatusBar Barra de status. GtkStatusBar
TToolBar
Barra de ferramentas para armazenar um GtkToolBar
conjunto de botões.
TCoolBar
Barra de ferramentas com subdivisões que GtkHandleBox
podem ser movidas ou redimensionadas.
Caixa para entrada de valores numéricos
TSpinEdit inteiros, acompanhado por dois botões que GtkSpinButton
permitem incrementar e decrementar o valor.
TCalendar Calendário que não permite alternar mês ou ano. GtkCalendar
Quadro 6 - Equivalência dos componentes de tradução simples
32
comandos desejado. No escopo do arquivo .glade os sinais são identificados pela etiqueta
signal, sendo o seu nome definido no atributo name. O nome da função call-back
responsável pela manipulação do sinal é informada no atributo handler.
Dentre os componentes gráficos disponíveis na GTK+, há aqueles que são capazes de
armazenar dentro da sua área outros componentes. Os componentes com esta capacidade são
descendentes da classe GtkContainer. Cada elemento contido em um descendente da
GtkContainer estará delimitado pela etiqueta child que poderá conter uma etiqueta
packing, onde define-se o comportamento de redimensionamento do elemento em relação ao
container no qual está contido.
O Quadro 8 apresenta o conteúdo de um arquivo .glade que contém todos os
elementos mencionados nesta seção.
<?xml version="1.0"?>
<glade-interface>
<!-- interface-requires gtk+ 2.16 -->
<!-- interface-naming-policy project-wide -->
<widget class="GtkWindow" id="window1">
<property name="visible">True</property>
<property name="title" translatable="yes">Exemplo</property>
<property name="window_position">center</property>
<signal name="delete_event" handler="window1_delete_event_cb"/>
<child>
<widget class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<widget class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">label</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="entry1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">●</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</widget>
</child>
</widget>
</glade-interface>
Quadro 8 - Especificação de uma interface gráfica GTK+
35
class Gals
2
1
TSemantic
ESemanticError
UC02 – Selecionar o diretório de entrada: permite ao usuário selecionar o diretório onde estão
armazenados os arquivos de extensão .dfm que deseja traduzir.
Requisitos atendidos RF02.
Pré-condições Não possui.
Cenário principal 1) O usuário informa o diretório de localização dos arquivos para tradução.
2) A aplicação verifica se o diretório informado possui arquivos passíveis
de tradução.
Exceção 01 Não há arquivo(s) para tradução:
No passo 2, se nenhum arquivo para tradução for encontrado, o usuário será
notificado e o processo interrompido.
Pós-condições Diretório de entrada definido.
Quadro 10 - Caso de uso UC02
A possibilidade de seleção do diretório de saída dos arquivos traduzidos é
comtemplada pelo caso de uso UC03, cujo cenário detalhado é exibido no quadro 11. Neste
cenário, o ator informa o diretório onde deseja que os arquivos traduzidos sejam armazenados.
Os arquivos processados recebem o mesmo nome do arquivo de entrada correspondente,
diferindo apenas na sua extensão, uma vez que os arquivos de definição de interface gráfica
da biblioteca Libglade são identificados pela extensão .glade.
UC03 – Selecionar o diretório de saída: permite ao usuário informar à aplicação o diretório onde
deseja que os arquivos traduzidos sejam armazenados.
Requisitos atendidos RF03.
Pré-condições Não possui.
Cenário principal 1) O usuário seleciona o diretório de saída dos arquivos traduzidos.
2) A aplicação verifica a existência do diretório selecionado.
Exceção 01 Diretório inexistente:
No passo 2, caso o diretório informado não seja encontrado, o usuário será
notificado e o processo interrompido.
Pós-condições Diretório de saída definido.
Quadro 11 - Caso de uso UC03
Após a execução bem sucedida dos casos de uso UC01, UC02 e UC03, o ator Usuário
estará apto a realizar o caso de uso UC04 (Quadro 12), que consiste no processo de tradução
propriamente dito. Neste cenário, o usuário solicita à ferramenta DelphiToGTK+ a realização
da tradução dos arquivos .dfm encontrados no diretório de entrada, informado no caso de uso
UC02. Para cada arquivo encontrado no diretório, aplicar-se-á técnicas de análise léxica,
sintática e semântica, de forma a interpretar o seu conteúdo, identificando os componentes
gráficos e suas propriedades. O resultado desta interpretação é um conjunto de dados
carregados para a memória em uma estrutura de dados modelada para o domínio do problema.
A tradução efetuar-se-á com auxílio dos mapas carregados no caso de uso UC01. Os arquivos
traduzidos serão armazenados no diretório de saída, informado no caso de uso UC03,
recebendo o mesmo nome do arquivo .dfm de origem, contudo com a extensão .glade.
40
UC04 – Requisitar a tradução dos componentes: usuário aciona o processo de tradução dos arquivos
informados.
Requisitos atendidos RF04, RNF04.
Pré-condições Mapas carregados.
Diretório de entrada definido.
Diretório de saída definido.
Cenário principal 1) O usuário aciona o processo de tradução.
2) A aplicação realiza a análise léxica do arquivo de entrada.
3) A aplicação realiza a análise sintática do arquivo de entrada.
4) A aplicação realizada a análise semântica do arquivo de entrada.
5) O arquivo interpretado e processado é carregado para a memória.
6) A aplicação realiza a tradução dos componentes especificados no
arquivo de entrada.
7) O arquivo traduzido é armazenado no diretório de saída.
Exceção 01 Erro léxico:
No passo 2, o arquivo processado não possui um formato .dfm legível para
tradução, portanto, o processo é interrompido.
Exceção 02 Erro sintático:
No passo 3, o arquivo processado não possui sintaxe válida, portanto, a
tradução é interrompida.
Exceção 03 Erro na tradução do componente:
No passo 6, caso ocorra erro no processo de tradução do componente e/ou
suas propriedades, o processo é interrompido. O erro pode ocorrer por conta
de incompatibilidade entre o tradutor configurado no mapa e o componente.
Pós-condições Interface(s) gráfica(s) traduzida(s).
Quadro 12 - Caso de uso UC04
Depois de realizada a tradução dos arquivos de definição de interface gráfica, o usuário
poderá visualizar o resultado da tradução, conforme especificado pelo cenário do caso de uso
UC05 (Quadro 13). A aplicação utiliza um modelo (Apêndice A) de código escrito na
linguagem Pascal e adapta-o de forma a capacitá-lo a carregar as definições de uma interface
gráfica GTK+ segundo as definições da biblioteca Libglade, para a qual os arquivos .dfm
foram traduzidos. O código é compilado pela ferramenta utilizando a versão 2.4.2 do
compilador Free Pascal, disponibilizado junto a ferramenta DelphiToGTK+, assim como as
bibliotecas runtime da GTK+, referenciadas pelo modelo de código.
UC05 – Visualizar o resultado da tradução: permite ao usuário visualizar o formulário Delphi
traduzido para uma interface gráfica similar na GTK+.
Requisitos atendidos RF05, RNF03, RNF05.
Pré-condições Interface gráfica traduzida.
Cenário principal 1) O usuário solicita a visualização da interface gráfica traduzida.
2) A aplicação adapta um modelo de código Pascal para carregar a
interface gráfica traduzida.
3) A aplicação compila o código Pascal.
4) A aplicação executa o resultado da compilação.
Exceção 01 Erro na compilação:
No passo 3, pode ocorrer erro na compilação do código e o processo é
abortado.
Pós-condições Não possui.
Quadro 13 - Caso de uso UC05
41
Property Translation
Gals
VCL Abstract
Proj ect
Ev ent Mapping
responsabilidades mais relevantes na ferramenta. Apenas o pacote GALS não é abordado por
tratar-se de uma tecnologia já conhecida do público acadêmico e bastante explorada em outros
trabalhos científicos na área da computação.
TVCLIdentifierValue
TVCLStringListValue
TVCLFileDataValue
TVCLStringValue
«interface»
IVCLPropertyValue
TVCLBooleanValue
TVCLProperty TVCLValueFactory
«enumeration»
TDFM TVCLComponent TVCLValueKind
de oito diferentes tipos de dados como valores de propriedades. Para cada um dos tipos
previsto há uma classe que implementa a interface IVCLPropertyValue, de forma a
interpretar o valor proveniente do arquivo .dfm de forma apropriada ao tipo em questão. O
quadro 14 apresenta as classes mencionadas e os tipos por elas processados.
classe descrição
TVCLBooleanValue Valor do tipo lógico: true ou false.
TVCLFileDataValue Cadeia de hexadecimais, representando o conteúdo de um arquivo.
TVCLIdentifierValue Identificador para um elemento de enumeração ou nome de objeto.
TVCLIntegerValue Valor inteiro sinalizado.
TVCLRealValue Valor de ponto flutuante.
TVCLSetValue Lista de identificadores que compõe um conjunto.
TVCLStringListValue Lista de strings.
TVCLStringValue Valor do tipo string.
Quadro 14 - Classes para interpretação de valores de propriedades
A interface IVCLPropertyValue fornece às classes que a implementam métodos para
informar e recuperar o valor por ela armazenado. Este nível de abstração permite recuperar e
enviar valores para estas classes sem necessidade de conhecer o tipo de dado por ela
armazenado.
O pacote VCL Abstract fornece também a classe TVCLValueFactory, utilizada para
criar objetos do tipo IVCLPropertyValue. Esta classe armazena um atributo do tipo
enumeração denominado TVCLValueKind, no qual estão declarados oito elementos, cada qual
representando um tipo de dado específico, conforme detalha o quadro 15.
elemento classe representada
vkBoolean TVCLBooleanValue
vkFileData TVCLFileDataValue
vkIdentifier TVCLIdentifierValue
vkInteger TVCLIntegerValue
vkReal TVCLRealValue
vkSet TVCLSetValue
vkStringList TVCLStringListValue
vkString TVCLStringValue
Quadro 15 - Elementos declarados na enumeração TVCLValueKind
Ao passo que o pacote VCL Abstract fornece uma camada de abstração para o
conteúdo de um arquivo .dfm, o pacote Glade fornece uma camada de abstração às
informações armazenadas num arquivo de definição de interface gráfica segundo as
especificações da Libglade. As classes que o compõem são apresentadas na Figura 9.
class Glade
TIntegerValue TBooleanValue
TStringValue
TRealValue
«interface»
IPropertyValue
TStringListValue
TSignal TPacket
TProperty
*
A
*
*
1
TWidgetIdFactory
TGladeInterface TWidget
A classe TSignal representa um sinal da GTK+. Esta classe possui dois atributos que
armazenam o nome do sinal e o nome da função de call-back responsável por interceptar o
sinal.
Na classe TPacket estão armazenadas as propriedades referentes ao empacotamento
do elemento gráfico em relação ao componente que o contém dentro da interface.
Todas as informações relevante a um elemento gráfico da GTK+ estão encapsulados
na classe TWidget. Nesta encontram-se atributos que armazenam o seu identificador, classe,
propriedades, sinais, empacotamento e elementos contidos.
A classe TGladeInterface representa todo o conteúdo da interface gráfica. Contém
apenas uma lista dos elementos gráficos de nível superior na interface gráfica. Comumente
estará presente apenas um elemento do tipo janela, dentro do qual estarão armazenados todos
os outros elementos que compõem a interface gráfica.
1 1
«interface» TPropertiedMapped 1
ISpecialTranslator
TMappedWidget
TConditionedWidget
TAbstractSpecialTranslator
TMappedProperty
* *
«interface» TBaseTranslator
IPropertyTranslator TTranslatorFactory
* *
TTransformerProperty TTransformerWidget
TBaseTransformer
TTransformerGlade
TTransfomerSignal
TTransformerPacket
Para cada um dos objetos do pacote Glade que compõem uma interface gráfica
Libglade há uma classe capaz de transformá-lo em um fragmento de documento XML. Estas
classes são descendentes da TBaseTransformer, que constitui a base para as classes
transformadoras de objetos do pacote Glade em fragmentos do documento XML que define a
interface gráfica. A classe TBaseTransformer implementa a interface ITransformer que
fornece o conjunto de métodos necessário à realização da transformação. As classes
51
TProj ect
1 1
Para o atributo check, dois valores são válidos: equality e exists. Equality indica
que o componente deve conter a propriedade indicada com o valor igual ao informado no
atributo value. Exists indica que a propriedade deve estar presente no componente para que
a tradução seja realizada.
Para componentes da categoria de tradução condicionada à propriedade, é possível
informar uma tag widget sem quaisquer condicionamentos de propriedades. Desta forma,
caso o componente não atenda os condicionamentos de qualquer das tags widget
compreendidas, esta tag sem condicionamentos será assumida para tradução.
55
A categoria de tradução especial é especificada apenas com uma tag component com
os atributos class, translation e translator. Tal como nas especificações de tradução
para as categorias simples e condicionada a propriedades, o atributo class armazena o nome
da classe correspondente ao componente VCL. O atributo translation deve conter o valor
special. O atributo translator, por sua vez, deve conter o nome da classe implementada na
ferramenta DelphiToGTK+ capaz de realizar a tradução do componente VCL em questão.
Esta classe deve estender a classe TAbstractSpecialTranslator. Um exemplo de
mapeamento especial é apresentado no Quadro 21.
<component class="TSpinButton" translation="special"
translator="TSpinButtonTranslator" />
Quadro 21 - Exemplo de mapeamento da categoria especial
A tag widget, presente no mapeamento de componentes das categorias simple e
propertied, podem conter uma tag opcional denominada required-properties. Nesta tag
são informadas as propriedades que deverão obrigatoriamente ser criadas para o elemento
GTK+ resultante da tradução do componente VCL. Cada propriedade é identificada pela tag
property, que contém, obrigatoriamente, os atributos name e value, sendo o primeiro o nome
da propriedade e o segundo o seu valor. No Quadro 22 é apresentado um modelo de
componente mapeado cuja tradução especifica propriedades requeridas.
<component class="TCheckBox" translation="simple">
<widget class="GtkCheckButton">
<required-properties>
<property name="draw_indicator" value="True" />
</required-properties>
</widget>
</component>
Quadro 22 - Exemplo de mapeamento que contém atributos requeridos
pois um conjunto de propriedades da VCL pode ser traduzido em uma única propriedade para
a Libglade. Um conjunto de propriedades é contido por uma tag group, declarada dentro da
tag groups. A tag group, por sua vez, deve conter obrigatoriamente uma tag properties,
onde serão informadas as propriedades da VCL que compõem o conjunto de propriedades. Na
tag group deve-se informar o atributo translator. Neste deve-se indicar o identificador da
classe responsável pela tradução do conjunto de propriedades contidas pela tag group. As
classes tradutoras de propriedades descendem da classe TBaseTranslator que implementa a
interface IPropertyTranslator e estão implementadas na unidade upropertytranslation
do código fonte da ferramenta.
Dentro da tag properties são declaradas as propriedades do componente VCL que
compõem o grupo de tradução. Cada propriedade é especificada em uma tag denominada
property que deve conter os atributos name, required, type e default. No atributo name é
informado o nome da propriedade VCL e no atributo default permite armazenar um valor
que será assumido para a propriedade caso a mesma não esteja presente no componente. O
atributo type segue a mesma regra do atributo homônimo da tag property na especificação
do mapeamento de componentes explanada na seção anterior. O atributo required indica se
esta propriedade é necessária para realizar a tradução do grupo, sendo seus possíveis valores
true ou false. Todos os atributos são obrigatórios, contudo, permite-se não informar
qualquer valor para o atributo default.
O Quadro 23 apresenta fragmento do arquivo properties.xml que mostra o
mapeamento dos atributos de um componente VCL.
<class name="TTrackBar">
<groups>
<group translator="Alignment">
<properties>
<property name="Position" required="true" type="Integer" default="0" />
<property name="Min" required="true" type="Integer" default="0" />
<property name="Max" required="true" type="Integer" default="10" />
<property name="PageSize" required="true" type="Integer" default="2" />
<property name="Frequency" required="true" type="Integer" default="1" />
</properties>
</group>
</groups>
</class>
Quadro 23 - Exemplo de mapeamento de propriedades
ferramenta as informações necessárias para criar a assinatura dos métodos de call-back que
processarão os sinais da GTK+ equivalentes aos eventos dos componentes VCL. Tal como os
mapas apresentados nas duas seções antecedentes, este também inicia com a tag
delphitogtk, dentro da qual estão armazenadas todas as informações referentes à tradução
dos eventos.
Cada componente VCL cujos eventos devem ser traduzidos para a Libglade deve
possuir uma tag component dentro da tag raiz do arquivo, onde o atributo class indica o
nome da classe na biblioteca VCL que representa o componente. Cada evento passível de
tradução é representado pela tag event, dentro da tag component. Esta tag deve possuir dois
atributos denominados vcl e gtk. No primeiro é informado o nome do evento na biblioteca
VCL e o segundo o nome do sinal da GTK+ similar ao evento VCL.
A tag event deve possuir uma tag arguments, onde serão informados os parâmetros
que serão enviados à função de call-back responsável pelo tratamento do sinal da GTK+.
Cada parâmetro é especificado em uma tag denominada argument que possui os atributos
name e type. O atributo name armazena o nome do parâmetro, enquanto type guarda o nome
do tipo do parâmetro. O Quadro 24 apresenta trecho do arquivo events.xml onde os eventos
de um componente estão mapeados.
<component class="TMenuItem">
<event vcl="OnClick" gtk="button-press-event">
<arguments>
<argument name="Widget" type="PGtkWidget" />
<argument name="Event" type="PGdkEvent" />
<argument name="UserData" type="GPointer" />
</arguments>
</event>
</component>
Quadro 24 - Exemplo de mapeamento de eventos de um componente
3.6 IMPLEMENTAÇÃO
A partir da BNF definida por Silveira (2006), foi usado o GALS para gerar as classes e
constantes que constituem os analisadores léxico, sintático e semântico. O GALS é capaz de
gerar código fonte para três diferentes linguagens de programação: Java, C++ e Delphi. Como
a ferramenta foi implementada sobre a linguagem Pascal/Object Pascal, optou-se pela geração
dos códigos em Delphi. No código gerado, foi detectada uma falha de chamada recursiva
presente no método NextToken da classe TLexicon. O trecho de código onde se encontra a
chamada recursiva que apresentou falha é destacado no Quadro 25.
59
Das classes geradas pelo GALS a que sofreu maiores alterações foi a TSemantic. A
esta classe foram adicionados três novos atributos e o método ExecuteAction foi
implementado para interpretar o conteúdo processado pelos analisadores léxico e sintático a
partir de um arquivo .dfm.
O atributo FDFM da classe TSemantic armazena um objeto do tipo TDFM que é
alimentado com as informações pertinentes à interface gráfica VCL durante o processo de
interpretação do arquivo .dfm. O atributo FComponents, que representa uma pilha de objetos
do tipo TVCLComponent e FIdentifier são auxiliares ao método ExecuteAction.
Sempre que encontrar uma ação semântica, o analisador sintático (classe TSyntatic)
realizará uma chamada à ExecuteAction da classe TSemantic, enviando como parâmetros o
número da ação e um objeto do tipo TToken, que representa o último elemento encontrado no
arquivo .dfm antes da ação semântica. Para atender as necessidades da ferramenta, foram
criadas vinte e duas ações semânticas. Para cada ação, o método ExecuteAction adota uma
estratégia distinta e alimenta gradualmente as classes do pacote VCL Abstract através do
atributo FDFM. As ações semânticas são:
a) ação semântica #1: executada após um identificador de componente VCL ser
60
j) ações semânticas #17 e #18: as ações #17 e #18 são disparadas logo após o
reconhecimento de um símbolo de abre-parêntese ou fecha-parêntese. Para os dois
casos o analisador semântico indica à TVCLValueFactory que está sendo efetuada
a leitura de uma lista de strings, enviando o valor vkStringList ao atributo Kind;
k) ações semânticas #19 e #20: indicam a leitura de um valor de propriedade que
representa uma cadeira de caracteres hexadecimais. Tais valores são delimitados
62
Uma vez que a interface gráfica definida em um arquivo .dfm foi propriamente
processada e carregada para o conjunto de classes do pacote VCL Abstract, os mapas de
tradução são carregados para a aplicação. Como já mencionado, a ferramenta utiliza três
diferentes mapas: mapa de componentes, mapa de propriedades e mapa de eventos. Para cada
mapa há um pacote de classes específico, com um conjunto de classes capazes de processar o
documento XML e transformá-lo em um formato legível à ferramenta.
O compilador Free Pascal fornece um conjunto de classes pré-compiladas para
processamento de documentos que utilizam a notação XML. Para carregar um documento
XML foi utilizada a classe TXMLDocument, definida na unidade DOM, distribuída junto ao Free
Pascal. O carregamento de um documento XML para a classe TXMLDocument é realizado
através da chamada à função ReadXMLFile, declarada na unidade XMLRead do Free Pascal.
Esta função recebe dois parâmetros, sendo o primeiro o objeto TXMLDocument para o qual o
documento XML será carregado e o segundo o caminho completo de localização do
documento XML que se deseja carregar. O Quadro 26 mostra o trecho de código do método
Load da classe TComponentMapLoader, destacando o comando que efetua o carregamento do
documento XML.
63
Tendo sido os mapas devidamente carregados dos arquivos XML, torna-se possível
realizar a tradução de uma interface gráfica Delphi para a biblioteca Libglade. A tradução
completa da interface gráfica é gerenciada pela classe TDFMTranslator, que encapsula os
mapas. Esta classe realiza a tradução a partir de um objeto do tipo TDFM devidamente
carregado pelo analisador semântico com base em informações interpretadas do arquivo .dfm
de origem.
Para instanciar a classe TDFMTranslator deve-se passar ao construtor o caminho do
diretório onde estão localizados os arquivos de mapeamento. O construtor da
TDFMTranslator procurará pelos arquivos componentes.xml, properties.xml e
events.xml dentro do diretório indicado. Se os três arquivos estão presentes no diretório,
então os mapas serão inicializados através da chamada ao método LoadMaps.
64
Tendo sido a classe TDFMTranslator instanciada, a tradução pode ser realizada através
da chamada ao método Translate que recebe como parâmetro um objeto do tipo TDFM que
foi carregado pelo analisador semântico por ocasião da interpretação do arquivo .dfm. O
resultado da execução deste método é um objeto do tipo TGladeInterface da interface
gráfica Libglade equivalente a interface gráfica VCL definida no arquivo .dfm de origem.
Tendo sido acionado, o método Translate cria um novo objeto da classe
TGladeInterface, no qual será armazenado o objeto TWidget equivalente ao formulário
Delphi traduzido. A tradução dos componentes é realizada de forma recursiva pela chamada à
PerformTranslation, a partir do método Translate, enviando como parâmetro o objeto
TVCLComponent referente ao formulário Delphi. O Quadro 27 apresenta o código do método
Translate.
{...}
for J := 0 to MappedWidget.Conditions.Count - 1 do begin
Condition := MappedWidget.Conditions.Items[J];
if Condition is TEqualityCondition then begin
Equality := TEqualityCondition(Condition);
VCLProperty := VCLComponent.FindProperty(Equality.PropertyName);
if VCLProperty = nil then
Translatable := False
else
Translatable := VCLProperty.Equals(Equality.PropertyValue);
end
else begin
VCLProperty := VCLComponent.FindProperty(Condition.PropertyName);
Translatable := VCLProperty <> nil;
end;
if not Translatable then
Break;
end;
for I := 0 to MappedClass.Groups.Count - 1 do
if MappedClass.Groups.Items[I].Translator <> nil then begin
Properties := MappedClass.Groups.Items[I].Translator.Translate;
if Properties <> nil then
for J := 0 to Properties.Count - 1 do
Result.Add(Properties.Items[J]);
end;
end;
end;
Quadro 33 - Código fonte do método TranslateProperties da classe TDFMTranslator
Traduzidas as propriedades, o controle retorna ao método PerformTranslation, que
atribuirá as propriedades traduzidas ao componente traduzido. O trecho de código responsável
por esta operação é apresentado no Quadro 34.
function TDFMTranslator.PerformTranslation(const VCLComponent: TVCLComponent):
TWidget;
var
Properties: TPropertyList;
I: Integer;
begin
{...}
Properties := TranslateProperties(VCLComponent);
for I := 0 to Properties.Count - 1 do
Result.Properties.Add(Properties.Items[I]);
{...}
end;
Quadro 34 - Trecho do código do método PerformTranslate responsável atribuir as propriedades
traduzidas
encontrar algum componente com este tipo de alinhamento, criar-se-á um novo container da
classe GtkHBox, que representa uma caixa para armazenamento de elementos alinhados
horizontalmente. Da mesma forma como no alinhamento vertical, uma nova caixa horizontal
será criada somente se o próprio componente convertido não é do tipo GtkHBox. Se o
componente traduzido possui componentes com alinhamentos vertical e horizontal, a caixa de
alinhamento horizontal é armazenada pela caixa de alinhamento vertical, de forma a simular a
precedência de alinhamentos da biblioteca VCL. O Quadro 40 apresenta o trecho de código
do método PerformTranslation responsável por esta verificação.
if (alLeft in ChildsAlign) or (alRight in ChildsAlign) then begin
if Result.Name = 'GtkHBox' then
HBox := Result
else begin
HBox := TWidget.Create('GtkHBox', MakeNewId('GtkHBox'));
if VBox = nil then
Result.Childs.Add(HBox)
else
VBox.Childs.Add(HBox);
end;
HBox.Properties.Add(TProperty.Create('visible', TBooleanValue.Create(True)));
end
else
HBox := nil;
Quadro 40 - Código responsável pela verificação dos componentes alinhados horizontalmente
Finalizada a verificação da existência de componentes horizontalmente alinhados,
verifica-se a existência de componentes sem alinhamento, ou seja, o valor da propriedade
Align é alNone. Para simular este tipo de alinhamento na biblioteca GTK+ usa-se a classe
GtkFixed. Todo elemento inserido em um container GtkFixed tem seu posicionamento e
dimensões fixas, migradas das propriedades Left, Top, Width e Height da especificação da
interface gráfica do arquivo .dfm. Para simular a precedência de alinhamento da VCL, o
container GtkFixed criado é inserido no container anteriormente criado, que pode ser um
GtkHBox ou GtkVBox, se existir; caso contrário é inserido no próprio componente traduzido,
se este não é do tipo GtkFixed. O trecho de código do método PerformTranslation
responsável pela verificação da existência de componentes sem alinhamento é apresentado no
Quadro 41.
74
Uma vez que todos os diretórios foram selecionados, a aplicação está apta a realizar o
processo de tradução dos arquivos .dfm. Este processo é acionado pelo botão Executar,
destacado na Figura 20.
A ferramenta produzida como resultado deste trabalho atende aos requisitos propostos,
apresentando uma interface gráfica de fácil usabilidade e compreensão. Realiza a conversão
dos componentes visuais mais comumente utilizados no desenvolvimento de aplicações com
interface gráfica do usuário no Delphi.
A ferramenta DelphiToGTK+ foi totalmente desenvolvida sobre software livre e
portável, o que permite que ela seja migrada para outras plataformas que suportam a versão da
GTK+ usada no seu desenvolvimento. A adoção de padrões de tradução através de arquivos
XML permite que novos componentes sejam adicionados aos mapas e traduzidos pela
ferramenta sem a necessidade de reconstrução do código fonte.
Quanto aos componentes que apresentam um grau de complexidade que não permite o
mapeamento, pode-se optar pelo desenvolvimento de uma classe específica para sua tradução
sendo necessário, neste caso, recompilar a aplicação.
Foram realizados quatro diferentes testes sobre a ferramenta DelphiToGTK+ com o
intuito de detectar possíveis falhas, bem como os resultados obtidos da sua aplicação sobre
casos de testes. Os casos de testes incluem as três diferentes categorias de mapeamento de
componentes, além da tradução de propriedades e eventos.
A Figura 21 apresenta o primeiro caso de teste, uma interface gráfica desenhada no
Delphi. Na sequência (Figura 22), é apresentada a interface gráfica traduzida para a biblioteca
GTK+.
80
componentes presentes na interface gráfica original foram traduzidas para a biblioteca GTK+.
Contudo, verificou-se que as dimensões da janela e do componente TGroupBox não foram
corretamente traduzidas.
O Quadro 44 apresenta características relevantes à ferramenta DelphiToGTK+ e às
ferramentas apresentadas como trabalho correlatos, traçando um comparativo entre elas.
Extensão da
característica DelphiToWeb ferramenta ScriptCase DelphiToGTK+
Delphi2Java-II
linguagem de PHP e Pascal/Object
Java Java
programação Javascript Pascal
flexibilidade para
Não Não - Sim
conversão
tradução para tecnologia
Sim Sim - Sim
portável
suporte para acesso a
Não Sim Sim Não
banco de dados
interface traduzida pode
ser migrada para
Não Não - Sim
diferentes linguagens de
programação
Quadro 44 - Quadro comparativo entre as ferramentas
Nota-se no Quadro 44 que a ferramenta DelphiToGTK+ apresenta características
desejáveis a uma ferramenta de conversão. Dentre tais características destacam-se a
flexibilidade para conversão e a possibilidade de portar a interface traduzida para diferentes
linguagens de programação. Embora o resultado de processamento dos trabalhos correlatos
sejam tecnologias portáveis entre diferentes plataformas, ainda assim limita-se a uma única
linguagem de programação, o que impossibilita ao usuário a adoção de outra linguagem com a
qual esteja familiarizado. Tal limitação está ausente na ferramenta DelphiToGTK+, visto que
o resultado do processo de conversão é um arquivo portável e legível a biblioteca gráfica
GTK+, que fornece suporte para várias linguagens de programação, dentre elas o Java, alvo
de tradução das ferramentas DelphiToWeb e Delphi2Java-II.
Destaca-se também no trabalho a possibilidade do usuário reaproveitar grande porção
do código fonte da aplicação traduzida. Isto se dá pelo fato da biblioteca GTK+ fornecer
suporte as linguagens de programação Pascal e Object Pascal, que fornece sintaxe idêntica à
linguagem de aplicativos criados no Delphi.
84
4 CONCLUSÕES
Toda aplicação construída para o público leigo à área de computação faz-se necessária
a construção de uma interface gráfica do usuário de forma a facilitar a utilização e
compreensão do aplicativo. Em vista de tal necessidade, surgiram bibliotecas para
desenvolvimento de interfaces gráficas para as mais diversas linguagens de programação.
Contudo, geralmente tais bibliotecas são compatíveis somente à linguagem ou ambiente de
desenvolvimento para o qual foi construída, dificultando a migração do software para outras
linguagens de programação.
Em vista da crescente necessidade de compatibilizar seus aplicativos para diferentes
plataformas, os desenvolvedores têm buscado soluções em linguagens portáveis como o Java.
Contudo, a migração da interface gráfica constitui uma etapa que toma tempo considerável no
processo de conversão. Em face de tais argumentos, além de automatizar o processo de
migração de interfaces gráficas, a ferramenta DelphiToGTK+ a faz para o formato portável
XML, legível a biblioteca Libglade, componente da biblioteca gráfica GTK+.
Por tratar-se de uma biblioteca multi-plataforma e multi-linguagem, as interfaces
gráficas definidas nos arquivos .glade podem ser carregados por diferentes linguagens de
programação em diferentes sistemas operacionais, bastando que a linguagem possua
implementado um binding para a GTK+.
Outra vantagem na utilização desta biblioteca diz respeito a alterações na interface
gráfica. Uma vez que a interface gráfica é carregada dinamicamente do arquivo .glade,
quaisquer alterações necessárias na interface gráfica dispensa a necessidade de recompilar o
código fonte da aplicação.
4.2 EXTENSÕES
6
Menor ponto ou elemento que forma uma imagem digital.
86
extensão complexidade
Integrar a ferramenta ao motor de script Pascal Script de forma a flexibilizar a
construção de rotinas para tradução de componentes complexos, dispensando a 10
necessidade de recompilar a aplicação.
Para componentes da VCL que não podem ser traduzidos segundo as
especificações da Libglade, verificar a possibilidade de gerar código capaz de 10
criar os elementos gráficos em tempo de execução.
Criar uma extensão para permitir gerar interfaces gráficas para o formato
8
suportado pela classe GladeXML da GTK+.
Desenvolver uma interface gráfica para auxiliar na construção de arquivos de
8
mapeamento de componentes, propriedades e eventos.
Criar esquemas XML para validação dos mapas de tradução para realizar a
8
validação na aplicação, diminuindo o risco de erros.
Gerar código para carregamento da interface gráfica traduzida para diferentes
7
linguagens de programação que suportam a GTK+.
Realizar a tradução do componente TFrame da biblioteca VCL. 1
Quadro 45 - Sugestões de melhorias e extensões para a ferramenta
87
REFERÊNCIAS BIBLIOGRÁFICAS
GALE, Tony et al. GTK+ 2.0 tutorial. [S.l.], 2010. Disponível em:
<http://library.gnome.org/devel/gtk-tutorial/stable/>. Acesso em: 02 set. 2010.
HARLOW, Eric. Developing Linux applications with GTK+ and GDK. Indianapolis: New
Riders, 1999.
HAROLD, Elliotte R.; Means, W. S. XML: in a Nutshell. 2nd. Sebastopol: O’Reilly, 2002.
KDE. In: WIKIPÉDIA, a enciclopédia livre. [S.l.]: Wikimedia Foundation, 2010. Disponível
em: <http://pt.wikipedia.org/wiki/KDE>. Acesso em: 25 set. 2010.
LIRA, Marcelo. Mantendo a sanidade com o Glade. [Recife], 2010. Disponível em:
<http://www.cin.ufpe.br/~cinlug/wiki/index.php?title=Mantendo_A_Sanidade_Com_O_Glad
e#Programa.C3.A7.C3.A3o_Orientada_a_Eventos>. Acesso em: 04 set. 2010.
QT. In: WIKIPÉDIA, a enciclopédia livre. [S.l.]: Wikimedia Foundation, 2010. Disponível
em: <http://pt.wikipedia.org/wiki/Qt>. Acesso em: 25 set. 2010.
SCRIPTCASE. In: WIKIPÉDIA, the free encyclopedia. [S.l.]: Wikimedia Foundation, 2010.
Disponível em: <http://pt.wikipedia.org/wiki/ScriptCase>. Acesso em: 20 set. 2010.
THE GLADE PROJECT. Glade: a user interface designer. [S.l.], 2009. Disponível em:
<http://glade.gnome.org/>. Acesso em: 04 set. 2010.
VISUAL component library. In: WIKIPÉDIA, the free encyclopedia. [S.1.]: Wikimedia
Foundation, 2010. Disponível em:
<http://en.wikipedia.org/wiki/Visual_Component_Library>. Acesso em: 05 set. 2010.
XFCE. In: WIKIPÉDIA, a enciclopédia livre. [S. l.]: Wikimedia Foundation, 2010.
Disponível em: <http://pt.wikipedia.org/wiki/Xfce>. Acesso em: 25 set. 2010.
89
uses
gtk2, gdk2, glib, libglade2, sysutils;
$(CALLBACK_IMPL)
exports
$(CALLBACK_HEADERS)
var
GladeXML: Pointer;
begin
gtk_init(@argc, @argv);
GladeXML := glade_xml_new(PChar('$(UI_DEF_PATH)'), nil, nil);
glade_xml_signal_autoconnect(GLADE_XML(GladeXML));
gtk_main;
end.
Quadro 46 - Modelo de código para carregamento da interface
90