如何在NetBeans中添加钩子来保存现有DataObject的事件?

时间:2014-09-12 11:30:01

标签: java netbeans netbeans-platform netbeans-plugins

我想在每次保存特定DataObject时进行一些处理。如果我正确理解NetBeans IDE API,则可以使用Savable接口来实现自定义编辑器的保存选项。这里的问题是我不想实现自己的编辑器,也不想实现DataObject。我有一个MIME类型,由默认的Gsf编辑器(通用脚本语言api)编辑,并有一个GsfDataObject(我期望与DOSavable)。我想保留所有这些,只是为了添加一个钩子,可能是一个回调方法或者其他东西,每次在给定的GsfDataObject上进行保存时都会调用它(我想要调用默认的保存操作,我不想覆盖它。)

到目前为止,我来到这个简单的解决方案,但它似乎很难看(它或多或少受到http://wiki.netbeans.org/DevFaqListenForSaveEvents的启发):

// I have a FileObject fobj    
final DataObject dobj = DataObject.find(fobj);
dobj.addPropertyChangeListener(new PropertyChangeListener() {
   @Override
   public void propertyChange(PropertyChangeEvent evt) {
      if (evt.getPropertyName().equals(DataObject.PROP_MODIFIED)) {
         if (!((Boolean) evt.getOldValue()) & ((Boolean) evt.getNewValue())) {
            System.out.println(">>>> here it gets modified");
         } else {
            System.out.println(">>>> here the data object gets saved");
         }
      }
   }
});

但是,仅在保存完成时才会调用此方法,但是在修改文件时也不会调用此方法,但是Ctrl + Z会恢复修改。它仅检查数据对象是否将其状态从修改更改为未修改。有没有办法只挂钩保存事件?

P.S。:我试图调用新的SJDOSavable(dobj).add();在DataObject被修改然后在另一个分支中删除它的那一刻。但是,不会调用handleSave方法。 SJDOSavable类是根据DataSystems API中的DOSavable实现的简单Savable:

private static final class SJDOSavable extends AbstractSavable implements Icon {
   final DataObject obj;

   public SJDOSavable(DataObject obj) {
      this.obj = obj;
   }

   @Override
   public String findDisplayName() {
      return obj.getNodeDelegate().getDisplayName();
   }

   @Override
   protected void handleSave() throws IOException {
      System.out.println(">>>>> but this does not get called"); 
   }

   @Override
   public boolean equals(Object other) {
      if (other instanceof SJDOSavable) {
         SJDOSavable dos = (SJDOSavable) other;
         return obj.equals(dos.obj);
      }
      return false;
   }

   @Override
   public int hashCode() {
      return obj.hashCode();
   }

   final void remove() {
      unregister();
   }

   final void add() {
      register();
   }

   @Override
   public void paintIcon(Component c, Graphics g, int x, int y) {
      icon().paintIcon(c, g, x, y);
   }

   @Override
   public int getIconWidth() {
      return icon().getIconWidth();
   }

   @Override
   public int getIconHeight() {
      return icon().getIconHeight();
   }

   private Icon icon() {
      return ImageUtilities.image2Icon(obj.getNodeDelegate().getIcon(BeanInfo.ICON_COLOR_16x16));
   }
}

1 个答案:

答案 0 :(得分:1)

你试过这个吗?

http://wiki.netbeans.org/DevFaqListenForSaveEvents

此外,如果您想收听全局保存事件,您现在似乎可以这样做。

https://netbeans.org/bugzilla/show_bug.cgi?id=140719