Eclipse RCP Felype Santiago. Rich Client Um RCP é um software que consiste dos seguintes...
-
Upload
fabio-angelim-bugalho -
Category
Documents
-
view
217 -
download
4
Transcript of Eclipse RCP Felype Santiago. Rich Client Um RCP é um software que consiste dos seguintes...
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