...
...

Embedded Rich Client Platform (eRCP)

Развитие технологий вносит коррективы в планы по разработке продуктов. В данном случае хочется обратить внимание на недавно вышедший первый релиз платформы Embedded Rich Client Platform (eRCP).

Многие заметили, что требования по объему типового приложения на платформе Eclipse RCP составляют порядка 20-30 Мб, что порой неприемлемо для распространяемых через Internet простых приложений. Версия eRCP для мобильных приложений позволяет создавать существенно более компактные приложения. А единство архитектур и совместимость компонент позволяет создавать различные сборки одного и того же продукта как в виде компактной eRCP-версии, так и полнофункциональной версии на платформе Eclipse RCP. Использование новой технологии также позволяет выйти на стремительно развивающийся рынок программного обеспечения для мобильных устройств, что может стать существенным фактором в пользу применения симбиоза eRCP и Eclipse RCP при создании новых продуктов.


Рис. 1. Пример Windows Mobile 2003 версии Hello eRCP приложения


Рис. 2. Пример Windows Desktop версии Hello eRCP приложения

Пример 1. Простое приложение Hello eRCP из демонстрационного пакета

public class HelloApplication extends Plugin implements IPlatformRunnable {

public Object run(Object args) throws Exception {
ErcpHello.main(null);
return null;
}

public void start(BundleContext context) throws Exception {
super.start(context);
Debug.loadOptions(context);
}
}

public class ErcpHello {
private static final String MAIN = "ErcpHello.main()";
private static ResourceBundle resHello = ResourceBundle.getBundle("ercpHello");

public static void main (String [] args) {
if (Profile.PROFILE && Profile.STARTUP)
Profile.logEnter(MAIN);

try {
Display display = Display.getDefault();
Shell shell = new ErcpHello().open (display);

if (Profile.PROFILE && (Profile.STARTUP || Profile.BENCHMARK))
Profile.logTime(MAIN, "application started");
else
System.out.println("eRCPHello started");

if (!Debug.DEBUG || !Debug.BENCHMARK_ONLY) {
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
}
display.dispose ();
} finally {
if (Profile.PROFILE && Profile.STARTUP)
Profile.logExit(MAIN);
}
}

public Shell open (Display display) {
final Color blue = display.getSystemColor(SWT.COLOR_BLUE);
final Shell shell = new Shell (display, SWT.CLOSE);

Rectangle r0 = shell.getBounds();
shell.setBounds(r0.x, r0.y, r0.height>500?240:r0.width, r0.height>500?294:r0.height);
InputStream is = getClass().getResourceAsStream("EclipseBannerPic.png");
ImageData bannerImage = (is != null) ? new ImageData(is) : null;
Label banner = new Label(shell, SWT.NONE);
banner.setBounds(shell.getClientArea());
banner.setImage(new Image(display, bannerImage));
banner.pack();
Rectangle r1 = shell.getClientArea();
Rectangle r2 = banner.getBounds();
banner.setLocation((r1.width-r2.width)/2, (r1.height-r2.height)/2);

shell.addShellListener( new ShellListener() {
public void shellActivated(ShellEvent arg0) {
}
public void shellClosed(ShellEvent arg0) {
}
public void shellDeactivated(ShellEvent arg0) {
}
public void shellDeiconified(ShellEvent arg0) {
}
public void shellIconified(ShellEvent arg0) {
shell.close();
}
});
shell.addPaintListener(new PaintListener () {
public void paintControl(PaintEvent event){
GC gc = event.gc;
gc.setForeground(blue);
Rectangle rect = shell.getClientArea();
gc.drawRectangle(rect.x + 10, rect.y + 10, rect.width — 20, rect.height — 20);
gc.drawString(resHello.getString("Hello_world"), rect.x + 20, rect.y + 20);
}
});
shell.addDisposeListener (new DisposeListener () {
public void widgetDisposed (DisposeEvent e) {
blue.dispose();
}
});
shell.setText(resHello.getString("Hello_title"));
Menu menuBar = new Menu(shell, SWT.BAR);
shell.setMenuBar(menuBar);
MenuItem item = new MenuItem(menuBar, SWT.CASCADE);
item.setText(resHello.getString("File"));
Menu menu = new Menu(shell, SWT.DROP_DOWN);
item.setMenu(menu);
MenuItem subItem = new MenuItem(menu, SWT.NULL);
subItem.setText(resHello.getString("Exit"));
subItem.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent arg0) {
shell.close();
}
public void widgetDefaultSelected(SelectionEvent arg0) {
}
});
shell.open ();
return shell;
}
}

Как видно из примера, программа аналогична варианту SWT-приложения, только добавлена дополнительная проверка на размеры экрана. Цель проекта eRCP состоит в создании аналога Eclipse Rich Client Platform (RCP) для мобильных устройств. Это версия платформы eclipse RCP для мобильных устройств, которая основана на той же модели, что и фреймуорк eclipse RCP. Размер библиотек был специально оптимизирован и ужат для того, чтобы поместиться в ограниченной по объему памяти мобильных устройств. Компоненты ядра были переработаны для того, чтобы получить возможность запускать приложения на J2ME виртуальной машине и для обеспечения совместимости между различными мобильными устройствами на разных платформах и при различном разрешении экрана.

Рис. 3. Пример компоненты выбора даты в Windows Desktop версии eRCP

Мы получаем возможность создавать расширяемые приложения для мобильных устройств, при этом достигается максимальная абстракция по выбору конкретного типа таких устройств. Кроме того, данные приложения могут быть сконфигурированы и легко расширяемы для работы в десктопных версиях. Т.е. мы получаем возможность создавать одни и те же приложения с упрощенным eRCP-интерфейсом и полнофункциональным eclipse RCP интерфейсом. А так как в основе работы с графическим интерфейсом лежит библиотека eSWT, то приложения получаются в "родном", привычном стиле для данного типа устройств. Приложения могут создаваться не только по аналогии eclipse RCP с предопределенным механизмом загрузки модулей и структуры программы, но и в виде отдельно стоящих приложений, т.е. приложений, построенных на основе компонент библиотеки eSWT, за счет чего можно еще больше ужать размер конечного продукта.

Рис. 4. Пример компонент отображения таблиц и деревьев в Windows Desktop версии eRCP

Приложения и сервисы запускаются в одной и той же виртуальной java-машине, при этом требуется меньше ресурсов, чем при работе в разных экземплярах виртуальных java-машин. Это также позволяет разделять ресурсы сервисов. Для работы с XML был разработан компактный MicroXML-парсер с поддержкой DOM и SAX. Данная библиотека уместилась в пакет порядка 100 Кб. В состав дистрибутивов входят примеры простых демонстрационных приложений. При этом полный дистрибутив eRCP-приложения для платформы Windows может составить меньше 4 Мб, а при использовании только eSWT можно вложиться и в 1 Мб, что делает ее привлекательной для написания компактных утилит, требующих графического интерфейса пользователя.

Архитектура мобильных приложений



Поддерживаемые платформы

. Windows Mobile 2003/2005
. Windows Desktop
. Nokia Series 60/80
. QTe

Рекомендуемые ресурсы:

Сайт экспериментального RCP-проекта File Arranger: сайт
Сайт проекта eRCP: сайт
Подписка на рассылку проекта eRCP: сайт
Интервью Frank Sommers c Asko Komsi (представителем Nokia) о будущем java для мобильных устройств: сайт

Сергей Бердачук,
сайт



© Компьютерная газета

полезные ссылки
Оффшорные банковские счета