Используйте org.eclipse для вырезания / копирования / вставки в пользовательском приложении RCP

#eclipse #editor #copy #rcp #cut

#eclipse #редактор #Копировать #rcp #вырезать

Вопрос:

Я разрабатываю приложение RCP, и мне нужно вырезать / скопировать / вставить в это приложение. Поскольку уже есть команды, которые доставляются eclipse (org.eclipse.ui.edit.copy, …) Я хочу использовать их (я уже добавил их, например, на панель инструментов) в редакторе. Я немного поиграл, но я не понимаю, как я могу реагировать на команду копировать / вставить. Например. как мне получить информацию в редакторе, если что-то было скопировано или вставлено?

Есть ли простой способ использовать команды, подобные команде сохранения. Там мне просто нужно реализовать ISaveablePart, а затем вызываются методы doSave () или doSaveAs()…Мне это действительно нравится, но я не нашел интерфейсы ICopyablePart, … 😉

Ответ №1:

Если вам требуется определенное поведение для копирования (или любая команда) в вашем редакторе или представлении, вам следует активировать обработчик для этого. Обычно в вашем createPartControl(Composite) методе:

 IHandlerService serv = (IHandlerService) getSite().getService(IHandlerService.class);
MyCopyHandler cp = new MyCopyHandler(this);
serv.activateHandler(org.eclipse.ui.IWorkbenchCommandConstants.EDIT_COPY, cp);
  

Другой распространенный способ — предоставить обработчик через ваш plugin.xml:

 <handler commandId="org.eclipse.ui.edit.copy"
         handler="com.example.app.MyCopyHandler">
   <activeWhen>
      <with variable="activePartId">
         <equals value="com.example.app.MyEditorId"/>
      </with>
   </activeWhen>
</handler>
  

Затем в вашем обработчике вы получите активную часть и вызовете для нее свою реализацию копирования. например:

 IWorkbenchPart part = HandlerUtil.getActivePart(event);
if (part instanceof MyEditor) {
    ((MyEditor)part).copy();
}
  

Комментарии:

1. Привет, Пол, я пробовал оба способа. Но я всегда получаю это исключение: «Нет обработчика для выполнения команды org.eclipse.ui.edit.copy». Вы знаете, почему я это получаю?

2. Привет, Пол, я решил проблему. Это происходит, если isHandled() возвращает значение false… Возврат true вызовет метод execute…

3. Попробуйте создать подкласс AbstractHandler вместо реализации IHandler. Тогда в большинстве случаев он будет вести себя правильно.