blob: 1d71b1adfdf8a784e79b7b4fa61010df2fc1ea9b [file] [log] [blame]
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
= Учебный курс по интеграции типов файлов
:jbake-type: platform_tutorial
:jbake-tags: tutorials
:jbake-status: published
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:icons: font
:experimental:
:description: Учебный курс по интеграции типов файлов - Apache NetBeans
:keywords: Apache NetBeans Platform, Platform Tutorials, Учебный курс по интеграции типов файлов
В этом учебном курсе показано написание модуля, позволяющего среде IDE, а также любому другому приложению, основанному на платформе NetBeans, распозначать новый тип файлов.
NOTE: В этом документе используется среда IDE NetBeans версии 6.5. Если установлена среда IDE NetBeans 6.x, см link:60/nbm-filetype.html[версию 6.1 этого документа].
== Введение в интеграцию типов файлов
Типам файлов, распознаваемых средой IDE, сопоставлены соответствующие значки, пункты меню и режимы поведения. Показаные ниже "файлы" представляют собой объекты ``FileObject`` , т.е. обертки вокруг ``java.io.File`` или, в случае файлов настройки, обычно обертки вокруг данных, сохраняемых другим способом, например внутри файлов XML в модулях. Фактически _видны_ ``узлы (Node)`` , предоставляющие функциональные возможности, такие как действия и локализованные имена для объектов, подобных файлам. Между узлами ``Node`` и объектами ``FileObject`` располагаются объекты ``DataObject`` . Объект ``DataObject`` во всем подобен объекту ``FileObject`` , однако содержит информацию о типе отображаемого файла, и для файлов с разными расширениями (или файлов XML с разными пространствами имен) используются разные типы ``DataObject`` . Каждый из объектов ``DataObject`` предоставляется отдельным модулем, причем в каждом из них реализована поддержка одного или более типов файлов например, в модуль Image предоставляет возможность распознавания и открытия файлов ``.gif`` и ``.png`` .
Модуль, распознающий тип файла, устанавливает объект ``DataLoader`` фабрику для ``DataObject`` для конкретного типа файла. При развертывании папки среда IDE опрашивает каждый известный объект ``DataLoader`` в целях опознания типа файлов. Первый объект, ответивший "да" на запрос, создает объект ``DataObject`` для этого файла. Для фактического отображения содержимого файла вызывается функция ``DataObject.getNodeDelegate()`` для каждого объекта ``DataObject`` , и в среде IDE на самом деле отображаются узлы ``Node`` .
Ниже и слева показана схема данных, предоставляемых каждым из элементов, описанных выше.
image::images/filetype_diagram-dataobject2.png[]
Это руководство посвящено созданию модуля, устанавливающего объект ``DataLoader`` для вымышленного типа файлов "Abc" (расширение файлов ``.abc`` ). По умолчанию файл с расширением "abc" обрабатывается аналогично любому другому неопознанному файлу как текстовый файл, и в результате для файлов Abc предоставляются те же функциональные возможности среды IDE, что и для текстовых файлов. После создания модуля будет показан способ расширения этих функциональных возможностей, уникальных для файлов Abc. По завершении цикла разработки дргуим разработчикам несложно предоставить возможность использования созданного модуля в среде IDE предоставляется возможность создания двоичного файла, который можно передать другим разработчикам, которые затем смогут установить его посредством центра обновлений.
== Создание проекта модуля
В этом разделе используется мастер для создания структуры исходного кода, требуемого любым модулем NetBeans. Эта структура исходного кода состоит из ряда папок в особых местах и набора файлов, которые требуются в любом случае. Например, для каждого модуля NetBeans требуется папка ``nbproject`` , в которой хранятся метаданные проекта, а также файл ``layer.xml`` , в котором объявляется регистрация таких элементов как кнопки панелей управления и окна.
[start=1]
1. Выберите в меню "Файл" команду "Новый проект" (CTRL+SHIFT+N). В разделе "Категории" выберите параметр "Модули NetBeans". В области "Проекты" выберите "Модуль" и нажмите кнопку "Далее".
[start=2]
1. На панели "Имя и расположение" в поле "Имя проекта" введите ``AbcFileType`` . В поле "Расположение проекта" укажите любой каталог на компьютере, например ``c:\mymodules`` . Оставьте переключатель "Отдельный модуль" выбранным. Панель должна выглядеть следующим образом:
image::images/filetype_65-projectwizard1.png[]
Нажмите кнопку "Далее".
[start=3]
1. На панели "Основные настройки модуля" введите ``org.myorg.abcfiletype`` в поле "Основа кодового имени". Добавьте пробелы к предложенному отображаемому имени модуля, и измените его на ``Abc File Type`` . Установите флажок "Создать слой XML" и оставьте местоположение локализуемого файла ресурсов и слоя XML по умолчанию; при этом они будут храниться в пакете с именем ``org/myorg/abcfiletype`` . Панель должна выглядеть следующим образом:
image::images/filetype_65-projectwizard2.png[]
[start=4]
1. Нажмите кнопку "Готово".
В среде IDE создается проект ``Abc File Type`` . Проект содержит все исходные файлы и метаданные проекта, например, сценарий сборки проекта Ant. Проект откроется в среде IDE. Логическую структуру проекта можно просмотреть в окне "Проекты" (CTRL+1), а его файловую структуру в окне "Файлы" (CTRL+2). Например, окно "Проекты" должно выглядеть следующим образом:
image::images/filetype_65-projectswindow1.png[]
== Распознавание файлов Abc
В этом разделе с помощью мастера создаются классы, необходимые для распознавания файлов Abc как отличных от файлов всех других видов. Как уже указывалось в начале учебного курса, для этого потребуется объект данных и загрузчик данных, а также средство разрешения типа MIME и сущности регистрации в файле ``layer.xml`` . Все эти элементы создаются автоматически с помощью мастера создания файла.
[start=1]
1. Щелкните узел проекта правой кнопкой мыши и выберите команду "Создать > Тип файлов".
[start=2]
1. Установите следующие значения на панели "Распознавание файлов":
* Введите ``text/x-abc`` в поле "Тип MIME".
* Введите ``.abc .ABC`` в поле "Расширение файла".
Панель "Распознавание файлов" должна выглядеть следующим образом:
image::images/filetype_60-filewizard1.png[]
Обратите внимание на следующие сведения о полях на панели "Распознавание файлов":
* *Тип MIME.* Указывается уникальный тип MIME объекта данных.
* по
* *Расширение файла.* Указывается одно или более расширений файлов, по которым средой IDE распознается принадлежность файла к указанному типу MIME. Расширение файла можно в факультативном порядке предварять точкой. В качестве разделителей используются запятые, пробелы, или запятые вместе с пробелами. Следовательно, действительными являются все следующие варианты записи:
* ``.abc,.def``
* ``.abc .def``
* ``abc def``
* ``abc,.def ghi, .wow``
Представим, что для файлов Abc учитывается регистр. Поэтому в этом учебном курсе указывается _два_ типа MIME: ``.abc`` и ``.ABC`` .
* *Корневой элемент XML.* Указывается уникальное пространство имен, отличающее тип файла XML от всех остальных типов файлов XML. Поскольку многие файлы XML обладают одинаковым расширением ( ``xml`` ), различие между файлами XML проводится в среде IDE по их корневым элементам XML. Точнее, в среде IDE возможно различие между пространствами имен и первым элементом XML в файлах XML. Это, например, можно использовать для различия между описателем развертывания JBoss и описателем развертывания WebLogic. Если это различие сделано, можно обеспечить недоступность пунктов меню, добавленных к контекстному меню описателя развертывания JBoss, для описателя развертывания WebLogic. Примеры по данному вопросу приведены в link:nbm-palette-api2.html[Руководстве по модулю палитры компонентов NetBeans].
Нажмите кнопку "Далее".
[start=3]
1. На панели "Имя и расположение" введите ``Abc`` в качестве префикса имени класса и выберите любой файл изображения размером 16 на 16 пикселей в качестве значка нового типа файлов, в соответствии с иллюстрацией ниже.
image::images/filetype_65-filewizard2.png[]
*Примечание.* Можно использовать любой значок размером 16x16 пикселей. Если требуется, можно щелкнуть этот значок, сохранить его локально, а затем указать его в мастере, как указано выше:
image::images/filetype_Datasource.gif[]
[start=4]
1. Нажмите кнопку "Готово".
Окно "Проекты" должно выглядеть следующим образом:
image::images/filetype_65-projectswindow2.png[]
Рассмотрим краткое описание каждого из сгенерированных файлов:
* *AbcDataObject.java.* Обертывает ``FileObject`` . Объекты данных (DataObject) создаются загрузчиками данных (DataLoader). Подробные сведения см. в документе link:https://netbeans.apache.org/wiki/devfaqdataobject[Что такое DataObject?].
* *AbcResolver.xml.* Отображает расширения ``.abc`` и ``.ABC`` на тип MIME. ``AbcDataLoader`` распознает только тип MIME; о расширении файлов ему ничего не известно.
* *AbcTemplate.abc.* Предоставляет основу шаблона файла, зарегистрированного в файле ``layer.xml`` так, чтобы он устанавливался в диалоговом окне "Новый файл" в качестве нового шаблона.
* *AbcDataObjectTest.java.* класс теста JUnit для ``DataObject`` .
В файле ``layer.xml`` должен содержаться следующий текст:
[source,xml]
----
<folder name="Loaders">
<folder name="text">
<folder name="x-abc">
<folder name="Actions">
<file name="org-myorg-abcfiletype-MyAction.shadow">
<attr name="originalFile" stringvalue="Actions/Edit/org-myorg-abcfiletype-MyAction.instance"/>
<attr name="position" intvalue="600"/>
</file>
<file name="org-openide-actions-CopyAction.instance">
<attr name="position" intvalue="100"/>
</file>
<file name="org-openide-actions-CutAction.instance">
<attr name="position" intvalue="200"/>
</file>
<file name="org-openide-actions-DeleteAction.instance">
<attr name="position" intvalue="300"/>
</file>
<file name="org-openide-actions-FileSystemAction.instance">
<attr name="position" intvalue="400"/>
</file>
<file name="org-openide-actions-OpenAction.instance">
<attr name="position" intvalue="500"/>
</file>
<file name="org-openide-actions-PropertiesAction.instance">
<attr name="position" intvalue="700"/>
</file>
<file name="org-openide-actions-RenameAction.instance">
<attr name="position" intvalue="800"/>
</file>
<file name="org-openide-actions-SaveAsTemplateAction.instance">
<attr name="position" intvalue="900"/>
</file>
<file name="org-openide-actions-ToolsAction.instance">
<attr name="position" intvalue="1000"/>
</file>
<file name="sep-1.instance">
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
<attr name="position" intvalue="1100"/>
</file>
<file name="sep-2.instance">
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
<attr name="position" intvalue="1200"/>
</file>
<file name="sep-3.instance">
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
<attr name="position" intvalue="1300"/>
</file>
<file name="sep-4.instance">
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
<attr name="position" intvalue="1400"/>
</file>
</folder>
<folder name="Factories">
<file name="AbcDataLoader.instance">
<attr name="SystemFileSystem.icon" urlvalue="nbresloc:/org/myorg/abcfiletype/Datasource.gif"/>
<attr name="dataObjectClass" stringvalue="org.myorg.abcfiletype.AbcDataObject"/>
<attr name="instanceCreate" methodvalue="org.openide.loaders.DataLoaderPool.factory"/>
<attr name="mimeType" stringvalue="text/x-abc"/>
</file>
</folder>
</folder>
</folder>
</folder>
----
== Установка и ознакомление с функциональными возможностями
Теперь установим модуль и воспользуемся базовыми функциональными возможностями, созданными на данный момент. Для построения и установки модуля в среде IDE используется сценарий построения Ant. При создании проекта автоматически создается сценарий построения.
[start=1]
1. В окне "Проекты" щелкните правой кнопкой мыши проект ``Abc File Type`` и выберите "Выполнить".
Запустится новый экземпляр среды IDE, выполняющий установку модуля в себя.
[start=2]
1. Создайте приложение любого типа в среде IDE с помощью диалогового окна "Новый проект" (CTRL+SHIFT+N).
[start=3]
1. Щелкните узел приложения правой кнопкой мыши и выберите в меню "Создать" команду "Прочее". В категории "Прочее" доступен шаблон для работы с новым типом файлов:
image::images/filetype_60-action4.png[]
Выполните мастер до конца; в результате будет создан шаблон, который может использоваться пользователем для работы с данным типом файлов.
Если посредством шаблона должен предоставляться код по умолчанию, добавьте этот код к файлу ``AbcTemplate.abc`` , автоматически созданному мастером "Новый тип файла".
== Создание функциональных возможностей для файлов Abc
Теперь, когда в платформу NetBeans внедрена возможность отличения файлов Abc от других типов файлов, пришло время добавить функциональные возможности, специально предназначенные для работы с файлами этого типа. В этом разделе добавляется пункт меню в контекстное меню узла файла в окнах обозревателей, например в окне "Проекты", и добавляется возможность открытия файла в окне, а не в редакторе.
=== Добавление действия
В этом подразделе с помощью мастера создания действия создается класс Java, выполняющее действие для рассматриваемого типа файлов. Мастер также регистрирует класс в файле ``layer.xml`` , после чего у пользователя появляется возможность вызывать созданное действие из контекстного меню узла типа файла в окне обозревателя.
[start=1]
1. Щелкните узел проекта правой кнопкой мыши и выберите в меню "Создать" команду "Действие".
[start=2]
1. В панели "Тип действия" выберите "Включено по условию". Введите ``AbcDataObject`` , т.е. имя объекта данных, созданного выше посредством мастера создания типов файлов, как показано ниже:
image::images/filetype_60-action1.png[]
Нажмите кнопку "Далее".
[start=3]
1. На панели "Регистрация в интерфейсе" выберите категорию "Изменить" в раскрывающемся списке "Категория". Значение, выбранное в раскрываюшемся списке "Категория", определяет место отображения действия в редакторе сочетаний клавиш в среде IDE.
Затем снимите флажок "Глобальный пункт меню" и установите флажок "Пункт контекстного меню типа файла". В раскрывающемся списке "Тип содержимого" выберите тип MIME, указанный выше в мастере создания типов файлов, в соответствии с иллюстрацией ниже:
image::images/filetype_60-action2.png[]
Отметим, что существует возможность задания положения пункта меню, и что пункт меню можно разграничить от предыдушего и следующего пункта. Нажмите кнопку "Далее".
[start=4]
1. На панели "Имя и расположение" введите ``MyAction`` в качестве имени класса и ``My Action`` в поле "Видимое имя". В пунктах контекстных меню не отображаются значки. Поэтому нажмите кнопку "Готово", после чего файл ``MyAction.java`` будет добавлен к пакету ``org.myorg.abcfiletype`` .
[start=5]
1. В редакторе исходного кода добавьте код в метод ``actionPerformed`` действия:
[source,java]
----
@Override
public void actionPerformed(ActionEvent ev) {
FileObject f = context.getPrimaryFile();
String displayName = FileUtil.getFileDisplayName(f);
String msg = "I am " + displayName + ". Зверь рыкающий!";
NotifyDescriptor nd = new NotifyDescriptor.Message(msg);
DialogDisplayer.getDefault().notify(nd);
}
----
Нажмите CTRL+SHIFT+I. В верхнюю часть класса автоматически добавляются выражения импорта.
Часть кода по-прежнему выделена красным подчеркиванием, что указывает на отсутствие ряда требуемых пакетов в пути классов. Щелкните правой кнопкой мыши узел проекта, выберите "Свойства" и щелкните "Библиотеки" в диалоговом окне "Свойства проекта". Щелкните в верхней части панели "Библиотеки" и добавьте интерфейс API диалогов.
В классе ``MyAction.java`` снова нажмите CTRL+SHIFT+I. Выделение красным подчеркиванием снимается, поскольку требуемые пакеты обнаруживаются средой IDE в интерфейсе API диалогов.
[start=6]
1. В узле "Важные файлы" разверните подузел "Слой XML". Обозреватель link:https://netbeans.apache.org/tutorials/nbm-glossary.html[Файловая система среды] состоит из двух узлов: ``<этот слой>`` и ``<этот слой в контексте>`` , а также их подузлов. Разверните узел ``<этот слой>`` , разверните подузел ``Загрузчики`` , и продолжайте разворачивать узлы, пока не станет видно ``действие`` , созданное ранее.
[start=7]
1. Перетащите ``My Action`` в позицию ниже действия ``Open`` , как показано ниже:
image::images/filetype_60-action3.png[]
Как было показано в двух предыдущих действиях, обозреватель файловой системы среды можно использовать для быстрой реорганизации последовательности элементов, зарегистрированных в файловой системе среды.
[start=8]
1. Снова выполните модуль, как в предыдущем разделе.
[start=9]
1. Создайте файл ABC на основе шаблона, показанного в предыдущем разделе, и щелкните правой кнопкой мыши узел файла в одном из представлений обозревателя, например, в окнах "Проекты" или "Избранное".
Обратите внимание, что файл Abc снабжен значком, который был назначен ему в соответствующем модуле, и что список действий, назначенный в соответствующем файле ``layer.xml`` , выводится в контекстном меню, вызываемом щелчком правой кнопкой мыши:
image::images/filetype_60-dummytemplate.png[]
[start=10]
1. Выберите новый пункт меню; отображается имя и местоположение файла Abc.
image::images/filetype_60-information.png[]
Итак, было рассмотрено создание нового действия, доступного из контекстного меню для файла определенного типа, в окнах "Проекты", "Файлы" или "Избранное".
=== Открытие файла в окне
По умолчанию при открытии файла, тип которого был определен в этом учебном курсе, такой файл открывается в базовом редакторе. Однако иногда может потребоваться создать визуальное представление файла, и предоставить пользователю возможность перетаскивать элементы оформления в это визуальное представление. Первый этап создания подобного интерфейса пользователя - это предоставление пользователю возможности открытия файла в окне. В этом подразделе приведена последовательность необходимых действий.
[start=1]
1. Щелкните узел проекта правой кнопкой мыши и выберите в меню "Создать" команду "Оконный компонент". Установите для параметра "Позиция окна" значение "editor" и отметьте флажок "Открывать при запуске приложения", как показано ниже:
image::images/filetype_65-topc-1.png[]
[start=2]
1. Нажмите кнопку "Далее" и введите "Abc" в качестве префикса имени классов.
image::images/filetype_65-topc-2.png[]
Нажмите кнопку "Готово".
[start=3]
1. Измените ``DataObject`` : укажите использование `` link:http://bits.netbeans.org/dev/javadoc/org-openide-loaders/org/openide/loaders/OpenSupport.html[OpenSupport]`` вместо DataEditorSupport, для чего измените конструктор ``DataObject`` следующим образом:
[source,java]
----
public AbcDataObject(FileObject pf, MultiFileLoader loader)
throws DataObjectExistsException, IOException {
super(pf, loader);
CookieSet cookies = getCookieSet();
*//cookies.add((Node.Cookie) DataEditorSupport.create(this, getPrimaryEntry(), cookies));
cookies.add((Node.Cookie) new AbcOpenSupport(getPrimaryEntry()));*
}
----
[start=4]
1. Создайте класс `` link:http://bits.netbeans.org/dev/javadoc/org-openide-loaders/org/openide/loaders/OpenSupport.html[OpenSupport]`` :
[source,java]
----
class AbcOpenSupport extends OpenSupport implements OpenCookie, CloseCookie {
public AbcOpenSupport(AbcDataObject.Entry entry) {
super(entry);
}
protected CloneableTopComponent createCloneableTopComponent() {
AbcDataObject dobj = (AbcDataObject) entry.getDataObject();
AbcTopComponent tc = new AbcTopComponent();
tc.setDisplayName(dobj.getName());
return tc;
}
}
----
Настройте TopComponent: он должен расширять CloneableTopComponent, а не TopComponent. Установите для модификатора класса TopComponent и модификатора его конструктора параметр public вместо private.
Снова выполните модуль; когда при открытии файла Abc его открытие обрабатывается классом ``OpenSupport`` , обеспечивается открытие файла в ``TopComponent`` , а не в базовом редакторе, предоставляемом ``DataEditorSupport`` :
image::images/filetype_65-topc-3.png[]
В документе link:https://netbeans.apache.org/tutorials/nbm-visual_library.html[Руководство по Visual Library NetBeans] приведен пример дальнейшей разработки TopComponent для визуального отображения содержимого файла, соответствующего типу файла, определенному в этом руководстве.
=== Создание окна с несколькими представлениями
Теперь файл можно открыть в окне; добавим к этому окну дополнительные функциональные возможности. Создадим окно с несколькими представлениями. На первой вкладке окна с несколькими представлениями обычно выводится визуальное представление файла, а на второй вкладке обычно содержится представление исходного кода. Кроме этих двух можно использовать дополнительные закладки, содержащие более подробные данные об открытом файле.
[start=1]
1. Щелкните правой кнопкой узел проекта и выберите команду "Свойства". В диалоговом окне "Свойства проекта" выберите "Библиотеки" и нажмите "Добавить". Укажите зависимость от link:http://bits.netbeans.org/dev/javadoc/org-netbeans-core-multiview/overview-summary.html[окон с несколькими представлениями]. Нажмите кнопку "ОК", после чего нажмите кнопку "ОК" еще раз для закрытия диалогового окна "Свойства проекта".
[start=2]
1. Для каждой закладки, для которой требуется создать окно с несколькими представлениями, необходимо создать класс, реализующий `` link:http://bits.netbeans.org/dev/javadoc/org-netbeans-core-multiview/org/netbeans/core/spi/multiview/MultiViewDescription.html[MultiViewDescription]`` и ``Serializable`` .
В рамках этого учебного курса начнем с класса, который назовем ``AbcMultiviewDescription1`` . Этот класс реализует следующие указанные классы:
[source,java]
----
public class AbcMultiviewDescription1 implements MultiViewDescription, Serializable {
public int getPersistenceType() {
throw new UnsupportedOperationException("Пока не поддерживается.");
}
public String getDisplayName() {
throw new UnsupportedOperationException("Пока не поддерживается.");
}
public Image getIcon() {
throw new UnsupportedOperationException("Пока не поддерживается.");
}
public HelpCtx getHelpCtx() {
throw new UnsupportedOperationException("Пока не поддерживается.");
}
public String preferredID() {
throw new UnsupportedOperationException("Пока не поддерживается.");
}
public MultiViewElement createElement() {
throw new UnsupportedOperationException("Пока не поддерживается.");
}
}
----
В классе ``AbcMultiviewDescription1`` , приведенном выше, метод ``createElement()`` возвращает объект MultiViewElement. Однако требуется возвращать созданный ``TopComponent`` , для чего перейдем к следующему действию.
[start=3]
1. Перепишите сигнатуру класса. Для предоставления элемента с несколькими представлениями для описания в предыдущих действиях необходимо реализовать `` link:http://bits.netbeans.org/dev/javadoc/org-netbeans-core-multiview/org/netbeans/core/spi/multiview/MultiViewElement.html[MultiViewElement]`` :
[source,java]
----
public final class AbcTopComponent extends TopComponent implements MultiViewElement {
----
В классе ``TopComponent`` необходимо удалить (или закомментировать) методы ``findInstance()`` , ``getPersistenceType()`` , ``writeReplace()`` и ``preferredID()`` .
[start=4]
1. Для начала создадим очень простые реализации для каждого из требуемых методов. Сначала определим новый элемент ``JToolbar`` в верхней части класса ``TopComponent`` :
[source,java]
----
private JToolBar toolbar = new JToolBar();
----
Затем реализуем методы следующим образом:
[source,java]
----
public JComponent getVisualRepresentation() {
return this;
}
public JComponent getToolbarRepresentation() {
return toolbar;
}
public void setMultiViewCallback(MultiViewElementCallback arg0) {
}
public CloseOperationState canCloseElement() {
return null;
}
public Action[] getActions() {
return new Action[]{};
}
public Lookup getLookup() {
return Lookups.singleton(this);
}
public void componentShowing() {
}
public void componentHidden() {
}
public void componentActivated() {
}
public void componentDeactivated() {
}
public UndoRedo getUndoRedo() {
return UndoRedo.NONE;
}
----
[start=5]
1. Теперь переопределим ``AbcMultiviewDescription1`` следующим образом:
[source,java]
----
public class AbcMultiviewDescription1 implements MultiViewDescription, Serializable {
public int getPersistenceType() {
return TopComponent.PERSISTENCE_ALWAYS;
}
public String getDisplayName() {
return "Tab 1";
}
public Image getIcon() {
return ImageUtilities.loadImage("/org/myorg/abcfiletype/Datasource.gif");
}
public HelpCtx getHelpCtx() {
return null;
}
public String preferredID() {
return "AbcMultiviewDescription1";
}
public MultiViewElement createElement() {
return new AbcTopComponent();
}
}
----
[start=6]
1. Измените метод ``createCloneableTopComponent`` в классе ``OpenSupport`` для открытия ``TopComponent`` посредством класса ``MultiViewDescription`` , созданного выше:
[source,java]
----
protected CloneableTopComponent createCloneableTopComponent() {
// Создание массива дескрипторов множества представлений:
AbcMultiviewDescription1 firstTab = new AbcMultiviewDescription1();
MultiViewDescription[] descriptionArray = { firstTab };
// Создание окна с несколькими представлениями:
CloneableTopComponent tc = MultiViewFactory.createCloneableMultiView(descriptionArray, firstTab, null);
tc.setDisplayName(entry.getDataObject().getName());
return tc;
}
----
Второй аргумент метода ``MultiViewFactory.createCloneableMultiView`` определяет вкладку, открываемую по умолчанию. В данном случае выбрана вкладка ``firstTab`` , определяемая в ``AbcMultiViewDescription1`` .
[start=7]
1. Выполните установку и снова откройте файл. Теперь в окне с несколькими представлениями создана одна вкладка:
image::images/filetype_65-mvdeployed.png[]
Теперь в окне с несколькими представлениями создана одна вкладка. Для каждой дополнительной вкладки необходимо создать новый класс ``MultiviewDescription`` с новым элементом ``TopComponent`` , а затем создать экземпляр класса ``MultiViewDescription`` в классе расширения ``OpenSupport`` , как показано выше.
== Создание совместно используемого исполняемого файла модуля
Готовый модуль можно предоставить для использования другими разработчиками. Для этого необходимо создать и распространить двоичный файл "NBM" (модуль NetBeans).
[start=1]
1. В окне "Проекты" щелкните правой кнопкой мыши проект ``Abc File Type`` и выберите "Создать файл распространения модуля NBM".
Создается файл NBM, который можно просмотреть в окне "Файлы" (CTRL+2).
image::images/filetype_60-shareable-nbm.png[]
[start=2]
1. Чтобы предоставить этот файл для использования другим разработчикам, можно, например, воспользоваться link:http://plugins.netbeans.org/PluginPortal/[порталом подключаемых модулей NetBeans]. Для установки модуля получатель должен воспользоваться диспетчером подключаемых модулей ("Сервис > Подключаемые модули").
link:http://netbeans.apache.org/community/mailing-lists.html[Мы ждем ваших отзывов]
== Что дальше?
Дополнительные сведения о создании и разработке модулей NetBeans приведены в следующих ресурсах:
* link:https://netbeans.apache.org/platform/index.html[Домашняя страница платформы NetBeans]
* link:https://bits.netbeans.org/dev/javadoc/[Список интерфейсов API среды NetBeans (текущая версия разработки)]
* link:https://netbeans.apache.org/kb/docs/platform_ru.html[Другие связанные руководства]