NetBeans Editor Extension 模块教程
反馈
本教程演示如何创建扩展 IDE 的一个编辑器所提供功能的模块。IDE 具有几个编辑器,例如 XML 编辑器、Java 编辑器、JSP 编辑器和 SQL 编辑器。一般情况下所有 IDE 的编辑器都统称为源码编辑器 (Source Editor)。但是,每个编辑器是不同的,它的功能以它所在的文件类型为目标。在本教程中,您向 XML 编辑器添加一个操作。创建和安装该模块之后,您打开 XML 文件,该编辑器的上下文菜单将包含在 Output 窗口中显示 XML 文件标记的菜单项。
本教程将介绍以下主题:
安装完软件之后,本教程可以在 45 分钟之内完成。
有关使用模块的详细信息,请参阅 NetBeans 网站上的 NetBeans Development Project 主页。如果有问题,请访问 NetBeans Developer FAQ 或使用本页顶部的反馈链接。
安装软件
开始之前,需要在您的计算机上安装以下软件:
- NetBeans IDE 5.0(下载)
- Java Standard Development Kit (JDK™) version 1.4.2(下载)或 5.0(下载)
安装示例
采用以下步骤来安装示例:
- 解压缩附加的文件。
- 在 IDE 中,选择 File > Open Project,然后浏览到包含已解压缩文件的文件夹。打开模块项目。其形式如下:
- 右键单击项目节点并在 Target Platform 中选择 Install/Reload。将打开目标平台并安装该模块。
- 通过使用该模块来验证其是否已正确安装,如使用模块部分所述。
知道了最终结果后,将从头开始创建模块,并且在创建的同时了解每个部分。
设置模块项目
开始编写模块前,必须确保正确地设置了项目。NetBeans IDE Dev 提供一个向导,用于设置模块所需的所有基本文件。
创建模块项目
- 选择 File > New Project (Ctrl-Shift-N)。在 Categories 下,选择 NetBeans Plug-in Modules。在 Projects 下,选择 Module Project 并单击 Next。
- 在 Name and Location 面板中,在 Project Name 中键入 ShowXMLStructure。将 Project Location 更改为您计算机上的任何目录,如 c:\mymodules。选中 Standalone Module 单选按钮。选中 Set as Main Project 复选框。单击 Next。
- 在 Basic Module Configuration 面板中,用 myorg 替换 Code Name Base 中的 yourorghere 并将 ShowXMLStructure 更改为 xmltree,从而整个 Code Name Base 为 org.myorg.xmltree。向 Module Display Name 中添加空格将其更改为 Show XML Structure。留出本地化包和 XML 层的位置,以便它们存储在名为 org/myorg/xmltree 的包中。单击 Finish。
IDE 创建 Show XML Structure 项目。该项目包含所有资源和项目元数据,如该项目的 Ant 构建脚本。该项目在 IDE 中打开。您可以在 Projects 窗口 (Ctrl-1) 中查看其逻辑结构,在 Files 窗口 (Ctrl-2) 中查看其文件结构。例如,现在 Projects 窗口应该如下所示:
有关以上每个文件的基本信息,请参阅 NetBeans 插件模块的快速入门指南。
指定模块的依存关系
您需要将几个属于 NetBeans API 的类设为子类。每个类都将被声明为模块依存关系。使用 Project Properties 对话框来执行此操作。
- 在 Projects 窗口中,右键单击 System Properties 项目,然后选择 Properties。
- 对于以下每个 API,在 Libraries 面板中,单击“Add...”,从 Module 列表中选择名称,然后单击 OK 确认:
- I/O APIs
- Nodes API
- Text API
- Utilities API
- Window System API
- 单击 OK,退出 Project Properties 对话框。
- 在 Projects 窗口中,双击 Project Metadata 并注意您选择的 API 是否声明为模块依存关系:
编写模块代码
创建操作
- 右键单击项目节点并选择 New > File/Folder。在 Categories 下,选择 NetBeans Module Development。在 Projects 下选择 Action。单击 Next。
- 在 Action Type 面板中,单击 Conditionally Enabled。选择 EditorCookie,它是允许 Source Editor 访问该 action 的类名称,如下所示:
单击 Next。
- 在 GUI Registration 面板中,选择 Category 下拉列表中的“Edit”类别。Category 下拉列表控制操作在 IDE 的 Keyboard Shortcuts 编辑器中显示的位置。接下来,选择 Editor Contect Menu Item,然后选择 text/xml MIME 类型,如下所示:
注意到您可以设置菜单项的位置,并且可以将它与其之前和之后的菜单项分离。单击 Next。
- 在 Name and Location 面板中,键入 ShowXMLStructureAction 作为 Class Name,并键入 Show XML Structure Action 作为 Display Name。上下文菜单提供的菜单项不显示图标。因此,单击 Finish,ShowXMLStructureAction.java 便添加到包中。
- 在 Source Editor 中,向 performAction 方法中添加以下代码:
public void performAction(Node[] activatedNodes) {
EditorCookie cookie = (EditorCookie)activatedNodes[0].getCookie(EditorCookie.class);
String tabName = NbBundle.getMessage(ShowXMLStructureAction.class,"LBL_tabName");
// "XML Tree" tab is created in output window for writing the list of tags
InputOutput io = IOProvider.getDefault().getIO(tabName,false);
io.select(); //XML Tree tab is selected
OutputWriter writer = io.getOut();
try {
writer.reset(); //clean the output window
java.io.InputStream is = ((org.openide.text.CloneableEditorSupport)cookie).getInputStream();
parse(new InputSource(is));
is.close();
for (int i=0;i<tags.length;i++) {
writer.println(tags[i]); //write tag to output window
}
} catch (IOException ex) {
} catch (SAXException ex){
writer.println("Parse Error: "+ex.getMessage());
}
writer.flush();
writer.close();
}
- 添加新方法:
/** Parses XML document and creates the list of tags
*/
private void parse(InputSource is) throws IOException, SAXException {
XMLReader xmlReader = XMLUtil.createXMLReader();
TagHandler handler = new TagHandler();
xmlReader.setContentHandler(handler);
xmlReader.parse(is);
tags = handler.getTags();
}
- 在源文件的顶部声明 tags 变量:
private String[] tags;
- 按 Alt-Shift-F。IDE 会自动将 import 声明添加到类的顶部。某些代码仍然标有红色下划线,表示并不是所有所需的包都位于该类路径上。右键单击项目节点,选择 Properties,然后在 Project Properties 对话框中,单击 Libraries。在 Libraries 窗格的顶部单击 Add 并添加 Dialogs API。
在 ShowXMLStructureAction.java 类中,再次按 Alt-Shift-F。由于 IDE 在 Dialogs API 中找到了所需的包,因此红色下划线消失。
本地化操作
- 将显示名称添加到 Bundle.properties 文件:
ACT_name=Show XML Structure
LBL_tabName=XML Structure
- 按 Ctrl-S 保存文件。
创建标记句柄
- 在 Projects 窗口中,展开项目节点,然后展开 Source Packages 节点,接着右键单击 org.myorg.xmltree 节点。选择 New > File/Folder。在 Categories 下选择 Java Classes。在 File Types 下,选择 Java Class。单击 Next 并在 Class Name 中键入 TagHandler。单击 Finish。新 Java 类将在 Source Editor 中打开。
- 用以下代码替换默认代码:
package org.myorg.xmltree;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
/** Specific XML handler used for creating list of starting and ending tags, e.g. :
* <AAA>
* <BBB>
* <CCC/>
* </BBB>
* </AAA>
*/
public class TagHandler extends org.xml.sax.helpers.DefaultHandler {
private final int indentLength=2;
private java.util.List tagList;
private String indent;
private String space;
private String lastElement;
TagHandler() {
tagList = new java.util.ArrayList();
StringBuffer indentBuf = new StringBuffer();
for (int i=0;i<indentLength;i++) indentBuf.append(' ');
space=indentBuf.toString();
indent="";
}
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
tagList.add(indent+"<"+qName+">");
indent+=space;
lastElement=qName;
}
public void endElement(String uri, String localName, String qName) throws SAXException {
indent=indent.substring(indentLength);
if (qName.equals(lastElement)) {
int lastIndex = tagList.size()-1;
String lastInList = (String)tagList.get(lastIndex);
String replacedString = lastInList.replace(">","/>");
tagList.set(lastIndex,replacedString);
} else {
tagList.add(indent+"</"+qName+">");
}
lastElement=null;
}
String[] getTags() {
String[] tags = new String[tagList.size()];
tagList.toArray(tags);
return tags;
}
}
- 按 Ctrl-S 保存文件。
构建和安装模块
IDE 使用 Ant 构建脚本来构建和安装您的模块。构建脚本是创建模块项目时为您创建的。
安装模块
使用模块
- 选择 File > New Project (Ctrl-Shift-N) 创建一个新项目。
- 在 Files 窗口 (Ctrl-2) 中,展开项目节点,接着展开 nbproject 节点。双击 build-impl.xml,以便它在 Source Editor 中打开。
- 右键单击 Source Editor 中的任何位置并注意名为“Show XML Structure”的新弹出菜单项:
- 选择该菜单项并注意标记句柄将所有标记打印到位于 IDE 底部的 Output 窗口:
- 新文件类型将在 Source Editor 中打开。例如,打开一个 Java 类。右键单击 Source Editor 中的任何位置并注意上下文菜单中不包含新的弹出菜单项:
创建可共享的模块二进制文件
- 在 Projects 窗口中,右键单击 Show XML Structure 项目,并选择 Create NBM。
将创建 NBM 文件并且可以在 Files 窗口中查看它 (Ctrl-2):
- 通过电子邮件使其他人也可以使用。
卸载模块
- 关闭您安装模块时打开的 IDE 或 Platform 实例。
- 在 Projects 窗口中右键单击该项目节点,并选择 Clean。现在您将不再有模块安装在 IDE 或 Platform 中。
下一步
有关创建和开发模块的更多信息,请参见以下资源:
版本控制
|
版本
|
日期
|
更改
|
|
1
|
2005 年 7 月 11 日
|
初始版本
|
|
2
|
2005 年 9 月 27 日
|
- 添加了 Action 向导
- 将“NetBeans Tag Handler 插件教程”重新命名为“NetBeans Source Editor Extension 模块教程”。
- 添加了下面的事件 7。
|
|
3
|
2005 年 9 月 28 日
|
- 由于“Source Editor”不包含 SQL 编辑器(还可以在本教程中使用一些步骤进行扩展),因此,对该教程进行重新命名。
- 重新编写介绍性段落。
|
|
事件编号
|
描述
|
状态
|
|
1
|
代码和教程本身需要检查。
|
有待解决。
|
|
2
|
阶段 III 和阶段 IV 完成之后,需要更新教程。
|
有待解决。
|
|
3
|
本教程中使用的一些 API 拥有已废弃的方法。这将在 Output 窗口中产生错误,但是不应该影响模块的功能。
|
有待解决。
|
|
4
|
将为所有 API、类和方法添加清晰的解释和到 Javadoc 的链接。还要添加每个依存关系的链接以及本教程需要它们的原因。
|
有待解决。
|
|
5
|
应该提到 JSP 编辑器、HTML 编辑器等其他标识符。例如,不使用“xml”(在 layer.xml 中),而使用“html”、“x-properties”、“base”等等。
|
有待解决。
|
|
6
|
解释什么是 cookie。解释什么是 cookie 操作。
|
有待解决。
|
|
7
|
由于当前在可下载的代码中标记句柄和显示 XML 操作是单独的文件,而它们又是相同的文件,因此需要更改可下载代码。由于相同的原因,也必须更改一个文件的屏幕截图,而不是更改上面显示的两个文件的屏幕截图。
|
有待解决。
|