Невозможно открыть несколько выбранных файлов и папок с помощью Eclipse ShowInSystemExplorerHandler API - PullRequest
0 голосов
/ 12 июля 2020

Привет, я использую Eclipse ShowInSystemExplorerHandler API, он работает нормально, если я выберу один файл или папку. Но это не работает для множественного выбора файлов или папок. Ниже я привожу фрагмент кода. Пожалуйста, помогите мне, как решить эту проблему, чтобы я мог открывать несколько папок / файлов в c проводнике ОС. Кстати, я использую structuredSelection.forEach, чтобы открывать все файлы и папки.

Найдите код под кодом.

@SuppressWarnings("restriction")
public class OpenExplorerHandler extends AbstractHandler {
    
    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
        ISelectionService service = window.getSelectionService();
        IStructuredSelection structuredSelection = (IStructuredSelection) service.getSelection();

        structuredSelection.forEach( selctionElement -> {
            if (selctionElement instanceof IAdaptable) {
                IResource resource = (IResource) ((IAdaptable) selctionElement).getAdapter(IResource.class);
                File selectedFileFolder = resource.getLocation().toFile();
                String filePath = selectedFileFolder.getAbsolutePath();
                
                ECommandService commandService = PlatformUI.getWorkbench().getService(ECommandService.class);
                EHandlerService handlerService = PlatformUI.getWorkbench().getService(EHandlerService.class);
                Command command = commandService.getCommand(ShowInSystemExplorerHandler.ID);
                
                if (command.isDefined()) {
                    ParameterizedCommand parameterizedCommand = commandService
                        .createCommand(ShowInSystemExplorerHandler.ID, Collections.singletonMap(
                                        ShowInSystemExplorerHandler.RESOURCE_PATH_PARAMETER, filePath));
                    if (handlerService.canExecute(parameterizedCommand)) {
                        handlerService.executeHandler(parameterizedCommand);
                    }
                }
            }
        });
        
        return null;
    }
}

1 Ответ

0 голосов
/ 13 июля 2020

Реализация обработчика команд ShowInSystemExplorerHandler оказывается довольно странной. Хотя вы можете передать ресурс для открытия в качестве параметра (что вы и делаете), он по-прежнему смотрит на количество выбранных в данный момент элементов, чтобы определить, включен ли обработчик, и будет включен только тогда, когда выбран ровно один элемент.

Если вы отлаживаете код, вы увидите, что handlerService.canExecute(parameterizedCommand) возвращает false, потому что выбрано более одного элемента.

Так что не похоже, что вы можете использовать это напрямую с несколькими выбранными элементами.

Что вы можете сделать, так это определить свою собственную команду и обработчик, которые вызывают тот же код. Что-то вроде:

   <extension
      point="org.eclipse.ui.commands">
   <command
         categoryId="org.eclipse.ui.category.navigate"
         name="show in explorer"
         id="my.showInSystemExplorer"
         description="Show in Explorer">
      <commandParameter
            id="org.eclipse.ui.ide.showInSystemExplorer.path"
            name="Resource path"
            optional="false">
      </commandParameter>
   </command>
</extension>
 <extension
      point="org.eclipse.ui.handlers">
   <handler
         class="org.eclipse.ui.internal.ide.handlers.ShowInSystemExplorerHandler"
         commandId="my.showInSystemExplorer">
    </handler>
 </extension>

Затем замените ShowInSystemExplorerHandler.ID в коде на идентификатор вашей команды (my.showInSystemExplorer в примере).

...