#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. Тогда в большинстве случаев он будет вести себя правильно.