Автор: Пользователь скрыл имя, 10 Октября 2011 в 15:33, курсовая работа
Игры на Eclipse
package com.mycompany.propbuilder; import java.io.*; import java.util.*; import org.eclipse.core.resources.*; import org.eclipse.core.runtime. import org.eclipse.core.runtime. public class PropertyBuilder extends IncrementalProjectBuilder { private static final String MARKER_ID = "com.mycompany.propbuilder. protected void clean(IProgressMonitor monitor) throws CoreException { // удалить все маркеры, созданные для файлов в проекте List removed = new LinkedList(); removed.add(getProject()); removeMarkers(removed); } protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException { // список файлов, в которых необходимо искать сообщения TODO List added = new LinkedList(); // все маркеры для этих файлов необходимо удалить List removed = new LinkedList(); IResourceDelta delta = getDelta(getProject()); if (kind == FULL_BUILD || (delta.getFlags() & IResourceDelta.DESCRIPTION) != 0) { // начинаем обработку всех файлов в проекте buildAll(added, removed); } else { // начинаем обработку файлов, указанных в delta buildDelta(delta, added, removed); } // удалить устаревшие маркеры removeMarkers(removed); // создать новые маркеры processFiles(monitor, added); return null; } private void buildAll(final List added, final List removed) { IProject project = getProject(); // удалить все маркеры, созданные для файлов в проекте removed.add(project); try { // посетить все ресурсы, входящие в проект project.accept( new IResourceVisitor() { public boolean visit(IResource res) throws CoreException { // мы ищем файлы с расширением .properties if (res instanceof IFile && "properties".equals(res. { added.add(res); } // продолжить обход дочерних ресурсов текущего ресурса return true; } } ); } catch (CoreException e) { PropBuilderPlugin.log(e); } } private void buildDelta(IResourceDelta delta, final List added, final List removed) { IResourceDeltaVisitor visitor = new IResourceDeltaVisitor() { public boolean visit(IResourceDelta delta) { if ((delta.getFlags() & IResourceDelta.CONTENT) == 0) { // содержимое данного ресурса не менялось return true; }
IResource resource = delta.getResource(); // мы ищем файлы с расширением .properties if (resource.getType() == IResource.FILE && "properties".equals(resource. { switch (delta.getKind()) { case IResourceDelta.ADDED: added.add(resource); break; case IResourceDelta.REMOVED: removed.add(resource); break; case IResourceDelta.CHANGED: removed.add(resource); added.add(resource); break; } } // продолжить обход дочерних ресурсов текущего ресурса return true; } }; try { // посетить все измененные ресурсы delta.accept(visitor); } catch (CoreException e) { PropBuilderPlugin.log(e); } } void removeMarkers(final List resources) { IWorkspaceRunnable operation = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { Iterator i = resources.iterator(); while (i.hasNext()) { IResource r = (IResource) i.next(); // удалить в данном ресурсе все маркеры типа propmarker r.deleteMarkers( MARKER_ID, true, IResource.DEPTH_INFINITE); } } }; try { // выполнить удаление маркеров как атомарную операцию
ResourcesPlugin.getWorkspace() } catch (CoreException e) { PropBuilderPlugin.log(e); } } private void processFiles(IProgressMonitor monitor, final List files) { IWorkspaceRunnable operation = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { // всего предстоит обработать files.size() файлов monitor.beginTask("Analyzing properties", files.size()); //$NON-NLS-1$ Iterator i = files.iterator(); while (i.hasNext()) { readTodos((IFile) i.next()); // обновить индикатор состояния monitor.worked(1); } // обработка завершена monitor.done();
} // найти все строки, содержащие TODO в данном файле .properties private void readTodos(IFile file) throws CoreException { BufferedReader in = new BufferedReader( new
InputStreamReader(file. int line = 1; String str; try { while ((str = in.readLine()) != null) { if (str.indexOf("TODO") >= 0) { //$NON-NLS-1$ reportTask(file, line, str); } line++; } } catch (IOException e) { PropBuilderPlugin.log(e); }
} private void reportTask(IResource resource, int line, String message) throws CoreException { // создать маркер типа propmarker для данного файла
IMarker marker = resource.createMarker(MARKER_ // установить номер строки
marker.setAttribute(IMarker. // используем сам текст строки в качестве наименования задачи
marker.setAttribute(IMarker. // запретить пользователю редактировать и удалять задачу
marker.setAttribute(IMarker. }
}; try { // выполнить поиск непереведенных сообщений как атомарную операцию
ResourcesPlugin.getWorkspace() } catch (CoreException e) { PropBuilderPlugin.log(e); } } } | |
СОВЕТ
После каждого создания, изменения или удаления маркера Workspace рассылает всем зарегистрированным слушателям сообщение об изменении ресурса. Из-за этого создание нескольких сотен или тысяч маркеров может оказаться весьма продолжительной операцией. В таких случаях их следует создавать в контексте метода IWorkspace.run(), вызов которого считается атомарной операцией. Соответственно, независимо от количества созданных маркеров, слушателям будет разослано только одно сообщение. |
Как пользоваться
новым расширением Eclipse? Прежде всего,
необходимо установить плагин com.mycompany.propbuilder.
Для этого нужно скопировать
файлы plugin.xml и propbuilder.jar в директорию
eclipse/plugins/com.mycompany.
<buildSpec>
... <buildCommand>
<name>com.mycompany. <arguments> </arguments> </buildCommand> </buildSpec> |
Наконец, включим отображение нового типа задач в виде Tasks:
Теперь в Tasks должны появиться созданные плагином com.mycompany.propbuilder задачи.
Рассмотрим два аспекта создания приложений на базе Eclipse – правовой и технический.
Юридическую сторону вопроса призваны решить лицензии, под которыми распространяется Eclipse SDK – CPL (Common Public License) и более поздняя EPL (Eclipse Public License). Они позволяют использовать, распространять и продавать лицензированные исходные и бинарные коды без уплаты вознаграждения правообладателям. Этим уже воспользовались для создания коммерческих продуктов на базе Eclipse такие поставщики ПО, как Borland, IBM, SAP.
С технической точки зрения, подробно проиллюстрированной в предыдущем разделе, выдающаяся расширяемость Eclipse обусловлена прежде всего его архитектурой и проектными решениями. Модульная архитектура, организация проекта в виде набора расширяемых подсистем Platform, JTD и PDE, возможность расширения сторонними разработчиками практически любой подсистемы Eclipse позволяют использовать его для создания приложений разнообразнейших видов и назначения.
Основной целью проекта Eclipse является интеграция приложений для разработки в рамках различных IDE (одной из этих IDE является сам Eclipse SDK, а именно Platform, дополненный JDT и PDE). В то же время, Eclipse содержит множество компонентов, которые могут быть использованы приложениями самого широкого спектра, не нуждающимися, вообще говоря, в полной инфраструктуре Eclipse (примерами таких компонентов могут служить SWT и JFace). Для поддержки подобных приложений было введено понятие Rich Client Platform (RCP). RCP – это базовый набор компонентов Eclipse, который позволяет использующим его приложениям полностью контролировать внешний вид создаваемого пользовательского интерфейса (перспективы, меню, панели инструментов и т.п.).
В заключение я хочу еще раз подчеркнуть два ключевых фактора. Во-первых, с точки зрения своих создателей, Eclipse является, прежде всего, средством разработки приложений. Во-вторых, приложения Eclipse ни в коей мере не ориентированы только на задачи, так или иначе связанные с Java (хотя сами приложения, безусловно, удобнее всего разрабатывать на Java). Понимание этой концепции поможет вам взглянуть на Eclipse в новом ракурсе.
На прилагающемся
к журналу компакт-диске