Руководство Eclipse RCP 4 для начинающих - e4 Workbench Application

1- Введение

This document is based on:
  • Eclipse 4.5 (MARS)

  • Eclipse e4 RCP  (RCP 4)

2- Установка перед тем, как начать

2.1- Установка WindowBuilder

Установить Plugin  WindowBuilder, это плагин, который позволяет вам делать дизайн интерфейса приложения SWT с помощью перетаскивания, очень удобно. Смотрите инструкцию установки по сслыке:

2.2- Установка e4 Tools Developer Sources

Вы можете увидеть инструкцию установки по адресу:
  • TODO Link!

3- Создать новый Java Workspace

Для программирования приложения RCP вам нужно создать новый  Java Workspace
  • File/Switch Workspace/Other..
Введите:
  • F:\ECLIPSE_TUTORIAL\RCP

4- Создать пустой Eclipse 4 RCP Project

В этой статье я покажу вам, как построить RCP приложение с самого начала (Не следуя готовому шаблону), так что я создам пустое приложение Eclipse RCP.
На Eclipse выберите:
  • File/New/Other...
  1. Нажмите выбрать в регионе (1)
  2. В регионе(2) выберите "Yes" чтобы Eclipse создал RCP Project  (Работающий на Desktop), в противном случае он будет создавать RAP Project (работающий на Web).
Выберите "Eclipse 4 RCP Application"
Введите:
  • Java package name: org.o7planning.tutorial.rcp
Проект создан:

Запустите приложение для теста:

Щелкните правой кнопкой мыши на  EclipseRCPTutorial.product выберите Run As / Eclipse, Application

5- Структура пустого приложения Eclipse 4 RCP

Пусток приложение Eclipse 4 RCP создано с помощью  Eclipse, посмотрите его структуру. Откройте файл Application.e4xmi:
Измените название приложения на " Eclipse RCP Application E4", как показано ниже.
И повторно запустите приложение:

6- Handler и Command

RCP Framework имете много готовых команд, например 4  команды со следующими ID:

1. org.eclipse.ui.file.exit
  • Команда Выход из приложения
2.org.eclipse.ui.file.open
  • Команда открыть файл.
3.org.eclipse.ui.file.save
  • Команда save editor
4.org.eclipse.ui.help.aboutAction
  • Команда открыть окно About

Вы можете просмотреть список  command разработанные в RCP Framework по ссылке:

Создание новой команды с названием  quiteCommand, вызывает команду выхода из приложения построенная наготове в  RCP Framework.
Индентично мы создаем 3 другие Command:
Команда вызова editor открытия файла выбрана.
  • ID: org.eclipse.ui.file.open
  • Name: openCommand
Выполните команду save (сохранить) содержимое на Editor
  • ID: org.eclipse.ui.file.save
  • Name: saveCommand
AboutCommand:
  • ID: org.eclipse.ui.help.aboutAction
  • Name: aboutCommand
Handler является классом обработки команд (command) из меню или Toolbar. При нажатии на MenuItem или Toolltem означает выполнить команду, до того, как будет выполнена команда, Handler будет выполнена раньше, вы можете отменить (cancel) выполнение команды в Handler.

Handler это классы, которые при выполнении будут выполнять задания записанные в методе аннотированные с помощью  @Execute.

Я создам 4 класса Handler:
AboutHandler.java
package org.o7planning.tutorial.rcp.handler;

import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Shell;

public class AboutHandler {
   
   @Execute
   public void execute(Shell shell) {
       MessageDialog.openInformation(shell, "About", "Eclipse 4 RCP Application");
   }
}
OpenHandler.java
package org.o7planning.tutorial.rcp.handler;

import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;

public class OpenHandler {

   @Execute
   public void execute(Shell shell){
       FileDialog dialog = new FileDialog(shell);
       dialog.open();
   }
}
QuitHandler.java
package org.o7planning.tutorial.rcp.handler;

import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.ui.workbench.IWorkbench;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Shell;


public class QuitHandler {
   @Execute
   public void execute(IWorkbench workbench, Shell shell){
       if (MessageDialog.openConfirm(shell, "Confirmation",
               "Do you want to exit?")) {
           workbench.close();
       }
   }
}
SaveHandler.java
package org.o7planning.tutorial.rcp.handler;

import org.eclipse.e4.core.di.annotations.CanExecute;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.ui.workbench.modeling.EPartService;

public class SaveHandler {

   @CanExecute
   public boolean canExecute(EPartService partService) {
       if (partService != null) {
           return !partService.getDirtyParts().isEmpty();
       }
       return false;
   }

   @Execute
   public void execute(EPartService partService) {
       partService.saveAll(false);
   }
}

Объявить классы Handler c приложением

Чтобы объявить Handler  с Application вы должны объявить ID, Handler class и Command.

Например, пользователь закрывает приложение нажимая на click menuItem Exit, этот menuItem, связанный с quiteCommand, QuiteHandler является классом обрабатывающий для этой команды (как заявлено выше), класс QuiteHandler спросит пользователя действительно ли хочет закрыть приложение, если да, будет выполняться команда  quiteCommand.
Объявление других Handler индентично.

7- Обхявить Menus

Создавать главное меню (Main menu) приложения
Введите ID главного меню, обязательно должен быть: menu: org.eclipse.ui.main.menu
Добавьте 3 подменю:
  • File, Function, Help
Объявить подменю для меню File.
  • Open
  • Save
  • Exit
Вы можете перезапустить ваше приложение:

8- Создать Toolbar

Создание Main Toolbar с ID:
  • ID: toolbar:org.eclipse.ui.main.toolbar
Добавить 2 Toolitem: open и save
Перезапустите ваше приложение:

9- Part

SamplePart.java
/*******************************************************************************
 * Copyright (c) 2010 - 2013 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Lars Vogel <[email protected]> - Bug 419770
 *******************************************************************************/
package org.o7planning.tutorial.rcp.part;

import javax.annotation.PostConstruct;
import javax.inject.Inject;

import org.eclipse.e4.ui.di.Focus;
import org.eclipse.e4.ui.di.Persist;
import org.eclipse.e4.ui.model.application.ui.MDirtyable;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;

public class SamplePart {

    private Text txtInput;
    private TableViewer tableViewer;

    @Inject
    private MDirtyable dirty;

    @PostConstruct
    public void createComposite(Composite parent) {
        parent.setLayout(new GridLayout(1, false));

        txtInput = new Text(parent, SWT.BORDER);
        txtInput.setMessage("Enter text to mark part as dirty");
        txtInput.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                dirty.setDirty(true);
            }
        });
        txtInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        tableViewer = new TableViewer(parent);

        tableViewer.add("Sample item 1");
        tableViewer.add("Sample item 2");
        tableViewer.add("Sample item 3");
        tableViewer.add("Sample item 4");
        tableViewer.add("Sample item 5");
        tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
    }

    @Focus
    public void setFocus() {
        tableViewer.getTable().setFocus();
    }

    @Persist
    public void save() {
        dirty.setDirty(false);
    }
}
Добавить новый PerspectiveStack. Это стек (Stack) содержащий виды (Perspective)
Добавить новые виды (Perspective)
Перезапустите приложение:
Изменения на Рart могут сделать кнопку  SAVE светящейся.