快速业务通道

扩展NetBeans IDE 6.0中的C/C++编辑器以提供标记实例的高亮

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
   <folder name="x- c">
        <file name="org-netbeans-modules- markoccurrences-MarkOccurrencesHighlightsLayerFactory.instance" />
      </folder>
    </folder>
   </folder>
</filesystem>

现在我们已经准备好第一次 运行我们的高亮显示器了。

生成项目。

项目成功生成后,运行它。

打开我们在前一节中创建的 Args 项目。

在编辑器中打开 args.c 文件, 并单击文件中的任一位置。高亮显示看起来就会像下面的例子一样:

扩展NetBeans IDE 6.0中的C/C++编辑器以提供标记实例的高亮

太棒 了。我们的高亮显示工作了。现在我们来教它变得更有用。

从 C/C++ 语言模型收 集信息

在 MarkOccurrencesHighlighter.java 类中,删除我们粗略实现的 caretUpdate() ,并添加以下代码:private WeakReference<CsmFile> weakFile;
public void caretUpdate(CaretEvent e) {
  bag.clear ();
  CsmFile file = getCsmFile();
  if (file != null) {
     CsmReference ref = CsmReferenceResolver.getDefault().findReference(file, e.getDot());
    if (ref != null && ref.getReferencedObject() != null) {
      Collection<CsmReference> out = CsmReferenceRepository.getDefault().getReferences(ref.getReferencedObject(), file, true);
      for (CsmReference csmReference : out) {
         bag.addHighlight(csmReference.getStartOffset(), csmReference.getEndOffset(), defaultColors);
      }
     }
  }
}
private CsmFile getCsmFile() {
  if (weakFile == null || weakFile.get() == null) {
    if (weakDoc == null || weakDoc.get() == null) {
      return null;
    }
    DataObject dobj = NbEditorUtilities.getDataObject(weakDoc.get ());
    CsmFile file = CsmUtilities.getCsmFile(dobj, false);
     if (file != null) {
      weakFile = new WeakReference<CsmFile>(file);
    } else {
       return null;
    }
  }
  return weakFile.get();
}

在 caretUpdate() 方法中,我们使用 CsmReferenceResolver 来查找光标下对语 言实体的引用。如果存在有效的实体,我们就向 CsmReferenceRepository 询问文件中所 有相同实体的出现位置并存储它们的偏移量。getCsmFile() 方法是一段衔接代码,用来 确保我们不保留任何语言模型数据。

按下 Ctrl-Shift-I 以修复导入(或者右键 单击,然后选择“修复导入”)。

生成并运行项目。

如果把鼠 标放到 main() 的 argc 参数上,您就将看到如下的高亮显示:

扩展NetBeans IDE 6.0中的C/C++编辑器以提供标记实例的高亮

单击 文件的不同位置以查看标记实例是怎样工作的。您也许想尝试更复杂的项目中以查看它怎 样与类、宏等等协同工作。

提高性能

对静态文本来说,我们当前的代码足够好 了,但将在编辑文件的过程中产生严重的延迟。出现延迟的原因是我们每按下一个键,就 立即开始搜索。要解决这个问题,我们将推迟任务以分析代码,如果鼠标位置在任务开始 前改变了,我们就取消并重新计划任务。

在 MarkOccurrencesHighlighter.java 类中,把先前的 caretUpdate() 实现更改为以下代码:

public void caretUpdate(CaretEvent e) {
  bag.clear();
  lastCaret = e.getDot();
  scheduleUpdate();
}
private int lastCaret;
private RequestProcessor.Task task = null;
private final static int DELAY = 1000;

public void scheduleUpdate() {
  if (task==null) {
    task = RequestProcessor.getDefault().create(ne

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号