#java #netbeans #netbeans-platform #netbeans-plugins
#java #netbeans #netbeans-платформа #netbeans-плагины
Вопрос:
Я пытаюсь создать новую языковую поддержку для NetBeans 7.4 и выше.
Когда файлы сохраняются локально, мне нужно развернуть их на сервере. Итак, мне нужно обработать событие сохранения. Я сделал это, реализуя Savable:
public class VFDataObject extends MultiDataObject implements Savable {
.......
@Override
public void save() throws IOException {
.......
}
}
И это отлично сработало для события сохранения. Но потом я понял, что мне нужно расширить HtmlDataObject вместо MultiDataObject:
public class VFDataObject extends HtmlDataObject implements Savable {
.......
@Override
public void save() throws IOException {
.......
}
}
И теперь функция save () не выполняется. Почему? Поскольку HtmlDataObject расширяет MultiDataObject. Что нужно сделать, чтобы это сработало?
Также есть ли способ перехватить все события сохранения в NetBeans? Есть ли у вас какая-либо информация о том, изменилось ли что-либо в 8.0 в этом отношении?
Большое спасибо.
Ответ №1:
Вы пробовали OnSaveTask SPI (https://netbeans.org/bugzilla/show_bug.cgi?id=140719 )? API может использоваться для выполнения задач при сохранении файлов заданного типа.
Что-то вроде этого можно использовать для прослушивания всех событий сохранения для данного типа MIME (в данном случае «text / x-sieve-java»):
public static class CustomOnSaveTask implements OnSaveTask {
private final Context context;
public CustomOnSaveTask(Context ctx) {
context = ctx;
}
@Override
public void performTask() {
System.out.println(">>> Save performed on "
NbEditorUtilities.getDataObject(context.getDocument()).toString());
}
@Override
public void runLocked(Runnable r) {
r.run();
}
@Override
public boolean cancel() {
return true;
}
@MimeRegistration(mimeType = "text/x-sieve-java", service = OnSaveTask.Factory.class, position = 1600)
public static class CustomOnSaveTaskFactory implements OnSaveTask.Factory {
@Override
public OnSaveTask createTask(Context cntxt) {
return new CustomOnSaveTask(cntxt);
}
}
}
Комментарии:
1. Я не могу найти много информации о OnSaveTask. Что, если я хотел бы обрабатывать несколько типов mime? Нужно ли мне создавать новый класс для обработки этого, или я каким-то образом могу обрабатывать сохранения для всех файлов, которые мне нужны, в одном месте? Как мне заставить это работать для приложения-плагина NetBeans, просто создав класс? Еще раз спасибо.
2. Я также не очень разбираюсь в NetBeans API, с этим
OnSaveTask
я столкнулся при реализации одного плагина, и даже в конце мне пришлось решать свою проблему с помощью другого API. Поскольку@MimeRegistration
аннотацию нельзя использовать несколько раз, вам нужно либо создать несколько классов для нескольких типов mime, либо вы можете использовать один класс и зарегистрировать его для нескольких типов mime вручную вlayer.xml
(я не пробовал, но, насколько я знаю NB API, это должно работать). Единственная проблема с этим может быть в том случае, если вы заранее не знаете всех типов mime. Это ваш случай?3. В случае, если вы заранее не знаете типы mime, вы можете взглянуть на ListeningOnSaveEvents , где кратко показано, как следить за сохранением всех открытых файлов в редакторе NB. Однако это не только событие сохранения всех, вы получите уведомление обо всех событиях сохранения. В моем плагине мне нужно было следить только за одним объектом dataobject заданного типа mime, поэтому я попробовал
OnSaveTask
, а затем по некоторым практическим причинам я использовал толькоPropertyChangeListener
для данного объекта данных (я создал объект данных, чтобы у меня была ссылка на него).4. Попробовал это, и это отлично сработало для событий save и saveAll.