Контекстно-зависимая справка для AbstractGraphicalEditPart(GMF)

проблема проста: чтобы добавить контекстно-зависимую справку, я выполнил стандартные шаги, но однажды я попытался связать БЛОКИ с идентификаторами КОНТЕКСТА с помощью SetHelp() из IWorkbenchHelpSystem. Первый аргумент должен быть либо Control(swt), либо IAction.
void setHelp(Control control, String helpContextId);. Как я могу ссылаться на Control из типа объекта damos.dml.Block? org.eclipselabs.damos.dml.blockTypes

К вашему сведению, я пробовал и посещал все содержимое этих сайтов.

Методы отображения и поиска работают правильно, но мне просто нужно настроить справку, а не отображать ее, чтобы только при вызове справки (F1 или ctrl+F1) показывалась контекстная справка.

Спасибо. После попытки я подумал, что, возможно, этот обходной путь даст мне тот же результат, но NADA.

private Block getBlock() {
        EObject semanticElement = resolveSemanticElement();
        if (semanticElement instanceof Block) {
            Block block = (Block) semanticElement;
            PlatformUI.getWorkbench().getHelpSystem().search(block.getType().getName());
//PlatformUI.getWorkbench().getHelpSystem().setHelp(?, Activator.HELP_VIEW); Cannot cast block directly to Control 
PlatformUI.getWorkbench().getHelpSystem().displayHelp(Activator.HELP_VIEW);
                return block;
            } else {
                return null;
            }
        }

 @Override
protected NodeFigure createMainFigure() {
    blockFigure = new BlockFigure();
    // OB: java.awt.event.KeyEvent.VK_F1 is wrong, use SWT.F1
    blockFigure.setFocusTraversable(true);
    blockFigure.setRequestFocusEnabled(true);
    blockFigure.addMouseListener(new MouseListener.Stub() {
        @Override
        public void mousePressed(final MouseEvent me) {
            blockFigure.requestFocus();
        }
    });
    blockFigure.addKeyListener(new KeyListener.Stub() {

        @Override
        public void keyReleased(KeyEvent ke) {

        }

        @Override
        public void keyPressed(KeyEvent ke) {
            if (ke.keycode == SWT.F1) {
                PlatformUI.getWorkbench().getHelpSystem().search(getBlock().getType().getName());
                PlatformUI.getWorkbench().getHelpSystem().displayHelp(Activator.HELP_VIEW);
            }
        }
    });
    return blockFigure;
}

Любая помощь приветствуется!


person Community    schedule 10.04.2019    source источник
comment
Что такое damos.dml.Block? Справка рабочей среды работает только с объектами пользовательского интерфейса, это объект пользовательского интерфейса?   -  person greg-449    schedule 10.04.2019
comment
org.eclipselabs.damos.dml.Block Я так же ничего не знаю об этом, как и вы. Мне дали инструмент, который использует rcp и имеет редактор диаграмм, где вы можете перетаскивать так называемые блоки, чтобы создать диаграмму SPS, которая будет преобразована в программу.   -  person    schedule 10.04.2019
comment
Поскольку первоначальный программист имел в виду, что как только я смогу получить управление SWT за фигурами блоков, которые являются частью формирования блока. Я так понимаю, они рассматриваются как объект пользовательского интерфейса.   -  person    schedule 10.04.2019
comment
Как вы видели, вы можете установить справку только для какого-либо элемента управления SWT, поэтому вам необходимо понимать элементы управления, которые использует этот редактор.   -  person greg-449    schedule 10.04.2019
comment
Хорошо, как насчет этого, я могу добавить KeyListener в свои Blockfigures, но это не событие swt, а событие draw2d. (org.eclipse.draw2d.Figure.class) Но вызов event.keyCode = java.awt.event.KeyEvent.VK_F1 для клавиши справки F1, похоже, не работает, как я думал!   -  person    schedule 10.04.2019
comment
Избегайте FocusControl может работать для AW, но по опыту это создает проблемы. Может быть, попробуйте это javatips.net/api/EPF-Composer-master/1.5/plugins/   -  person    schedule 24.04.2019


Ответы (1)


   public String getSelection() {
            String blockName = "SelectBlock";
            EObject element = null;
            EditPart part = getDiagramEditPart();
            EditPartViewer viewer = part.getViewer();
            List selectedList = viewer.getSelectedEditParts();
            try {
                GraphicalEditPart editPart = (GraphicalEditPart) selectedList.get(0);
                BlockEditPart blockPart = (BlockEditPart) editPart;
                viewer.getProperty("BlockFigure");
                NodeImpl node = (NodeImpl) blockPart.getModel();
                element = node.getElement();
            } catch (IndexOutOfBoundsException e) {
                // TODO: handle exception
                e.printStackTrace();
            }

            ISelection selection1 = viewer.getSelection();// EURêKA

            if (element instanceof Block) {
                Control control2 = getGraphicalViewer().getControl();
                blockName = ((Block) element).getType().getName();
                return blockName;
                // return part.getParent().getSelected();
            }
            return "SelectBlock";
        }

у меня есть возможность выбрать тип блока CTRL+F1 и вуаля, показано определение справки указанного блока.

person Community    schedule 25.02.2020
comment
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего поста. Помните, что вы отвечаете на вопрос для будущих читателей, и эти люди могут не знать причин вашего предложения кода. Также старайтесь не перегружать свой код пояснительными комментариями, это снижает читабельность как кода, так и пояснений! - person Waqar UlHaq; 25.02.2020
comment
Я не думаю, что код нуждается в каком-либо объяснении, он кажется довольно простым, как я использую getGraphicalViewer.getControl(); чтобы получить контроль над выбранным элементом и идентифицировать выбранный элемент, я использую объект EditPart для извлечения узла. Если ответ неполный, не стесняйтесь редактировать его. - person ; 26.02.2020