Обработка событий Eclipse Scout Tree View

В настоящее время я пишу приложение для визуализации данных с Eclipse Scout Framework. Он основан на шаблоне скаутского проекта "Схема дерева и форма таблицы". Что меня смущает, так это обработка событий в Outline Tree. Как вы, возможно, знаете, различные страницы / узлы в дереве автоматически активируются / создаются и отображаются при нажатии на узлы без какой-либо пользовательской реализации. Я хочу изменить это поведение так, чтобы контекстное меню открывалось при щелчке правой кнопкой мыши по узлу, чтобы удалить его на втором шаге. По этой причине я переписал метод execNodeClick() в StandardOutline, чтобы он выглядел так:

 @Override
  protected void execNodeClick(ITreeNode node, MouseButton mouseButton) throws ProcessingException {
    if (mouseButton == MouseButton.Right && node instanceof ConnectionNodePage) {
      ConnectionNodePage clickedConnectionNode = (ConnectionNodePage) node;
      logger.debug("Right click on ConnectionNode " + node);
      List<AbstractMenu> menuList = new ArrayList<>();
      menuList.add(new AbstractMenu() {
        @Override
        protected String getConfiguredText() {
          // TODO Auto-generated method stub
          return "delete";
        }
        @Override
        protected void execAction() throws ProcessingException {
          ServerConfigService serverConfigService = SERVICES.getService(ServerConfigService.class);
          serverConfigService.removeServerConnection(clickedConnectionNode.getConnection());
          StandardOutline.this.removeChildNode(StandardOutline.this.getRootNode(), clickedConnectionNode);
        }
      });
      clickedConnectionNode.setMenus(menuList);
    }
  }

Я не знаю, является ли это рекомендуемым способом динамического добавления контекстного меню к узлу дерева, но это работает как-то так:P Однако у этого подхода есть несколько проблем:

  1. По какой-то причине узлы должны быть нажаты / активированы до (следующего щелчка) открытия контекстных меню.
  2. В клиенте RAP можно видеть, что пустые контекстные меню также открываются для страниц, которые не удовлетворяют условию "instanceofofingNodePage узла", хотя регистрация / отладка показывает, что условие работает нормально. Я предполагаю, что движок Scout находит анонимный класс внутреннего меню и делает с ним что-то непредсказуемое. В SWT-клиенте вы не видите контекстные меню для неправильных страниц.
  3. Я подозреваю, что моя обработка событий усложняется внутренней обработкой событий скаута. Я действительно не знаю, какой тип обработки событий Scout выполняет по умолчанию при щелчке правой кнопкой мыши по узлам дерева, но он определенно делает то, чего я не хочу. Поэтому я хотел бы отключить любое действие при щелчке правой кнопкой мыши, кроме моей пользовательской реализации выше.

Я был бы признателен, если бы кто-то показал мне, как работает этот механизм и где я должен внести соответствующие изменения или хотя бы намекнуть, где я должен искать. Заранее спасибо!

1 ответ

Решение

Мне стыдно! Зачем держать вещи простыми, когда они могут быть сложными? -.-

Чтобы ответить на мой собственный вопрос и, возможно, помочь другим, может не хватать леса за деревьями:

Eclipse Scout предлагает встроенную опцию для добавления контекстных меню на страницы / узлы без необходимости какой-либо собственной обработки событий мыши.

Вам просто нужно добавить внутренний класс, расширяющий AbtractMenu/AbstractExtensibleMenu, на страницу, для которой вы хотите контекстное меню. Разведчик вычисляет это автоматически, чтобы открыть его как контекстное меню, вызываемое правой кнопкой мыши на соответствующем узле в дереве.

Для минимальной реализации меню вам нужно только переопределить метод execAction() класса AbstractMenu для выполнения действий после щелчка и переопределить метод getConfiguredText(), чтобы установить желаемый текст для отображения меню в вашем новом классе меню. Таким образом вы избегаете странного поведения, которое я обнаружил при первом подходе.

Я надеюсь, что этот ответ сэкономит кому-то часы, которые я потратил впустую

Другие вопросы по тегам