Как нарисовать направленные края с "IGraphContentProvider"? - PullRequest
1 голос
/ 18 июня 2010

Я использую ZEST и RCP для создания инструмента визуализации графиков. Я использовал IGraphContentProvider и LabelProvider для рисования графика.

Как нарисовать направленное ребро между двумя узлами, используя IGraphContentProvider?

Ответы [ 2 ]

1 голос
/ 04 февраля 2011

Поздний ответ, но у меня просто что-то похожее:

Вы можете сделать это, предоставив IEntityConnectionStyleProvider.У него есть метод с именем getConnectionStyle(src, dest).Вы можете вернуть туда отправителя ZestStyles.CONNECTIONS_DIRECTED, если все соединения направлены.В противном случае вы должны решить, основываясь на источнике и пункте назначения, хотите ли вы нарисовать направленный край.

Вы также можете посмотреть на IGraphEntityRelationshipContentProvider.С этим провайдером контента вы можете просто добавить объекты на график, а затем решить, какие из них связаны.

1 голос
/ 18 июня 2010

Не эксперт Zest, но IGraphContentProvider, кажется, ограничен в доступе к основному объекту данного отношения.
Методы getSource() и getDestination() помогут зрителю, подобному Graphviewer, из AbstractStructuredGraphViewer просмотреть границу, определенную этими парами «источник-назначение».

См. этот пример, например .

Graph JFace Snippet

/*******************************************************************************
 * Copyright 2005-2007, CHISEL Group, University of Victoria, Victoria, BC,
 * Canada. All rights reserved. This program and the accompanying materials are
 * made available under the terms of the Eclipse Public License v1.0 which
 * accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: The Chisel Group, University of Victoria
 ******************************************************************************/
package org.eclipse.zest.core.examples.jface;

import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.zest.core.viewers.GraphViewer;
import org.eclipse.zest.core.viewers.IGraphContentProvider;
import org.eclipse.zest.layouts.LayoutStyles;
import org.eclipse.zest.layouts.algorithms.SpringLayoutAlgorithm;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * This snippet shows how to use the IGraphContentProvider to create a graph with Zest.
 * In this example, getElements returns 3 edges:
 *  * Rock2Paper
 *  * Paper2Scissors
 *  * Scissors2Rock
 * 
 * And for each of these, the source and destination are returned in getSource and getDestination.
 * 
 * A label provider is also used to create the text and icons for the graph.
 * 
 * @author Ian Bull
 * 
 */
public class GraphJFaceSnippet2 {

    static class MyContentProvider implements IGraphContentProvider {

        public Object getSource(Object rel) {
            if ("Rock2Paper".equals(rel)) {
                return "Rock";
            } else if ("Paper2Scissors".equals(rel)) {
                return "Paper";
            } else if ("Scissors2Rock".equals(rel)) {
                return "Scissors";
            }
            return null;
        }

        public Object[] getElements(Object input) {
            return new Object[] { "Rock2Paper", "Paper2Scissors", "Scissors2Rock" };
        }

        public Object getDestination(Object rel) {
            if ("Rock2Paper".equals(rel)) {
                return "Paper";
            } else if ("Paper2Scissors".equals(rel)) {
                return "Scissors";
            } else if ("Scissors2Rock".equals(rel)) {
                return "Rock";
            }
            return null;
        }

        public double getWeight(Object connection) {
            return 0;
        }

        public void dispose() {
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }

    }

    static class MyLabelProvider extends LabelProvider {
        final Image image = Display.getDefault().getSystemImage(SWT.ICON_WARNING);

        public Image getImage(Object element) {
            if (element.equals("Rock") || element.equals("Paper") || element.equals("Scissors")) {
                return image;
            }
            return null;
        }

        public String getText(Object element) {
            return element.toString();
        }

    }

    static GraphViewer viewer = null;

    /**
     * @param args
     */
    public static void main(String[] args) {
        Display d = new Display();
        Shell shell = new Shell(d);
        shell.setText("GraphJFaceSnippet2");
        shell.setLayout(new FillLayout(SWT.VERTICAL));
        shell.setSize(400, 400);
        viewer = new GraphViewer(shell, SWT.NONE);
        viewer.setContentProvider(new MyContentProvider());
        viewer.setLabelProvider(new MyLabelProvider());
        viewer.setLayoutAlgorithm(new SpringLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING));
        viewer.setInput(new Object());
        shell.open();
        while (!shell.isDisposed()) {
            while (!d.readAndDispatch()) {
                d.sleep();
            }
        }

    }
}
...