Aplicativo de vendas – Parte I
Este artigo é o primeiro de uma série onde iremos construir um pequeno aplicativo de vendas utilizando a plataforma eclipse. Ao longo desta série de artigos, vários conceitos serão apresentados e exemplificados, desde a arquitetura em 3 camadas até a criação e exibição de relatórios para o usuário.
A arquitetura em plugins
Nos artigos anteriores, mostramos como funciona a arquitetura de plugins do eclipse e como criar seu próprio aplicativo RCP, que na verdade também é um plugin.
Em um aplicativo de maior escala, como o que estamos iniciando agora, não é viável, em termos de legibilidade e manutenção posterior do código, que façamos um único e gigantesco plugin, contendo todo o código de nossa aplicação.
Iremos dividir o nosso programa em pequenos plugins que serão interdependentes, cada qual provendo uma funcionalidade específica da aplicação, como acesso a dados ou ajuda, por exemplo.
Uma grande vantagem de se utilizar esta metodologia é que o nosso programa estará dividido em pequenas partes que poderão ser atualizadas individualmente mais tarde, quando o aplicativo já estiver em produção. Isso diminuirá consideravelmente o tamanho e o tempo dos downloads para o usuário do seu programa, bem como diminuirá também o uso de banda em seu servidor de atualizações.
Em quais partes dividir
Agora que já sabemos da utilidade de dividirmos o nosso programa em partes menores a questão inevitável passa a ser: “como dividir o meu programa ?”.
Não existe uma solução que atenda a todos, pois cada aplicação desenvolvida terá um ambiente próprio e cada programador vê as coisas do seu modo. Diante destes fatos, resta apenas sugerir um modo de dividir seu aplicativo RCP e deixar que os requisitos do seu projeto em particular determinem como fará isso posteriormente.
Para o aplicativo de vendas que estamos construindo, iremos dividi-lo em 5 partes, a saber:
· Plugin principal (Aplicativo RCP propriamente dito)
· Plugin de acesso a dados (Classes de comunicação com o BD, etc.)
· Plugin de ajuda (Fornece “ajuda” para os usuários do programa)
· Plugin de impressão (Relatórios e classes relativas à impressão)
· Plugin de suporte (Classes úteis a todo o sistema)
O modelo ideal
O assistente de novo plugin do eclipse nos fornece uma pequena lista de modelos nos quais podemos basear a geração de código para o novo plugin. Nos artigos “Introdução ao Eclipse RCP” e “Entendendo a Eclipse Workbench” eu mostrei este assistente e dois dos modelos disponíveis foram utilizados para exemplificar o processo de criação de plugins.
Agora, que vamos começar um projeto “real”, qual o modelo correto a adotar ? Qual trará um esqueleto de código mais “completo”, que facilitará a construção do restante da aplicação posteriormente ?
A resposta é: depende.
Caímos aqui no mesmo problema da divisão do aplicativo: cada programa é uma realidade diferente e cada programador pensa de maneira diferente. Para alguns, o “certo” é fazer tudo “no braço”, sem geração alguma de código por parte da IDE. Para outros, quanto mais código a IDE puder fornecer, tanto melhor.
Falando em termos de “acabamento”, com certeza o modelo de Correio (RCP Mail) é o mais completo, pois fornece, entre outras coisas: uma barra de ferramentas, uma barra de menus, duas views e algumas actions já criadas. Estudar este modelo, como proposto no artigo “Entendendo a Eclipse Workbench” certamente lhe auxiliará a entender melhor como funciona um aplicativo RCP.
Para o nosso aplicativo de vendas, iremos utilizar o modelo “Hello RCP”, o mais básico de todos, quase sem geração de código por parte da IDE. E isto tem um motivo bem simples: ao escrevermos nossos próprios códigos para a criação da barra de ferramentas, barra de menus, Views e Editors que iremos utilizar, o aprendizado será maior, pois não existe meio melhor de se aprender a programar do que programando.
O plugin principal
Agora que já definimos algumas coisas sobre a nossa nova aplicação, e já decidimos utilizar o modelo “Hello RCP”, vamos criar o nosso plugin principal, que fornecerá a interface com o usuário do nosso programa.
Não explicarei aqui os passos necessários à criação deste plugin, uma vez que eles já foram abordados, com exemplos e capturas de tela, no artigo “Introdução ao Eclipse RCP”.
Com relação ao procedimento mostrado no artigo citado acima, apenas uma modificação: o nome do projeto deixa de ser br.com.devmedia.HelloWorld para ser br.com.devmedia.Commerce. Desnecessário dizer que “Commerce” será o nome do nosso programa.
Definindo o layout do nosso programa
Após ter concluído a geração do plugin baseado no modelo Hello RCP você estará com um programa básico, com apenas uma página, em uma janela de 400x300 pixels.
Vamos alterar o layout deste programa, de forma a separar 3 áreas na interface principal. Uma barra lateral com duas divisões, uma área na parte inferior para as views do programa e a EditorArea que ocupará a maior parte da tela. Também iremos modificar a estrutura da workbench, aumentando o tamanho da janela e ativando a exibição da barra de status, da barra de ferramentas, da barra de visualizações rápidas (mais sobre ela posteriormente) e definindo que o nosso programa deve salvar as alterações feitas pelo usuário no layout da tela, sempre que o programa for encerrado.
Após estas alterações, a interface do programa deverá ser idêntica à mostrada na Figura 01 abaixo:

Figura 01: Layout do programa de vendas
Se você leu o artigo anterior sobre a Eclipse Workbench, certamente saberá que para alterarmos a aparência de nosso programa e a disposição das partes na tela, tivemos de modificar a nossa perspectiva.
No modelo Hello RCP utilizado, o arquivo Perspective.java é gerado automaticamente, mas o método createInitialLayout que é o responsável pelo “desenho” da tela vem em branco, sem nenhum conteúdo.
Assim, para modificarmos a nossa perspectiva, de forma que fique como a mostrada na figura 01, é necessário adicionarmos conteúdo ao método createInitialLayout, de maneira que a classe Perspective fique como mostrado na listagem 01:
package br.com.devmedia.commerce;
import org.eclipse.ui.IFolderLayout;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveFactory;
public class Perspective implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout) {
String editorArea = layout.getEditorArea();
layout.setEditorAreaVisible(true);
IFolderLayout top_left_folder = layout.createFolder("lateral_superior",
IPageLayout.LEFT, 0.25f, editorArea);
IFolderLayout bot_left_folder = layout.createFolder("lateral_inferior",
IPageLayout.BOTTOM, 0.70f, "lateral_superior");
IFolderLayout bot_folder = layout.createFolder("cadastro",
IPageLayout.BOTTOM, 0.70f, editorArea);
}
}
Listagem 01: Perspective.java
Note que para criarmos as diversas áreas no nosso programa utilizamos “Folders”, ou melhor, da interface IFolderLayout e do método createFolder.
Não cabe agora explicar como funciona o mecanismo de “folders” da plataforma eclipse, mas a parte prática é bem simples.
O método createFolder recebe 5 parâmetros, nesta ordem:
· folderId: O “nome” da folder que você está criando
· relationship: uma constante definida em IPageLayout que especifica a localização da folder a ser criada. Os valores possíveis são TOP, BOTTOM, LEFT e RIGHT.
· ratio: Um valor float que define o tamanho da folder que se está criando.
· refId: A id da área onde se está inserindo a nova folder. Pode ser uma folder criada anteriormente (como a “lateral_superior” mostrada na listagem 01) ou o id especial retornado pelo método getEditorArea().
Você pode ir subdividindo a tela, criando folders uma dentro da outra, à vontade. As folders podem conter Views, mas não Editors. Estes podem aparecer apenas na área especial, ou EditorArea como dito anteriormente.
Caso você não possua Editors em seu programa, pode simplesmente “esconder” a EditorArea, de forma a aproveitar todo o espaço da tela com suas folders. Para esconder a EditorArea, basta defini-la como “não visível”, através do método
setEditorAreaVisible, mostrado na listagem 01. Note que definimos explicitamente esta área como visível, pois teremos editors em nosso programa.
A próxima etapa do procedimento de modificação da aparência de nosso aplicativo é a classe ApplicationWorkbenchWindowAdvisor. Nela, há um método denominado preWindowOpen que determina vários aspectos relacionados à janela principal de nosso programa.
Posteriormente em nossa série de artigos, iremos nos aprofundar nesta classe, que fornece meios de executarmos códigos próprios do domínio de nossa aplicação durante a inicialização do programa.
Por hora, vamos nos ater aos métodos setShow* da classe IWorkbenchWindowConfigurer que permite mostrar/esconder vários elementos visuais da plataforma RCP. Para ativar a exibição de menus, barra de ferramentas, barra de visualizações rápidas, barra de progresso de operações em background e a barra de status do nosso programa, modifique o método preWindowOpen de maneira a deixá-lo como mostrado na listagem 02:
public void preWindowOpen() {
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
configurer.setInitialSize(new Point(800, 600));
configurer.setShowCoolBar(true);
configurer.setShowStatusLine(true);
configurer.setShowFastViewBars(true);
configurer.setShowProgressIndicator(true);
configurer.setShowMenuBar(true);
configurer.setTitle("DevMedia Commerce versão alpha 0.1");
}
Listagem 02: Método preWindowOpen
O último passo necessário agora é a modificação da classe ApplicationWorkbenchAdvisor, adicionando-lhe o método initialize, que usaremos para configurar um aspecto importante de nosso programa.
Através deste método, e da classe IWorkbenchConfigurer poderemos informar à plataforma eclipse que as modificações do usuário no layout da interface deverão ser armazenadas em disco, de maneira que na próxima utilização do programa o usuário encontrará o ambiente como o deixou.
Modifique a classe adicionando o método initialize mostrado na listagem 03:
public void initialize(IWorkbenchConfigurer configurer) {
super.initialize(configurer);
configurer.setSaveAndRestore(true);
}
Listagem 03: Método initialize
Executando agora o Commerce, ele deverá exibir uma tela idêntica à da figura 01. Caso surja alguma mensagem de erro, revise os procedimentos apresentados e confira as modificações realizadas nas diversas classes do programa.
Barra de menus e barra de ferramentas
O Eclipse trabalha com o conceito de Actions para a criação de opções nas barras de menu e de ferramentas. Uma Action é uma classe que extende org.eclipse.jface.actions.Action. Através desta classe é possível definir o texto, o tooltip (texto de ajuda que aparece quando passamos o mouse sobre a opção), o ícone, o atalho de teclado, entre outros aspectos.
Para esta versão inicial do Commerce, iremos definir apenas 3 actions:
· Exibir cadastro de produtos
· Exibir cadastro de clientes
· Exibir listagem de vendas
Para isso iremos criar 3 classes, respectivamente: OpenViewProdutos, OpenViewClientes, OpenViewVendas.
As imagens utilizadas neste exemplo devem ser adicionadas ao projeto, dentro da pasta já existente “icons”.
Para adicionar uma imagem à esta pasta, clique sobre ela com o botão direito do mouse e navegue pelo menu até a opção Nova -> Arquivo. Uma tela como a da figura 02 surgirá:

Figura 02: Adicionar ícone ao projeto
Apenas informe o nome da imagem que deseja adicionar e clique sobre o botão ‘Concluir’. Um novo arquivo em branco será criado em seu ambiente de trabalho. Feche-o. Em seguida, utilizando o navegador de arquivos de seu sistema operacional localize a pasta do projeto e substitua o arquivo em branco gerado pelo Eclipse pelo arquivo correto contendo a imagem que deseja adicionar ao projeto. De volta ao Eclipse, clique com o botão direito do mouse sobre a pasta icons e escolha a opção “Atualizar”.
Faça este procedimento 3 vezes, para adicionar as imagens referentes a clientes, produtos e vendas. Estas imagens devem ter 16x16 pixels de tamanho e preferencialmente devem estar em formato gif ou png.
Dica: Icones e imagens em formato e tamanho próprios para serem utilizados em aplicações desktop como essa são denominados, em inglês, como stock icons. Uma infinidade de ícones e imagens assim estão disponíveis na internet, gratuitamente e sem qualquer restrição de distribuição junto ao seu programa. Uma busca por ‘stock icons’ retorna muita coisa interessante.
Criando as actions
Iremos criar agora as 3 classes referentes às actions de nosso programa. Clique sobre o pacote principal do projeto, br.com.devmedia.Commerce com o botão direito do mouse e escolha a opção Nova -> Classe como ilustrado na figura 03:

Figura 03: Criando as classes de ações
Surgirá uma tela do assistente de nova classe do Eclipse, como mostrado na figura 04:

Figura 04: Assistente de nova classe do Eclipse
Preencha o nome da classe com OpenViewClientes e o nome da Superclasse com org.eclipse.jface.actions.Action, conforme ilustrado pela figura 04.
Repita os procedimentos acima para as classes OpenViewProdutos e OpenViewVendas.
Como não implementamos ainda as Views de Clientes, Produtos ou Vendas, iremos adicionar às nossas actions um código que apenas exibe uma mensagem ao usuário informando que este recurso ainda não está disponível.
Para isso, vamos sobrecarregar o método run() de nossas actions, e também deveremos implementar um construtor customizado. Após essas modificações, a classe OpenViewClientes deverá estar como mostrado na listagem 04:
package br.com.devmedia.commerce;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.IWorkbenchWindow;
public class OpenViewClientes extends Action
{
private IWorkbenchWindow window;
public OpenViewClientes (IWorkbenchWindow window, String label) {
this.window = window;
setId("Commerce.openViewClientes");
setActionDefinitionId("Commerce.openViewClientes");
setText(label);
setImageDescriptor(Activator.getImageDescriptor("icons/clientes.gif"));
}
public void run () {
MessageDialog.openInformation (window.getShell(), "Commerce",
"Este recurso ainda não está implementado");
}
}
Listagem 04: Classe OpenViewClientes implementada
Modifique também as outras duas classes, OpenViewProdutos e OpenViewVendas modificando apenas o path para o ícone correspondente e o ID de comando.
Adicionando as actions criadas na toolbar e menubar
Agora que temos nossas actions criadas, vamos adicioná-las à barra de menus e à barra de ferramentas do nosso programa, de modo que fiquem disponíveis para o usuário.
Quem controla este aspecto dos programas RCP é a classe ApplicationActionBarAdvisor também criada pelo Eclipse junto com o nosso plugin. Do mesmo modo que a classe Perspective, esta também está “vazia”, apenas com a assinatura dos métodos. Vamos adicionar agora o código que irá inserir nossas actions recém-criadas à interface do programa.
Modifique a classe citada de forma a ficar como mostrado na listagem 05:
package br.com.devmedia.commerce;
import org.eclipse.jface.action.ICoolBarManager;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.ToolBarContributionItem;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
private OpenViewClientes openViewClientes;
private OpenViewProdutos openViewProdutos;
private OpenViewVendas openViewVendas;
public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
super(configurer);
}
protected void makeActions(IWorkbenchWindow window) {
openViewClientes = new OpenViewClientes (window, "Cadastro de clientes");
register(openViewClientes);
openViewProdutos = new OpenViewProdutos (window, "Cadastro de produtos");
register(openViewProdutos);
openViewVendas = new OpenViewVendas (window, "Cadastro de vendas");
register(openViewVendas);
}
protected void fillMenuBar(IMenuManager menuBar) {
MenuManager princMenu = new MenuManager("&Commerce", "principal");
menuBar.add(princMenu);
princMenu.add(openViewClientes);
princMenu.add(openViewProdutos);
princMenu.add(openViewVendas);
}
protected void fillCoolBar(ICoolBarManager coolBar) {
IToolBarManager toolbar = new ToolBarManager(SWT.FLAT | SWT.RIGHT);
coolBar.add(new ToolBarContributionItem(toolbar, "main"));
toolbar.add (openViewClientes);
toolbar.add (openViewProdutos);
toolbar.add (openViewVendas);
}
}
Listagem 05: ApplicationActionBarAdvisor com as actions adicionadas
Ao executar agora o seu aplicativo, verá que a barra de menus e a barra de ferramentas surgem, trazendo as actions que definimos. A figura 05 mostra como ficou o Commerce após as modificações realizadas.

Figura 05: Barras de menu e de ferramentas
Neste artigo, criamos o plugin principal do que será o nosso programa de vendas “Commerce”. Vimos como funciona o sistema de actions da plataforma eclipse, ao criarmos nossas próprias actions e também definimos o layout de nossa tela principal.
No próximo artigo da série veremos como criar um plugin de acesso a dados, comunicando-se com um SGBD e também o plugin contendo as classes de suporte de nossa aplicação.
Até a próxima.