close

Вход

Забыли?

вход по аккаунту

...систем программирования интегрированных в среду Eclipse

код для вставкиСкачать
Разработка объектно-ориентированных
систем программирования
интегрированных в среду Eclipse
1. Расширение среды Eclipse
Владимир Юрьевич Романов,
Московский Государственный Университет им. М.В.Ломоносова
Факультет Вычислительной Математики и Кибернетики
[email protected],
[email protected]
Структура курса
1. Расширение среды Eclipse
2. Разработка распознавателей ЯП
3. Использование Graphical Editing
Framework
4. Использование метамодели языка UML
2.0
5. Использование промежуточного
представления компилятора
6. Генерация кода виртуальной машины
Java
Расширение среды Eclipse
Архитектура среды разработки Eclipse
фирмы IBM.
Технология расширения среды Eclipse.
Расширение существующих и создание
новых видов, редакторов и перспектив
в среде Eclipse.
Особенности интеграции систем
моделирования в среду Eclipse.
Разработка распознавателей
языков программирования (1)
Разработка распознавателей объектноориентированных языков программирования.
Спецификация грамматик языков
программирования. Разрешение конфликтов
при спецификации грамматик.
Разработка распознавателей
языков программирования (2)
Описание атрибутных грамматик с помощью
генератора компиляторов CocoR.
Использование атрибутных грамматик для
описания синтаксиса языка Java.
Интеграция генератора компиляторов CocoR в
среду Eclipse.
Использование Graphical Editing
Framework
Использование Graphical Editing Framework
(GMF) – базового инструмента для
построения графического интерфейса систем
моделирования.
Основные элементы, используемые для
построения графического интерфейса.
Инструментарий для разработки
редакторов.
графических
Использование метамодели
языка UML 2.0
Использование реализованной фирмой IBM
метамодели языка UML 2.0.
Взаимосвязь реализации UML и EMF.
Средства языка UML для визуализации
структуры и поведения программных систем.
Средства графической нотации языка UML для
визуализации UML-модели.
Использование промежуточного
представления компилятора
Построение классов промежуточного
представления компилятора средствами
построения моделей среды Eclipse.
Интеграция промежуточного представления
компилятора в среду Eclipse.
Компиляция программы в промежуточное
представление компилятора.
Генерация кода виртуальной машины
Java
Система команд и структура программного
код виртуальной машины Java.
Генерация кода виртуальной машины Java с
помощью пакета Byte Code Engineering
Library.
Интеграция сгенерированного кода
виртуальной машины Java в среду Eclipse.
Требования к платформе Eclipse (2)
Облегчить бесшовную интеграцию документов
различного типа и и разработанных разными
провайдерами
Выполняться на различных операционных
системах, включая Windows, Linux, Mac OS
X, Solaris AIX, и HP-UX.
Eclipse Software Development Kit
Eclipse Platform
Небольшое ядро (core) и набор
подключаемых модулей
Java Development Tools (JDT)
инструментарий для программирования на
Java
Plug-in Development Environment (PDE)
среда разработки подключаемых модулей
Архитектура платформы Eclipse
Архитектура платформы Eclipse
Архитектура платформы Eclipse
Архитектура JDT (1)
Архитектура JDT (2)
Архитектура ядра Eclipse.
Подключаемые модули
Подключаемый модуль (plug-in) –
наименьшая единица функциональности
платформы Eclipse, которая может быть
разработана и поставлена отдельно
Вся функциональность Eclipse реализована
как подключаемые модули, за исключением
небольшого ядра
платформы (Platform Runtime )
Архитектура ядра Eclipse.
Структура подключаемых модулей
Модуль – расположен в отдельной директории,
содержащей:
Java Archive (файл c расширением *.jar), содержащим
кодом для JVM и тексты на языке Java
Файлы манифеста:
plugin.xml – содержит описание точек расширения и расширения
для расширений из других модулей
manifest.mf – содержит зависимости периода выполнения
Файлы – ресурсы
изображения
каталоги сообщений
HTML – страницы для выдачи помощи
Группа связанных модулей называется
возможностью (feature) и располагаются в
отдельной директории
Архитектура ядра Eclipse.
Точки расширения модулей
Файл манифест модуля описывает взаимосвязь модуля с
другими модулями
Объявление неограниченного количества точек расширения
Объявление неограниченного количества расширений,
использующих точки расширения из других модулей
Пример – минимальный файл-манифест:
<?xml version="1.0" encoding="UTF-8" ?>
<plugin
name="JUnit Testing Framework"
id="org.junit"
version="3.7"
provider-name="Eclipse.org">
<runtime>
<library name="junit.jar">
<export name="*"/>
</library>
</runtime>
</plugin>
Архитектура ядра Eclipse.
Использование точек расширения
Информация в файлах-манифестах о точках
расширения и расширениях модулей
используется при инициализации Eclipse
Runtime для создания регистра модулей
Информация о модулях известна без их
загрузки и активации
Модули загружаются только тогда, когда
выполнение их кода действительно
необходимо (ленивая загрузка)
Разработка
простейшей точки расширения.
Без использования инструмента
Plugin Development Environment
Разработка простейшей точки расширения.
Атрибуты подключаемого модуля
Назначение подключаемого модуля
Модуль представлен кнопкой в панели инструментов workbench
При нажатии на кнопку выдает окно с сообщением Hello World
Атрибуты подключаемого модуля
Имя
Идентификатор
Имя провайдера
Версию
Список других требуемых подключаемых модулей
org.eclipse.ui.actionSets
Спецификацию для периода выполнения
Разработка простейшей точки расширения.
Создание Java проекта
Разработка простейшей точки расширения.
Именование проекта
Разработка простейшей точки расширения.
Создание файла-манифеста plugin.xml (1)
Разработка простейшей точки расширения.
Создание файла-манифеста plugin.xml (2)
Файлманифест
Файл-манифест
Разработка простейшей точки расширения.
Структура файла-манифеста plugin.xml (1)
<?xml version="1.0" ?>
Должен быть уникален
<plugin
name="Eclipse Hello World Example"
id="org.eclipse.examples.helloworld"
version="0.0.1"
От каких модулей зависит
provider-name="MSU" >
<requires>
<import plugin="org.eclipse.core.resources" />
<import plugin="org.eclipse.ui" />
В каком файле искать
</requires>
модули
<runtime>
<library name="helloworld.jar" />
</runtime>
<extension point = "org.eclipse.ui.actionSets" >
</extension>
</plugin>
Точка расширения actionSets
из модуля org.eclipse.ui.
Разработка простейшей точки расширения.
Структура файла-манифеста plugin.xml (2)
<extension point = "org.eclipse.ui.actionSets" >
Имя расширения для системы
<actionSet
id="org.eclipse.examples.helloworld.HelloWorldActionSet"
label="Hello World"
Имя для отображения
visible="true"
description="The action set for the Eclipse Hello World example">
<menu
id="org.eclipse.examples.helloworld.HelloWorldMenu"
label="Samples" >
<separator name="samples"/>
</menu>
<action
id="org.eclipse.examples.helloworld.actions.HelloWorldAction"
menubarPath="org.eclipse.examples.helloworld.HelloWorldMenu/samples"
toolbarPath="Normal"
Класс реализующий интерфейс
label="Hello World"
IWorkbenchWindowActionDelegate
tooltip="Press to see a message"
icon="icons/helloworld.gif"
class="org.eclipse.examples.helloworld.HelloWorldAction"/>
</extension>
Разработка простейшей точки расширения.
Подключение библиотеки модулей (1)
Разработка простейшей точки расширения.
Подключение библиотеки модулей (2)
Разработка простейшей точки расширения.
Создание пакета для реализации расширения
Разработка простейшей точки расширения.
Создание пакета для реализации расширения
Разработка простейшей точки расширения.
Создание класса для реализации расширения
package org.eclipse.examples.helloworld;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.widgets.Shell;
public class HelloWorldAction implements IWorkbenchWindowActionDelegate {
IWorkbenchWindow activeWindow = null;
public void run(IAction proxyAction) {
// proxyAction has UI information from manifest file (ignored)
Shell shell = activeWindow.getShell();
MessageDialog.openInformation(shell, "Hello World", "Hello World!");
}
public void selectionChanged(IAction proxyAction, ISelection selection) {}
public void init(IWorkbenchWindow window)
{ activeWindow = window; }
public void dispose() {}
}
Разработка
простейшей точки расширения.
C использованием инструмента
Plugin Development Environment
Разработка простейшей точки расширения.
Создание проекта с помощью PDE
Разработка простейшей точки расширения.
Задаем имя и свойства проекта
Разработка простейшей точки расширения.
Создание модуля по шаблону
Разработка простейшей точки расширения.
Выбор шаблонов для модуля
Разработка простейшей точки расширения.
Настройка точки расширения
Разработка простейшей точки расширения.
Сгенерированный с помощью PDE проект
Разработка простейшей точки расширения.
Редактор модуля PDE. Обзор
Кнопка запуска модуля
на исполнение
Разработка простейшей точки расширения.
Меню подключаемого модуля
Разработка простейшей точки расширения.
Запуск подключаемого модуля
Разработка простейшей точки расширения.
Редактор модуля PDE. XML представление
Разработка простейшей точки расширения.
Редактор модуля PDE. Зависимости (1)
Разработка простейшей точки расширения.
Редактор модуля PDE. Зависимости (2)
Секция зависимостей перечисляет все
модули, требуемые данным модулем:
Все модули, которые необходимы для
компиляции данного модуля
Все модули, точки расширения которых
использует данный модуль
Эта секция позволяет автоматизировать
указание месторасположения всех
подключаемых модулей используемых
данным модулем
Разработка простейшей точки расширения.
Редактор модуля PDE. Период выполнения
Разработка простейшей точки расширения.
Редактор модуля PDE. Расширения (1)
Разработка простейшей точки расширения.
Редактор модуля PDE. Расширения (2)
К платформе добавляется новая
функциональность добавлением расширения
Разработка простейшей точки расширения.
Редактор модуля PDE. Идентификатор, текст и
пиктограмма меню
Внутренний
идентификатор
меню
Текст для
пользователя
Пиктограмма меню
Разработка простейшей точки расширения.
Редактор модуля PDE. XML-текст для меню
Разработка простейшей точки расширения.
Редактор модуля PDE. Новый инструмент в панели
Меню для множества
Панель инструментов
действий
Разработка простейшей точки расширения.
Редактор модуля PDE. Пиктограмма инструмента
Пиктограмма
Разработка простейшей точки расширения.
Редактор модуля PDE. Создания класса для события
Гиперссылка на класс
в редакторе
Класс реализующий
действие
Разработка простейшей точки расширения.
Код класса для вывода сообщения
package eclipse_tools.handlers;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.jface.dialogs.MessageDialog;
/**
* Первый пример.
* @see org.eclipse.core.commands.IHandler
* @see org.eclipse.core.commands.AbstractHandler
*/
public class ToolHandler extends AbstractHandler {
public ToolHandler() {}
/**
* the command has been executed, so extract extract the needed information from the application context.
*/
public Object execute(ExecutionEvent event) throws ExecutionException {
IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
MessageDialog.openInformation(
window.getShell(),
"Eclipse_tools",
"Hello, Eclipse tools");
return null;
}
}
Просмотр исходного текста на Java
в среде Eclipse (обзор способов)
F3: Навигация для: типа, метода типа, поля типа
расположенного в редакторе под курсором
Ctrl+Shift+T: Открытие в редакторе любого типа из рабочего
пространства (workspace)
Ctrl+O: Открытие окна поиска со списком членов в текущем
окне редактора.
Ctrl+F3: Открытие окна поиска со списком членов для класса
под курсором.
Просмотр исходного текста на Java
в среде Eclipse (типы, методы и поля)
F3: Навигация для: типа, метода типа, поля типа
расположенного в редакторе под курсором
Просмотр исходного текста на Java
в среде Eclipse (типы рабочего пространства)
Ctrl+Shift+T: Открытие в редакторе любого типа из рабочего
пространства (workspace)
Просмотр исходного текста на Java
в среде Eclipse (типы в редакторе)
Ctrl+O: Открытие окна поиска со списком членов в текущем
окне редактора.
Просмотр исходного текста на Java
в среде Eclipse (члены типа под курсором)
Ctrl+F3: Открытие окна поиска со списком членов для типа
под курсором.
Написание исходного текста на Java
в среде Eclipse с помощью ассистента (1)
Ctrl+Space: Завершение имен типов, методов переменных
Разработка простейшего вида
(Eclipse View)
Разработка простейшего вида.
Редактор модуля PDE. Добавление нового вида
Кнопка добавления
новой точки расширения
Добавление
нового вида
Разработка простейшего вида.
Редактор модуля PDE. Создание категории вида
Разработка простейшего вида.
Редактор модуля PDE. Задание имени категории
Разработка простейшего вида.
Редактор модуля PDE. Создание вида
Разработка простейшего вида.
Редактор модуля PDE. Точки расширения
Разработка простейшего вида.
Изображение пустого вида UML Metrics
Разработка простейшего вида.
Код для вывода содержимого вида
package eclipse_tools;
import
import
import
import
org.eclipse.swt.SWT;
org.eclipse.swt.widgets.Composite;
org.eclipse.swt.widgets.Label;
org.eclipse.ui.part.ViewPart;
public class UMLMetrics extends ViewPart {
Добавление
кода для вывода
текстового содержимого вида
private Label content;
public UMLMetrics() {
// TODO Auto-generated constructor stub
}
@Override
public void createPartControl(Composite parent) {
content = new Label(parent, SWT.NONE);
content.setText("View for calculated metrics.");
}
@Override
public void setFocus() {
// TODO Auto-generated method stub
}
}
Разработка простейшего вида.
Редактор модуля PDE. Изображение вида
Разработка простейшей точки расширения.
Редактор модуля PDE. Тестирование модуля
Создание новых видов в среде Eclipse.
Типы видов в перспективе Java
Создание новых видов в среде Eclipse.
Пример нового вида
Создание новых видов в среде Eclipse.
Точки расширения вида
Создание новых видов в среде Eclipse.
Категория вида
Создание новых видов в среде Eclipse.
Описание вида в манифесте
Создание новых видов в среде Eclipse.
Расположение вида в категориях видов
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>
<extension
point="org.eclipse.ui.views">
<category
name="Sample Category"
id="SampleView">
</category>
<view
name="Sample View"
icon="icons/sample.gif"
category="SampleView"
class="sampleview.views.SampleView"
id="sampleview.views.SampleView">
</view>
</extension>
</plugin>
Создание новых видов в среде Eclipse.
Вхождение вида в перспективы
Создание новых видов в среде Eclipse.
Расположение вида в категориях видов
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>
<extension
point="org.eclipse.ui.perspectiveExtensions">
<perspectiveExtension
targetID="org.eclipse.ui.resourcePerspective">
<view
ratio="0.5"
relative="org.eclipse.ui.views.TaskList"
relationship="right"
id="sampleview.views.SampleView">
</view>
</perspectiveExtension>
</extension>
</plugin>
Создание новых видов в среде Eclipse.
Простейший вид на основе метки
package sampleview.views;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.part.*;
public class SampleView extends ViewPart {
private Label label;
public SampleView() {
super();
}
public void setFocus() {
label.setFocus();
}
public void createPartControl(Composite parent) {
label = new Label(parent, 0);
label.setText("Hello World");
}
}
Разработка приложения Eclipse
(Rich Client Application)
Архитектура платформы Eclipse.
Rich Client Platform.
Rich Client Platform (RCP)
Назначение платформы
Разработка приложения (RCA) которое может
функционировать независимо от Eclipse
Разработка приложений с использованием всех
достоинств платформы Eclipse
Возможность построить полноценное завершенное
приложение как множество подключаемых модулей
Ленивая загрузка подключаемых модулей
Использование библиотеки классов для построения
интерфейса пользователя
Создание RCA приложения в среде Eclipse.
Создание проекта
Создание RCA приложения в среде Eclipse.
Создание подключаемого модуля
Создание RCA приложения в среде Eclipse.
Именование приложения
Создание RCA приложения в среде Eclipse.
Задание опции – генерация RCP приложения
Задание RCP
приложения
Создание RCA приложения в среде Eclipse.
Выбор примера RCA с помощью wizard
Создание RCA приложения в среде Eclipse.
Выбор примера RCA с помощью wizard
Создание RCP приложения в среде Eclipse.
Приложение в Plugin Development Environment
Создание RCA приложения в среде Eclipse.
Представление простейшего RCA-приложения
Создание RCA приложения в среде Eclipse.
Структура приложения RCA
package simpleapplicationrcp;
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(); }
}
Создание RCA приложения.
Объект-стратегия WorkbenchAdvisor
preStartup()
postStartup()
preWindowOpen()
postWindowOpen()
postShutdown()
postShutedown()
fillActionBars()
getInitialPerspective()
Создание RCA приложения в среде
Eclipse. Настройка «верстака»
public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor{
private static final String PERSPECTIVE_ID =
"SimpleRCA.perspective";
public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
IWorkbenchWindowConfigurer configurer) {
return new ApplicationWorkbenchWindowAdvisor(configurer);
}
public String getInitialWindowPerspectiveId() {
return PERSPECTIVE_ID;
}
}
Создание RCA приложения в среде
Eclipse. Настройка окна приложения
public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor
{
public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer conf)
{ super(conf); }
public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer conf)
{ return new ApplicationActionBarAdvisor(conf); }
public void preWindowOpen() {
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
configurer.setInitialSize( new Point(400, 300) );
configurer.setShowCoolBar(false);
configurer.setShowStatusLine(true);
configurer.setShowPerspectiveBar(true);
configurer.setTitle("Diagram Editor");
}
}
Создание RCA приложения в среде
Eclipse. Настройка панели инструментов
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
private IWorkbenchAction exitAction;
public ApplicationActionBarAdvisor(IActionBarConfigurer configurer)
{super(configurer); }
protected void makeActions(final IWorkbenchWindow window) {
exitAction = ActionFactory.QUIT.create(window);
register(exitAction);
}
protected void fillMenuBar(IMenuManager menuBar) {
MenuManager fileMenu = new MenuManager("&File",
IWorkbenchActionConstants.M_FILE);
menuBar.add(fileMenu);
fileMenu.add(exitAction);
}
}
Создание RCA приложения в среде
Eclipse. Настройка перспективы
package simplerca;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveFactory;
public class Perspective implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout) {
String editorArea = layout.getEditorArea();
layout.setEditorAreaVisible(true);
layout.setFixed(true);
layout.addStandaloneView(View.ID,
editorArea);
}
}
false, IPageLayout.LEFT, 1.0f,
Создание RCA приложения в среде
Eclipse. Файл-манифест (1)
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>
<extension
id="application"
point="org.eclipse.core.runtime.applications">
<application
icon="icons/alt_window_16.gif">
<run
class="simplerca.Application">
</run>
</application>
</extension>
<extension
point="org.eclipse.ui.perspectives">
<perspective
name="Perspective"
class="simplerca.Perspective"
id="SimpleRCA.perspective">
</perspective>
</extension>
Создание RCA приложения в среде
Eclipse. Файл-манифест (2)
<extension
point="org.eclipse.ui.views">
<view
name="View"
class="simplerca.View"
id="SimpleRCA.view">
</view>
</extension>
<extension
point="org.eclipse.ui.actionSets">
<actionSet
id="SimpleRCA.actionSet1"
label="test"
visible="true">
</actionSet>
</extension>
</plugin>
Создание RCA приложения в среде Eclipse.
Представление макета RCA приложения
Создание RCA приложения в среде Eclipse.
Задание конфигурации продукта
Создание RCA приложения в среде Eclipse.
Создание файла конфигурации
Создание RCA приложения в среде Eclipse.
Создание конфигурации продукта
Создание RCA приложения в среде Eclipse.
Добавление модулей в продукт
Создание RCA приложения в среде Eclipse.
Выбор модуля для продукта
Создание RCA приложения в среде Eclipse.
Добавление требуемых модулей
Работа с рабочим пространством
(Eclipse workspace).
Маркировка ресурсов
рабочего пространства.
Архитектура платформы Eclipse.
Рабочее пространство (workspace)
Рабочее пространство Eclipse
Рабочее пространство (Workspace)
Рабочее пространство содержит один и более проектов.
Проекту соответствует директория в файловой системе
Подключаемые модули работают с файлами
содержащимися в рабочем пространстве. Файлы
доступны операционной системе и обычным
инструментам
Для файлов рабочего пространства хранится история
изменения и предоставляется инструмент сравнения
версий файла
Рабочее пространство Eclipse.
История изменения файлов
Рабочее пространство Eclipse.
Маркировка ресурсов рабочего пространства
Подсказка маркера
Маркер
предупреждения
Маркер ошибки
в редакторе файла
Маркер
ошибки
Маркер положения
ошибки
Рабочее пространство Eclipse.
Виды маркеров для ресурсов
Подсказка для
маркера положения
задания
Маркер
результата
поиска
Маркер
положения
задания
Маркер
метода
Маркер
задания
(task)
Маркер
предупреждения
Маркер точки
останова
Маркер положения
предупреждения
Рабочее пространство Eclipse.
Программирование маркировки ресурсов (1)
Рабочее пространство Eclipse.
Программирование маркировки ресурсов (2)
Подключение модуля для
работы с ресурсами
Рабочее пространство Eclipse.
Программирование маркировки ресурсов (3)
Рабочее пространство Eclipse.
Программирование маркировки ресурсов (4)
package markers.actions;
import
import
import
import
import
import
org.eclipse.core.resources.*;
org.eclipse.core.runtime.CoreException;
org.eclipse.jface.action.IAction;
org.eclipse.jface.dialogs.MessageDialog;
org.eclipse.jface.viewers.ISelection;
org.eclipse.ui.*;
public class MarkingAction implements IWorkbenchWindowActionDelegate {
private IWorkbenchWindow window;
public MarkingAction() {}
static public void addErrorMark(IFile file, String message, int line, int column) {
IMarker marker = null;
try {
marker = file.createMarker(IMarker.PROBLEM);
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
marker.setAttribute(IMarker.MESSAGE, message);
marker.setAttribute(IMarker.LINE_NUMBER, line);
marker.setAttribute(IMarker.CHAR_START, column);
marker.setAttribute(IMarker.CHAR_END, column+1);
} catch (CoreException e1)
{ e1.printStackTrace(); }
} // addErrorMark
Рабочее пространство Eclipse.
Программирование маркировки ресурсов (5)
public void run(IAction action) {
IWorkspace ws = ResourcesPlugin.getWorkspace();
IWorkspaceRoot myWorkspaceRoot = ws.getRoot();
IProject[ ] projects = myWorkspaceRoot.getProjects();
for (int k = 0; k < projects.length; k++)
buildProject(projects[k]);
}
static void buildProject(IProject project) {
IFolder root = project.getFolder("src");
If (!root.exists()) return;
IResource[ ] resources = null;
try {
resources = root.members();
for (int k = 0; k < resources.length; k++) {
IResource r = resources[k];
if ( !(r instanceof IFile) ) continue;
IFile file = (IFile) r;
addErrorMark(file, "Message", 1, 2);
}
} catch (CoreException e) { e.printStackTrace(); }
} // buildProject
Рабочее пространство Eclipse.
Программирование маркировки ресурсов (4)
Запуск
приложения
в режиме отладки
Рабочее пространство Eclipse.
Программирование маркировки ресурсов (5)
Запуск
маркировки
ресурса
Рабочее пространство Eclipse.
Программирование маркировки ресурсов (6)
маркированный
ресурс
Разработка синтаксически
ориентированного редактора
Синтаксически ориентированный редактор.
Создание секции редакторов (1)
Добавление
Синтаксически ориентированный редактор.
Выбор точки расширения
Выбор
точки
расширения
Синтаксически ориентированный редактор.
Создана новая точка расширения
Новая
точка
расширения
Синтаксически ориентированный редактор.
Создание нового редактора
Синтаксически ориентированный редактор.
Задание свойств редактора для языка Pascal
Синтаксически ориентированный редактор.
Задание кода редактора на языке Java
Создание
кода редактора
на Java
Синтаксически ориентированный редактор.
Выбор класса для редактора
Создание
класса
кода редактора
редактора
на Java
Синтаксически ориентированный редактор.
Выбор базового класса для класса редактора
Выбор базового
класса для
класса редактора
Синтаксически ориентированный редактор.
Выбор базового класса для класса редактора (2)
Выбор базового
класса для
класса редактора
Синтаксически ориентированный редактор.
Описание редактора в файле plugin.xml
<extension
point="org.eclipse.ui.editors">
<editor
class="pascaleditor.editors.PascalEditor"
contributorClass="org.eclipse.ui.texteditor.BasicTextEditorActionContributor"
extensions="pascal, pas"
icon="icons/zonnon.gif"
id="pascaleditor.editors.PascalEditor"
name="Pascal Editor">
</editor>
Умалчиваемые действия меню
</extension>
и панели инструментов
Синтаксически ориентированный редактор.
Текст редактора на Java
package pascaleditor.editors;
import org.eclipse.ui.editors.text.TextEditor;
public class PascalEditor extends TextEditor {
public PascalEditor() {
setSourceViewerConfiguration(new PascalConfiguration());
}
}
Синтаксически ориентированный редактор.
Текст конфигуратора редактора на Java
package pascaleditor.editors;
public class PascalConfiguration extends SourceViewerConfiguration {
private PascalScanner scanner;
public PascalConfiguration() {}
protected PascalScanner getScanner() {
if (scanner == null)
scanner = new PascalScanner();
return scanner;
}
public IPresentationReconciler getPresentationReconciler(ISourceViewer
sourceViewer) {
DefaultDamagerRepairer dr = new DefaultDamagerRepairer( getScanner() );
PresentationReconciler reconciler = new PresentationReconciler();
reconciler.setDamager (dr, IDocument.DEFAULT_CONTENT_TYPE);
reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
return reconciler;
}
}
Синтаксически ориентированный редактор.
Сканер для языка Pascal
package org.zonnon.plugin.editors;
import java.util.*;
import
import
import
import
org.eclipse.jface.text.rules.*;
org.eclipse.jface.text.TextAttribute;
org.eclipse.swt.graphics.*;
org.eclipse.swt.widgets.Display;
public class PascalScanner extends RuleBasedScanner {
private static Color COMMENT_COLOR
= new Color(Display.getCurrent(), new RGB(0, 128,
128));
private static Color KEYWORD_COLOR
= new Color(Display.getCurrent(), new RGB(0, 0,
255));
private static Color MODIFIERS_COLOR = new Color(Display.getCurrent(), new RGB(128, 0,
0));
private static Color STRING_COLOR
= new Color(Display.getCurrent(), new RGB(0, 128,
0));
private static Color TYPE_COLOR = new Color(Display.getCurrent(), new RGB(0, 0, 255));
private static Color DEFAULT_COLOR
= new Color(Display.getCurrent(), new RGB(0, 0, 0));
public ZonnonRuleScanner() {
IToken keywordToken = new Token( new TextAttribute(KEYWORD_COLOR)
IToken modifierToken = new Token( new TextAttribute(MODIFIERS_COLOR)
IToken typeToken= new Token( new TextAttribute(TYPE_COLOR)
);
IToken stringToken
= new Token( new TextAttribute(STRING_COLOR)
IToken commentToken = new Token( new TextAttribute(COMMENT_COLOR)
IToken otherToken
= new Token( new TextAttribute(DEFAULT_COLOR)
);
);
);
);
);
Синтаксически ориентированный редактор.
Сканирование комментариев
List rules = new ArrayList();
char esc = 0x1B;
// Add rule for long and short comments.
rules.add( new MultiLineRule ("(*", "*)", commentToken);
rules.add( new EndOfLineRule("//", commentToken) );
Синтаксически ориентированный редактор.
Сканирование строк
Задание строк
// Add rule for strings and character constants.
rules.add( new SingleLineRule("\"", "\"", stringToken, '\\')
);
rules.add( new SingleLineRule("'", "'", stringToken, '\\')
);
Шаблон завершающийся
на одной строке текста
Задание символов
Синтаксически ориентированный редактор.
Описание пробелов
// Add generic whitespace rule.
rules.add( new WhitespaceRule( new ZonnonWhitespaceDetector() ) );
class ZonnonWhitespaceDetector implements IWhitespaceDetector {
public boolean isWhitespace(char character)
{ return Character.isWhitespace(character); }
} // class ZonnonWhitespaceDetector
package org.eclipse.jface.text.rules;
public interface IWhitespaceDetector {
boolean isWhitespace(char c);
}
Синтаксически ориентированный редактор.
Сканирование ключевых слов
private static String[ ] fgKeywords = {
"accept",
"array“ };
private static String[ ] fgTypes= {
"object",
"boolean“ };
// Add word rule for keywords, types, and constants.
WordRule wordRule = new WordRule( new ZonnonWordDetector(), otherToken);
for (int i = 0; i < fgKeywords.length; i++)
wordRule.addWord(fgKeywords[i], keywordToken);
for (int i = 0; i < fgTypes.length; i++)
wordRule.addWord(fgTypes[i], typeToken);
rules.add(wordRule);
Синтаксически ориентированный редактор.
Сканирование идентификаторов
class ZonnonWordDetector implements IWordDetector {
public boolean isWordPart(char character)
{ return Character.isJavaIdentifierPart(character); }
public boolean isWordStart(char character)
{ return Character.isJavaIdentifierStart(character); }
} // class ZonnonWordDetector
package org.eclipse.jface.text.rules;
public interface IWordDetector {
boolean isWordStart(char c);
boolean isWordPart(char c);
}
Рабочее пространство Eclipse.
Задание раскраски умалчиваемых лексем
IRule[ ] result = new IRule[rules.size()];
rules.toArray(result);
setRules(result);
setDefaultReturnToken(otherToken);
} // ZonnonRuleScanner
} // class ZonnonRuleScanner
Задание лексемы
возвращаемой по
умолчанию
Синтаксически ориентированный редактор.
Выбор базового класса для класса редактора
Файл с текстом
на языке Pascal
Синтаксически ориентированный редактор.
Текст на языке Pascal в редакторе
Файл с текстом
на языке Pascal
Представление модели
программы в виде дерева
Модель программы в виде дерева.
1. Открытие вида ZonnonExplorer
Модель программы в виде дерева.
2. Открытие перспективы для языка Zonnon
Модель программы в виде дерева.
3. Представление узлов дерева программы
Модель программы в виде дерева.
4. Точка расширения для вида дерева
<extension point="org.eclipse.ui.views">
<category
id="org.zonnon.plugin.ZonnonPlugin "
name="Zonnon Category" />
<view
category="org.zonnon.plugin.ZonnonPlugin"
class="org.zonnon.plugin.views.ZonnonExplorer"
icon="icons/zonnon_explorer.gif"
id="org.zonnon.plugin.views.ZonnonExplorer"
name="Zonnon Explorer" />
</extension>
Модель программы в виде дерева.
5. ZonnonExplorer – часть вида
package org.zonnon.plugin.views;
public class ZonnonExplorer extends ViewPart {
private TreeViewer viewer;
public ZonnonExplorer()
{ ZonnonPerspective.explorer = this; }
public void createPartControl(Composite parent) {
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
viewer.setContentProvider( new ViewContentProvider(this) );
viewer.setLabelProvider( new ViewLabelProvider() );
viewer.setSorter( new NodesSorter() );
viewer.setInput( getViewSite() );
} // createPartControl
Как узлы
сортируются
Как узлы
изображаются
Как узлы
структурированы
Модель программы в виде дерева.
6. Определение структуры дерева
public interface ITreeContentProvider extends IStructuredContentProvider {
public Object[ ] getChildren(Object parentElement);
public Object getParent(Object element);
public boolean hasChildren(Object element);
}
class ViewContentProvider implements ITreeContentProvider {
ViewContentProvider(ViewPart tv) { this.vp = tv; }
public Object getParent(Object child) {
if (child instanceof TreeNode) {
return ((TreeNode) child).getParent();
}
return null;
}
Модель программы в виде дерева.
7. Построение дерева программы
private void loadNamespace(TreeFolder folder, Namespace ns) {
for (NamedElement ne : ns.members.values()) {
if (ne instanceof Procedure) {
Procedure p = (Procedure) ne;
ProcedureNode pNode = new ProcedureNode(p);
folder.addChild(pNode);
}
Элементы для визуализации
else
дерева программы
if (ne instanceof Variable) {
Variable v = (Variable) ne;
Type t = v.getType();
String typeName = (t == null ? "integer" : Text.textName(t));
VariableNode vNode = new VariableNode(v.name, typeName);
Элементы для визуализации
дерева программы
Модель программы в виде дерева.
8. Фрагмент модели программы
members
*
NamedElement
+ name : String
Namespace
Classifier
Definition
Implementation
Object
Module
Модель программы в виде дерева.
9. Элементы дерева программы
TreeNode
childs
*
parent
0:1
TreeFolder
NamespaceNode
Использует
ViewContentProvide
r
+ getText() : String
+ getIconFileName () : String
VariableNode
ModuleNode
ProcedureNode
Вызывает
ViewLabelProvider
ObjectNode
Модель программы в виде дерева.
10. Изображение элемента программы
class ViewLabelProvider extends LabelProvider {
ImageManager manager = new ImageManager();
public String getText(Object obj) {
if (obj instanceof TreeNode) {
TreeNode to = (TreeNode) obj;
return to.getText();
}
return obj.toString();
} // getText
public Image getImage(Object obj) {
String fn = "/icons/zonnon_namespace.gif";
if (obj instanceof TreeNode) {
TreeNode tn = (TreeNode) obj;
fn = "/icons/" + tn.getIconFileName();
return manager.getImage(fn);
}
return manager.getImage(fn);
} // getImage
} // class ViewLabelProvider
Вызывает TreeViewer
Модель программы в виде дерева.
11. Изображение элемента программы
class ViewLabelProvider extends LabelProvider {
ImageManager manager = new ImageManager();
public String getText(Object obj) {
if (obj instanceof TreeNode) {
TreeNode to = (TreeNode) obj;
return to.getText();
}
return obj.toString();
} // getText
public Image getImage(Object obj) {
String fn = "/icons/zonnon_namespace.gif";
if (obj instanceof TreeNode) {
TreeNode tn = (TreeNode) obj;
fn = "/icons/" + tn.getIconFileName();
return manager.getImage(fn);
}
return manager.getImage(fn);
} // getImage
} // class ViewLabelProvider
Вызывает TreeViewer
Модель программы в виде дерева.
12. Сортировка дерева программы
class NodesSorter extends ViewerSorter {
public int category(Object element) {
if (element instanceof NamespaceNode) return 1;
if (element instanceof VariableNode)
return 2;
if (element instanceof ProcedureNode)
return 3;
if (element instanceof DefinitionNode)
return 4;
if (element instanceof ImplementationNode)
return 5;
if (element instanceof ObjectNode)
return 6;
if (element instanceof ModuleNode)
return 7;
return 0;
Вызывает TreeViewer
} // category
public int compare(Viewer viewer, Object e1, Object e2) {
return 0;
}
} // class NodesSorter
Создание перспективы Eclipse
Создание перспективы.
1. Открытие перспективы для языка Zonnon
Создание перспективы.
2. Представление перспективы
Создание перспективы.
3. Точка расширения для перспективы
<extension
point="org.eclipse.ui.perspectives">
<perspective
class="org.zonnon.plugin.perspectives.ZonnonPerspective"
icon="icons/zonnon_perspective.gif"
id="org.zonnon.ZonnonCompiler.ZonnonPerspective"
name="Zonnon"/>
</extension>
Создание перспективы.
4. Точка расширения для перспективы
package org.zonnon.plugin.perspectives;
public class ZonnonPerspective extends AbstractUIPlugin implements IPerspectiveFactory {
public static ZonnonExplorer explorer;
public void createInitialLayout(IPageLayout layout) {
// Get the editor area.
String editorArea = layout.getEditorArea();
// Top left: Resource Navigator view and Bookmarks view placeholder
IFolderLayout topLeft = layout.createFolder("topLeft", IPageLayout.LEFT, 0.25f, editorArea);
topLeft.addView(IPageLayout.ID_RES_NAV);
topLeft.addPlaceholder(IPageLayout.ID_BOOKMARKS);
// Bottom left: Outline view and Property Sheet view
IFolderLayout bottomLeft = layout.createFolder("bottomLeft", IPageLayout.BOTTOM, 0.50f,
"topLeft");
bottomLeft.addView(IPageLayout.ID_OUTLINE);
bottomLeft.addView(IPageLayout.ID_PROP_SHEET);
// Bottom right: Task List view
layout.addView(IPageLayout.ID_PROBLEM_VIEW, IPageLayout.BOTTOM, 0.66f, editorArea);
} // createInitialLayout
1/--страниц
Пожаловаться на содержимое документа