Как захватить значение ячейки TableViewer, где в eclipse e4 было активировано контекстное меню? - PullRequest
0 голосов
/ 07 ноября 2018

В одном из моих приложений eclipse e4 JMSToolBox некоторые данные отображаются в виде TableViewer
Контекстное меню определено в файле модели e4 (e4xmi) и связано с TableViewer следующим образом

menuService.registerContextMenu(tableViwere.getTable(), <name of the e4 part menu>);

Прикрепленный к контекстному меню в модели e4, «пункт меню» связан с классом "Dynamic Menu Contribution", который динамически добавляет пункты меню в меню:

public class VisualizerShowPayloadAsMenu {
   @Inject private EModelService       modelService;
   @AboutToShow
   public void aboutToShow(EModelService modelService, List<MMenuElement> items) {
      // Not the real code..., illustrate adding a dynamic menu item to the contextual menu
      MDirectMenuItem dynamicItem = modelService.createModelElement(MDirectMenuItem.class);
      dynamicItem.setLabel(<name..>);
      dynamicItem.setContributorURI(Constants.BASE_CORE_PLUGIN);// "platform:/plugin/org.titou10.jtb.core");
      dynamicItem.setContributionURI(Constants.VISUALIZER_MENU_URI);// "bundleclass://org.titou10.jtb.core/org.titou10.jtb.visualizer.ui.VisualizerShowPayloadAsHandler");
      items.add(dynamicItem);
   }

Теперь я хочу захватить данные в базовой ячейке, где было активировано контекстное меню, и вернуть это значение обратно в метод, аннотированный "@AboutToShow", чтобы добавить MDirectMenuItem записи в контекстное меню с меткой, содержащей это значение
Q: как это сделать с помощью eclipse rcp e4?

На прикрепленном рисунке щелчок правой кнопкой мыши произошел в ячейке с содержимым = "ID:414d5120514d41414544202020202020ee4bb25612666920". Я хотел бы вернуть это значение обратно в метод @AboutToShow и добавить пункты меню в меню "Open Payload as..." на основе этого значения Спасибо

enter image description here

1 Ответ

0 голосов
/ 14 ноября 2018

Я нашел способ сделать это!
Я не уверен, что это лучший способ, но, по крайней мере, он работает, и это довольно просто

Следующий код приведен здесь, чтобы проиллюстрировать идею, она не является допустимой Java. В части, которая управляет TableViewer:

TableViewer tableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
{...}
new TableViewerFocusCellManager(tableViewer, new JTBFocusCellHighlighter(tableViewer, windowContext));

JTBFocusCellHighlighter Класс:

public class JTBFocusCellHighlighter extends FocusCellHighlighter {
   private IEclipseContext windowContext;
   private Table           table;
   public JTBFocusCellHighlighter(ColumnViewer viewer, IEclipseContext windowContext) {
      super(viewer);
      this.windowContext = windowContext;
      this.table = ((TableViewer) viewer).getTable();
   }
   @Override
   protected void focusCellChanged(ViewerCell newCell, ViewerCell oldCell) {
      super.focusCellChanged(newCell, oldCell);
      // Capture the content of the cell (or other info..) and store it in Eclipse Context
      windowContext.set("key", newCell.getText());
      TableColumn tableColumn = table.getColumn(newCell.getColumnIndex());
   }
}

Реальная реализация кода: JTBSessionContentViewPart , JTBFocusCellHighlighter и FilterMenu

...