Добавление одиночного выбора и контекстно-зависимого щелчка правой кнопкой мыши в график Zest

Я уже больше недели играю с Zest GraphViewer, пытаясь выяснить, что он может сделать для моего приложения, но до сих пор мне не удалось привести его поведение в соответствие с моими требованиями.

Я надеюсь, что кто-то может указать мне на ресурсы, которые мне нужны, потому что я просто не могу найти столько полезного в Google, или может сказать мне, возможно ли то, что я хочу.

Версия

У меня есть ядро ​​Zest 1.3.0 и макет Zest 1.1.0 в моих зависимостях для проекта RCP. Это пришло с сайта загрузки, который я взял с сайта Zest.

Требования

  • Выбор одного узла/ребра.
  • Отмена выбора узла/ребра при выборе пробела (что может быть ошибкой?)
  • Функциональность щелчка правой кнопкой мыши для изменения над узлом. (обнаружить, когда мышь находится над узлом)

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

Не имея возможности сделать это из-за природы или нашего приложения и пользователей, у меня также может возникнуть потребность найти другой пакет для рисования графиков на основе RCP/SWT, который имеет эту функциональность.

Любая помощь по любому из этих вопросов будет принята с благодарностью.

Глен х


person Link19    schedule 11.02.2014    source источник


Ответы (1)


Основываясь на руководстве по Zest от Vogella, я придумал следующее:

public static void main(String[] args) throws FontFormatException, IOException
{
    Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

    final Graph graph = new Graph(shell, SWT.NONE);
    GraphNode node1 = new GraphNode(graph, SWT.NONE, "Jim");
    GraphNode node2 = new GraphNode(graph, SWT.NONE, "Jack");
    GraphNode node3 = new GraphNode(graph, SWT.NONE, "Joe");
    GraphNode node4 = new GraphNode(graph, SWT.NONE, "Bill");

    /* Context menu */
    graph.addMenuDetectListener(new MenuDetectListener()
    {
        @Override
        public void menuDetected(MenuDetectEvent e)
        {
            Point point = graph.toControl(e.x, e.y);
            IFigure fig = graph.getFigureAt(point.x, point.y);

            if (fig != null)
            {
                Menu menu = new Menu(shell, SWT.POP_UP);
                MenuItem exit = new MenuItem(menu, SWT.NONE);
                exit.setText("Hello! This is " + ((GraphLabel) fig).getText());
                menu.setVisible(true);
            }
            else
            {
                Menu menu = new Menu(shell, SWT.POP_UP);
                MenuItem exit = new MenuItem(menu, SWT.NONE);
                exit.setText("Nothing here...");
                menu.setVisible(true);
            }
        }
    });
    /* Lets have a directed connection */
    new GraphConnection(graph, ZestStyles.CONNECTIONS_DIRECTED, node1, node2);
    /* Lets have a dotted graph connection */
    new GraphConnection(graph, ZestStyles.CONNECTIONS_DOT, node2, node3);
    /* Standard connection */
    new GraphConnection(graph, SWT.NONE, node3, node1);
    /* Change line color and line width */
    GraphConnection graphConnection = new GraphConnection(graph, SWT.NONE, node1, node4);
    graphConnection.changeLineColor(shell.getDisplay().getSystemColor(SWT.COLOR_GREEN));
    /* Also set a text */
    graphConnection.setText("This is a text");
    graphConnection.setHighlightColor(shell.getDisplay().getSystemColor(SWT.COLOR_RED));
    graphConnection.setLineWidth(3);

    graph.setLayoutAlgorithm(new SpringLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING), true);
    graph.addSelectionListener(new SelectionAdapter()
    {
        @Override
        public void widgetSelected(SelectionEvent e)
        {
            System.out.println(e.item);
            /* Make sure that only the newest item is selected */
            graph.setSelection(new GraphItem[]{(GraphItem)e.item});
        }

    });

    shell.pack();
    shell.open();
    shell.setSize(400, 300);

    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}

Он поддерживает выбор одного узла / ребра, отмену выбора и функциональность щелчка правой кнопкой мыши по запросу.

Выглядит так:

введите здесь описание изображения


Если вы воспользуетесь примером GraphViewer из руководства и добавите это в код View, он все равно будет работать нормально:

final Graph graph = viewer.getGraphControl();
graph.addSelectionListener(new SelectionAdapter()
{
    @Override
    public void widgetSelected(SelectionEvent e)
    {
        System.out.println(e.item);
        graph.setSelection(new GraphItem[]{(GraphItem)e.item});
    }

});
person Baz    schedule 14.02.2014
comment
вы все еще можете сделать множественный выбор с помощью клавиш MOD (shift, cntrl). Я вижу ошибку с Graph, что SWT.SINGLE / SWT.MULTI не поддерживаются. - person sambi reddy; 14.02.2014
comment
@sambireddy Хорошо, обновил код. Теперь невозможно выбрать более одного элемента. - person Baz; 14.02.2014
comment
Это не будет работать, если используется GraphViewer. Это должно быть обработано в базовом коде Graph. Если вы продолжите устанавливать выбор для последнего выбранного элемента, он будет запускать событие выбора несколько раз. - person sambi reddy; 19.02.2014
comment
@sambireddy Отредактировал мой ответ. Он по-прежнему работает с GraphViewer. - person Baz; 19.02.2014
comment
это работает, только если вы сначала создадите Graph, а затем установите Graph в качестве элемента управления в GraphViewer. это зависит от порядка выбора слушателей (слушатель, зарегистрированный классом Viewer) - person sambi reddy; 19.02.2014
comment
@sambireddy Итак, в конце концов вы нашли конфигурацию, которая вам подходит? - person Baz; 19.02.2014
comment
Я ожидал, что Graph будет обрабатывать одиночный/множественный выбор, как это делает SWT Table/Tree. Да, поскольку я всегда использую классы Viewer, я ожидал правильного решения, которое работает с Viewer. - person sambi reddy; 19.02.2014
comment
@sambireddy Так это «да»? - person Baz; 19.02.2014
comment
Есть только одна Единственная проблема. Если ваш график больше, и вам нужно прокручивать. Затем graph.getFigureAt(point.x, point.y); не правильно переводится. Поэтому я использовал для своей задачи graph.getViewport().findFigureAt(point.x, point.y); и явный instanceOf Проверьте, чтобы быть GraphLabel, PolylineConnection и FreeformViewport (для No selection). - person daniel; 23.10.2014