Hướng dẫn lập trình Eclipse RAP cho người mới bắt đầu - Ứng dụng Workbench (trước e4)
Xem thêm các chuyên mục:

Là một website được viết trên công nghệ web Flutter vì vậy hỗ trợ rất tốt cho người học, kể cả những người học khó tính nhất.
Hiện tại website đang tiếp tục được cập nhập nội dung cho phong phú và đầy đủ hơn. Mong các bạn nghé thăm và ủng hộ website mới của chúng tôi.


- Eclipse 4.4 (LUNA)
- RAP 2.3
- OLD Model of Workbench (Earlier E4)
- 30-08-2014: First version
Tài liệu này hướng dẫn bạn lập trình ứng dụng RAP Workbench, sử dụng mô hình Workbench cũ. Mô hình hiện tại là e4 Workbench. Hai mô hình này khác hẳn nhau về mặt API, mô hình mới e4 là đơn giản hơn trong lập trình và có tính năng nổi trội hơn hẳn mô hình cũ.
Bạn có thể xem tài liệu hướng dẫn lập trình ứng dụng RAP e4 Workbench tại:

Xem hướng dẫn cài đặt tại:
Bạn có thể xem một ví dụ Demo trực tuyến tại: Hoặc các Demo trực tuyến khác liên quan tới RAP tại:Bạn có thể xem hướng dẫn lập trình ứng dụng RCP Workbench (Chạy trên Desktop) tại đây:


Trên Eclipse chọn: File/Switch Workspace/Other...




- Check chọn trên (1)
- Trên vùng (2) chọn "No" để Eclipse tạo ra RAP Project (Chạy trên Web) , ngược lại nó sẽ tạo ra RCP Project (Chạy trên Desktop).

- RAP Hello World: Tạo ra một mẫu ứng dụng RAP nhưng là cơ bản (Basic Application)
- RAP Mail Template: Tạo ra một ứng dụng RAP Workbench quản lý email, nhưng code tạo ra nhiều, không thuộc mục đích của chúng ta.

Thực tế cái Project vừa được tạo ra đang khai báo sử dụng các Bundle của RCP không phải của RAP. Hình minh họa dưới cho thấy điều đó.






- http://download.eclipse.org/rt/rap/2.3






- org.eclipse.rap.ui



- Application
- ApplicationActionBarAdvisor
- ApplicationWorkbenchAdvisor
- ApplicationWorkbenchWindowAdvisor
- Perspective

package org.o7planning.tutorial.rapwb;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
public class Application implements IApplication {
public Object start(IApplicationContext context) throws Exception {
Display display = PlatformUI.createDisplay();
try {
int returnCode = PlatformUI.createAndRunWorkbench(display,
new ApplicationWorkbenchAdvisor());
if (returnCode == PlatformUI.RETURN_RESTART)
return IApplication.EXIT_RESTART;
else
return IApplication.EXIT_OK;
} finally {
display.dispose();
}
}
public void stop() {
if (!PlatformUI.isWorkbenchRunning())
return;
final IWorkbench workbench = PlatformUI.getWorkbench();
final Display display = workbench.getDisplay();
display.syncExec(new Runnable() {
public void run() {
if (!display.isDisposed())
workbench.close();
}
});
}
}
package org.o7planning.tutorial.rapwb;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
super(configurer);
}
protected void makeActions(IWorkbenchWindow window) {
}
protected void fillMenuBar(IMenuManager menuBar) {
}
}
package org.o7planning.tutorial.rapwb;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchAdvisor;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;
public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
private static final String PERSPECTIVE_ID = "RAPWorkbenchTutorial.perspective"; //$NON-NLS-1$
public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
return new ApplicationWorkbenchWindowAdvisor(configurer);
}
public String getInitialWindowPerspectiveId() {
return PERSPECTIVE_ID;
}
}
package org.o7planning.tutorial.rapwb;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;
public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
super(configurer);
}
public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
return new ApplicationActionBarAdvisor(configurer);
}
public void preWindowOpen() {
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
configurer.setInitialSize(new Point(400, 300));
// Show MenuBar
configurer.setShowMenuBar(true);
// Show CoolBar.
configurer.setShowCoolBar(true);
// Show Status Line.
configurer.setShowStatusLine(true);
// Show PerspectiveBar
configurer.setShowPerspectiveBar(true);
// Show FastViewBars
configurer.setShowFastViewBars(true);
// Show ProgressIndicator
configurer.setShowProgressIndicator(true);
configurer.setTitle("Hello RAP Workbench"); //$NON-NLS-1$
}
}
package org.o7planning.tutorial.rapwb;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveFactory;
public class Perspective implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout) {
}
}



- org.o7planning.tutorial.rapwb.Application



- id: RAPWorkbenchTutorial.perspective
- name: Default Perspective
- class: org.o7planning.tutorial.rapwb.Perspective

- Ứng dụng RAP sẽ chạy bắt đầu từ một "Entry Point". Một ứng dụng RAP có một hoặc nhiều EntryPoint.
- http://host:port/contextPath/hello




<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
id="id1"
point="org.eclipse.core.runtime.applications">
<application
cardinality="singleton-global"
thread="main"
visible="true">
<run
class="org.o7planning.tutorial.rapwb.Application">
</run>
</application>
</extension>
<extension
point="org.eclipse.ui.perspectives">
<perspective
class="org.o7planning.tutorial.rapwb.Perspective"
id="RAPWorkbenchTutorial.perspective"
name="Default Perspective">
</perspective>
</extension>
<extension
point="org.eclipse.rap.ui.entrypoint">
<entrypoint
applicationId="RAPWorkbenchTutorial.id1"
id="entryPoint1"
path="/hello">
</entrypoint>
</extension>
</plugin>

- org.apache.felix.gogo.command
- org.apache.felix.gogo.runtime
- org.apache.felix.gogo.shell
- org.eclipse.equinox.console
- org.eclipse.equinox.http.jetty
- org.eclipse.equinox.ds
- org.eclipse.rap.rwt.osgi



- Chọn "External web browser" để cấu hình ứng dụng chạy trên trình duyệt bên ngoài.
- Nhấn vào Configure Browser để chọn trình duyệt trên hệ thống "Firefox" hoặc "Chrome".
- Chọn cổng để chạy
- Click Apply

- Check Chọn RAPWorkbenchTutorial
- Bỏ check chọn Target Platform.
- Nhấn vào "Add Required Bundles" để hệ thống tự tính toán các plugin phụ thuộc nhỏ nhất.
- Nhấn Apply.
- Nhấn Run để chạy ứng dụng.



- org.eclipse.rap.design.example



- org.eclipse.rap.design.example.business.theme
- org.eclipse.rap.design.example.fancy.theme



<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
id="id1"
point="org.eclipse.core.runtime.applications">
<application
cardinality="singleton-global"
thread="main"
visible="true">
<run
class="org.o7planning.tutorial.rapwb.Application">
</run>
</application>
</extension>
<extension
point="org.eclipse.ui.perspectives">
<perspective
class="org.o7planning.tutorial.rapwb.Perspective"
id="RAPWorkbenchTutorial.perspective"
name="Default Perspective">
</perspective>
</extension>
<extension
point="org.eclipse.rap.ui.entrypoint">
<entrypoint
applicationId="RAPWorkbenchTutorial.id1"
brandingId="myBranding"
id="entryPoint1"
path="/hello">
</entrypoint>
</extension>
<extension
point="org.eclipse.rap.ui.branding">
<branding
favicon="favicon.png"
id="myBranding"
themeId="org.eclipse.rap.design.example.fancy.theme"
title="Fancy Theme">
</branding>
</extension>
</plugin>



- Mở file
- Thoát khỏi ứng dụng
- Mở AboutDialog
- ....
package org.o7planning.tutorial.rapwb.dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
public class AboutDialog extends Dialog {
private static final long serialVersionUID = -1969407778775319986L;
protected Object result;
protected Shell shlAbout;
/**
* Create the dialog.
* @param parent
* @param style
*/
public AboutDialog(Shell parent, int style) {
super(parent, style);
setText("SWT Dialog");
}
/**
* Open the dialog.
* @return the result
*/
public Object open() {
createContents();
shlAbout.open();
shlAbout.layout();
Display display = getParent().getDisplay();
while (!shlAbout.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
return result;
}
/**
* Create contents of the dialog.
*/
private void createContents() {
shlAbout = new Shell(getParent(), getStyle());
shlAbout.setSize(418, 145);
shlAbout.setText("About");
shlAbout.setLayout(new GridLayout(1, false));
Label lblNewLabel = new Label(shlAbout, SWT.NONE);
lblNewLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true, 1, 1));
lblNewLabel.setText("RAP Workbench Tutorial");
}
}
- org.eclipse.ui.commands

Tiếp theo chúng ta sẽ tạo class Command có ID:
- org.o7planning.tutorial.rcp.cmd.about

- id: org.o7planning.tutorial.rapwb.cmd.about
- defaultHandler: org.o7planning.tutorial.rapwb.cmd.AboutCommand

- org.eclipse.core.commands.AbstractHandler.

package org.o7planning.tutorial.rapwb.cmd;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.handlers.HandlerUtil;
import org.o7planning.tutorial.rapwb.dialog.AboutDialog;
public class AboutCommand extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
Shell shell = HandlerUtil.getActiveWorkbenchWindow(event).getShell();
AboutDialog dialog = new AboutDialog(shell, SWT.DIALOG_TRIM
| SWT.APPLICATION_MODAL);
dialog.open();
return null;
}
}


- org.eclipse.ui.menus


- locationURI: menu:org.eclipse.ui.main.menu
menu:org.eclipse.ui.main.menu ==> là ID xác định vị trí của Menu, nó là một hằng số có sẵn của RCP workbench. Bạn cũng có thể tự tạo ra các locationURI để định nghĩa vị trí hiển thị MENU.




- org.eclipse.ui.file.exit


- org.o7planning.tutorial.rapwb.cmd.about
Class AboutCommand có ID: org.o7planning.tutorial.rapwb.cmd.about đã được tạo ở trước đây.





- locationURI: toolbar:org.eclipse.ui.main.toolbar
locationURI: Là ID xác định vị trí mà Toolbar sẽ được đặt vào. toolbar:org.eclipse.ui.main.toolbar là một ID đã được khai báo sẵn của RCP Platform. Bạn cũng có thể tạo ra các locationURI để định nghĩa vị trí nào đó.




- org.eclipse.ui.file.exit

- org.o7planning.tutorial.rapwb.cmd.about


- org.eclipse.ui.views


- id: org.o7planning.tutorial.rapwb.view.contact
- class: org.o7planning.tutorial.rapwb.view.ContactView



- name: Category
- id: org.o7planning.tutorial.rapwb.view.category
- class: org.o7planning.tutorial.rapwb.view.CategoryView
- icon: icons/category16.png
HistoryView
- name: History
- id: org.o7planning.tutorial.rapwb.view.history
- class: org.o7planning.tutorial.rapwb.view.HistoryView
- icon: icons/history16.png
TaskView
- name: Task
- id: org.o7planning.tutorial.rapwb.view.task
- class: org.o7planning.tutorial.rapwb.view.TaskView
- icon: icons/task16.png


- org.eclipse.ui.perspectiveExtensions









- org.eclipse.ui.editors

- id: org.o7planning.tutorial.rapwb.editor.user
- Name: UserEditor
- icon: icons/user16.png
- class: org.o7planning.tutorial.rapwb.editor.UserEditor



package org.o7planning.tutorial.rapwb.editor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IPersistableElement;
public class UserEditorInput implements IEditorInput {
@Override
public Object getAdapter(Class adapter) {
return null;
}
@Override
public boolean exists() {
return false;
}
@Override
public ImageDescriptor getImageDescriptor() {
return null;
}
@Override
public String getName() {
return "User Editor";
}
@Override
public IPersistableElement getPersistable() {
return null;
}
@Override
public String getToolTipText() {
return "User Editor";
}
}
package org.o7planning.tutorial.rapwb.editor;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;
public class UserEditor extends EditorPart {
public static final String ID="org.o7planning.tutorial.rapwb.editor.user";
public UserEditor() {
}
@Override
public void doSave(IProgressMonitor monitor) {
}
@Override
public void doSaveAs() {
}
/**
* Important!!!
*/
@Override
public void init(IEditorSite site, IEditorInput input)
throws PartInitException {
if (!(input instanceof UserEditorInput)) {
throw new PartInitException("Invalid Input: Must be "
+ UserEditorInput.class.getName());
}
setSite(site);
setInput(input);
}
@Override
public boolean isDirty() {
return false;
}
@Override
public boolean isSaveAsAllowed() {
return false;
}
@Override
public void createPartControl(Composite parent) {
// Add Code.
// Quan trọng:
// Nếu bạn muốn thiết kế với WindowBuilder.
// Trước hết bạn phải sửa code giống dưới đây:
// Rồi có thể mở với WindowBuilder.
parent.setLayout(new FillLayout());
Composite body= new Composite(parent,SWT.NONE);
}
@Override
public void setFocus() {
}
}


- id: org.o7planning.tutorial.rapwb.cmd.user
- name: Call UserEditor
- defaultHandler: org.o7planning.tutorial.rapwb.cmd.UserCommand

package org.o7planning.tutorial.rapwb.cmd;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.handlers.HandlerUtil;
import org.o7planning.tutorial.rapwb.editor.UserEditor;
import org.o7planning.tutorial.rapwb.editor.UserEditorInput;
public class UserCommand extends AbstractHandler {
public static final String ID = "org.o7planning.tutorial.rapwb.cmd.user";
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
IWorkbenchPage page = window.getActivePage();
UserEditorInput input = new UserEditorInput();
try {
page.openEditor(input, UserEditor.ID);
} catch (PartInitException e) {
System.out.println("Error:" + this.getClass().getName() + ":" + e);
e.printStackTrace();
throw new ExecutionException("Error open UserEditor");
}
return null;
}
}

