eclipse rcp felype santiago. rich client um rcp é um software que consiste dos seguintes...

Post on 07-Apr-2016

217 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Eclipse RCP

Felype Santiago

Rich Client

• Um RCP é um software que consiste dos seguintes componentes:– Core, gerenciador do ciclo de vida;– Um framework padrão para construção;– Um toolkit de desenvolvimento portável;– Manipulação de arquivos, gerenciamento e edição de

texto;– Workbench (views, editores, perspectivas, wizards);– Gerenciador de atualizações

Eclipse Rich Client Plataform

• Components• Middleware and infrastructure• Native user experience• Portability• Intelligent install and update• Disconnected operation• Development tooling support• Component librarires

Uses of Eclipse RCP

IBM Lotus Workspace

Maestro

Uses of Eclipse RCP

TAFPlus2

TaRGeT

Perspectivas, Views e Editores

• O usuário pode organizar o conteúdo das perspectivas das seguintes formas:– Pilha de editores com outros editores;– Pilha de views com outras views;– Desencaixar views da janela principal do

Workbench;– Redimensionar views e editores e

minimizar/maximizar pilhas de views e editores

Application• Java Application -> main()• Eclipse Application -> Application

public class Application implements IPlatformRunnable {public Object run(Object args) throws Exception {

Display display = PlatformUI.createDisplay();...int returnCode =

PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());}

} Cria um display e inicia um Workbench Eclipse, que ficará em loop manuseando eventos. O loop só é encerrado quando a última janela é fechada.

Precisa implementar

Workbench Advisor

• Diz ao Workbench como se comportar– O que desenhar– Como desenhar

public String getInitialWindowPerspectiveId() {return PERSPECTIVE_ID;

}

Informa a perspectiva inicial que será mostrada

Perspective

A classe precisa implementar IPerspectiveFactory

WorkbenchWindowAdvisor

• Toda janela da aplicação tem um advisor que é consultado durante vários pontos do ciclo de vida dela;

public void preWindowOpen() {IWorkbenchWindowConfigurer configurer = getWindowConfigurer();configurer.setInitialSize(new Point(250, 300));configurer.setShowCoolBar(false);configurer.setShowStatusLine(false);configurer.setTitle("Hyperbola");

}

ActionBarAdvisor• Cria e posiciona ações no MenuBar da janela;• É instanciado no WorkbenchWindowAdvisor;

public class ApplicationActionBarAdvisor extends ActionBarAdvisor {...

protected void makeActions(IWorkbenchWindow window) { } protected void fillMenuBar(IMenuManager menuBar) { }

...}

Criando uma aplicação

Hello RCP

Hello RCP

Save and Restorepublic class ApplicationWorkbenchAdvisor extends

WorkbenchAdvisor {...@Overridepublic void initialize(IWorkbenchConfigurer configurer) {

configurer.setSaveAndRestore(true);}...

}

O método inicialize marca o início de ciclo de vida do advisor.

Adicionando uma View

Adicionando uma View

Adicionando uma View

Adicionando uma View

public class ContactsView extends ViewPart { public static final String ID = "org.eclipsercp.hyperbola.views.contacts";}

Adicionando uma Viewpublic class Perspective implements IPerspectiveFactory {

...public void createInitialLayout(IPageLayout layout){

layout.setEditorAreaVisible(false);layout.addView(ContactsView.ID,

IPageLayout.LEFT, 1.0f, layout.getEditorArea());

}...

}

View adicionada! :D

Mas e se...

Nada acontecer?

Save and Restore, lembra?

Somente uma view...

Pra que tab?

public class Perspective implements IPerspectiveFactory { ... public void createInitialLayout(IPageLayout layout) { layout.setEditorAreaVisible(false); layout.addStandaloneView(ContactsView.ID, false, IPageLayout.LEFT, 1.0f, layout.getEditorArea()); } ...}

Adicionando Menus e ToolBarpublic void

ApplicationWorkbenchWindowAdvisor.preWindowOpen() {

...configurer.setShowMenuBar(true);configurer.setShowCoolBar(true);...

}

Criando açõesprotected void

ApplicationActionBarAdvisor.makeActions(IWorkbenchWindow window) {

exitAction = ActionFactory.QUIT.create(window);register(exitAction);aboutAction = ActionFactory.ABOUT.create(window);register(aboutAction);

}

Na seqüência de chamada do ActionBarAdvisor, o makeActions() é chamado antes do fillMenuBar(), o que permite que uma mesma

ação seja colocada em vários locais diferentes.

Populando o MenuBarprotected void

ApplicationActionBarAdvisor.fillMenuBar(IMenuManager menuBar)

{MenuManager hyperbolaMenu = new MenuManager("&Hyperbola", "hyperbola");hyperbolaMenu.add(exitAction);MenuManager helpMenu = new MenuManager("&Help",

"help");helpMenu.add(aboutAction);menuBar.add(hyperbolaMenu);menuBar.add(helpMenu);

}

Resultado

Adicionando actions à ToolBarpublic class AddContactAction extends Action implements

ISelectionListener, ActionFactory.IWorkbenchAction {...public void run() {AddContactDialog d = new AddContactDialog(window.getShell());int code = d.open();if (code == Window.OK) {Object item = selection.getFirstElement();ContactsGroup group = (ContactsGroup) item;ContactsEntry entry = new ContactsEntry(group, d.getUserId(), d.getNickname(), d.getServer());group.addEntry(entry);}}...

}

Adicionando actions à ToolBarprotected void makeActions(IWorkbenchWindow window){

...addContactAction = new AddContactAction(window);register(addContactAction);...

}

Adicionando actions à ToolBarprotected void fillCoolBar(ICoolBarManager coolBar) {

IToolBarManager toolbar = new ToolBarManager(coolBar.getStyle());

coolBar.add(toolbar);toolbar.add(addContactAction);

}

Reusando um actionprotected void fillMenuBar(IMenuManager menuBar) {

...hyperbolaMenu.add(addContactAction);...

}

Uma mesma ação pode ser colocada em vários locais diferentes.

Adicionando barra de status

public void preWindowOpen() {...configurer.setShowStatusLine(true);...

}

Adicionando barra de statuspublic void postWindowOpen() {...

statusImage = AbstractUIPlugin.imageDescriptorFromPlugin(

"org.eclipsercp.hyperbola", IImageKeys.ONLINE).createImage();IStatusLineManager statusline = getWindowConfigurer().getActionBarConfigurer().

getStatusLineManager();statusline.setMessage(statusImage, "Online");

}public void dispose() {statusImage.dispose();}

Barra de status• IStatusLineManagers: Manager específico para

barra de status– setMessage(Image, String);– setErrorMessage(Image, String);– getProgressMonitor;

• Esses métodos só podem ser chamados após a criação dos controles da barra de status. Uma vez que ActionBarAdvisor.fillStatusLine() é chamado antes da criação da barra de status, esses métodos não podem ser usados nele;

• Um bom local para efetuar essas chamadas é WorkbenchWindowAdvisor.postWindowOpen()

Integração com a bandeja do sistema (system tray)

public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {...private TrayItem initTaskItem(IWorkbenchWindow window) {final Tray tray = window.getShell().getDisplay().getSystemTray();if (tray == null)return null;trayItem = new TrayItem(tray, SWT.NONE);trayImage = AbstractUIPlugin.imageDescriptorFromPlugin(

"org.eclipsercp.hyperbola", IImageKeys.ONLINE).createImage();trayItem.setImage(trayImage);trayItem.setToolTipText("Hyperbola");return trayItem;}...

}

O SO não dá suporte a system tray.

Adicionando funcionalidade ao tray item

public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {...public void postWindowOpen() {

…final IWorkbenchWindow window =

getWindowConfigurer().getWindow();trayItem = initTaskItem(window);if (trayItem != null) {

hookPopupMenu(window);hookMinimize(window);

}}

Adiciona listener ao popup.

Adiciona ação para minimizar.

Adicionando listener ao popup do menu

private void hookPopupMenu(final IWorkbenchWindow window) {// Add listener for menu pop-uptrayItem.addListener(SWT.MenuDetect, new Listener() {

public void handleEvent(Event event) {MenuManager trayMenu = new MenuManager();Menu menu =

trayMenu.createContextMenu(window.getShell());

actionBarAdvisor.fillTrayItem(trayMenu);menu.setVisible(true);

}});

}protected void ApplicationActionBarAdvisor.fillTrayItem(IMenuManager trayItem) {trayItem.add(aboutAction);trayItem.add(exitAction);}

Ação para maximizarprivate void hookMinimize(final IWorkbenchWindow window) {

window.getShell().addShellListener(new ShellAdapter() {public void shellIconified(ShellEvent e) {

window.getShell().setVisible(false);}

});trayItem.addListener(SWT.DefaultSelection, new Listener() {

public void handleEvent(Event event) {Shell shell = window.getShell();if (!shell.isVisible()) {

shell.setVisible(true);window.getShell().setMinimized(false);

}}

});}

Views e Editores

• Editores focam na função principal da aplicação;• Views provêem suporte a uma dada tarefa;• Editores são compartilhados por múltiplas

perspectivas em uma mesma janela;• Editores e views não podem ser misturados em

uma mesma pilha;• Views podem ser extraídas da janela do

Workbench;• Views podem ser mostradas sem título;

Adicionando um Editor

Adicionando um Editor

public class ChatEditor extends EditorPart {public static String ID =

"org.eclipsercp.hyperbola.editors.chat";}

Criando o produto

• Configurações do produto;• Splash screen;• Informações no About Dialog;• etc

Configuração do produtoFile -> New -> Other...

Configuração do produto

Especifica a aplicação e o nome que será mostrado na barra de título dela.

Program Launcher

Referências

• "Eclipse Rich Client Platform - Designing, Coding and Packaging Java Applications" by Jeff McAffer and Jean-Michel Lemieux.

• http://en.wikipedia.org/wiki/Rich_Client_Platform

• http://wiki.eclipse.org/images/d/d9/EclipseCon_RCP_Tutorial_2006.pdf

top related