| // |
| // 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[Другие связанные руководства] |
| |