LayoutWithoutAView
Applies to: yFiles 2.6 print article email article

Type: Demo Source Code

Categories this article belongs to:
yFiles for Java > yFiles Layout > Demo Applications Source Code

Tutorial demo application from the demo/layout/ directory.

Shows how to use layout and labeling algorithms without using classes that are only present in the yFiles Viewer distribution.

/****************************************************************************
 **
 ** This file is part of yFiles-2.6. 
 ** 
 ** yWorks proprietary/confidential. Use is subject to license terms.
 **
 ** Redistribution of this file or of an unauthorized byte-code version
 ** of this file is strictly forbidden.
 **
 ** Copyright (c) 2000-2008 by yWorks GmbH, Vor dem Kreuzberg 28, 
 ** 72070 Tuebingen, Germany. All rights reserved.
 **
 ***************************************************************************/

package demo.layout;

import javax.swing.JFrame;

import y.geom.YRectangle;
import y.geom.YPoint;
import y.layout.*;
import y.layout.DefaultLayoutGraph;
import y.layout.EdgeLabelModel;
import y.layout.LabelLayoutTranslator;
import y.layout.LayoutGraph;
import y.layout.EdgeLabelLayout;
import y.layout.FreeEdgeLabelModel;
import y.layout.BufferedLayouter;
import y.layout.SliderEdgeLabelModel;
import y.layout.EdgeLabelLayoutImpl;
import y.layout.hierarchic.HierarchicLayouter;
import y.layout.labeling.GreedyMISLabeling;
import y.util.D;
import y.base.Edge;
import y.base.EdgeMap;
import y.base.Node;
import y.layout.PortConstraint;
import y.layout.PortConstraintKeys;

/**
 * This class shows how to use layout and labeling algorithms without using classes 
 * that are only present in the yFiles Viewer Distribution. Therefore this demo
 * only outputs the calculated coordinates of the graph layout to the console and 
 * displays it inside a simple preview panel. 
 * <br>
 * In this demo HierarchicLayouter is used to layout a small graph. 
 * <br>
 * First the edge labels of the graph will be laid out using a general labeling 
 * approach that effectively positions the labels after the node and edge positions
 * have already been fixed.
 * <br>
 * Second, a special edge labeling mechanism will be used that is currently only 
 * available in conjunction with HierarchicLayouter. While laying out the graph the 
 * edge labels will be considered as well. Therefore the node and edge positions 
 * can be chosen in such a way that, the labeling does not
 * introduce overlaps between labels and other entities in the graph.
 */
public class LayoutWithoutAView
{
  
  /**
   * Launcher
   */
  public static void main(String[] args)
  {
    LayoutWithoutAView lwv = new LayoutWithoutAView();
    lwv.doit();
  }

  /**
   * Creates a small graph and applies an hierarchic layout to it.
   * Two different kinds of edge labeling mechanisms will be applied
   * to the graph.
   * <p>
   * The output of the calculated coordinates will be displayed in the
   * console.
   */ 
  public void doit()
  {
    DefaultLayoutGraph graph = new DefaultLayoutGraph();
    
    //construct graph. assign sizes to nodes
    Node v1 = graph.createNode();
    graph.setSize(v1,30,30);
    Node v2 = graph.createNode();
    graph.setSize(v2,30,30);
    Node v3 = graph.createNode();
    graph.setSize(v3,30,30);
    
    Edge e1 = graph.createEdge(v1,v2);
    Edge e2 = graph.createEdge(v2,v3);
    Edge e3 = graph.createEdge(v1,v3);
 
    //optionally setup some port constraints for HierarchicLayouter
    EdgeMap spc = graph.createEdgeMap();
    EdgeMap tpc = graph.createEdgeMap();
    //e1 shall leave and enter the node on the right side
    spc.set(e1, PortConstraint.create(PortConstraint.EAST));
    //additionally set a strong port constraint on the target side. 
    tpc.set(e1, PortConstraint.create(PortConstraint.EAST, true));
    //ports with strong port constraints will not be reset by the 
    //layouter.  So we specify the target port right now to connect 
    //to the upper-right corner of the node 
    graph.setTargetPointRel(e1, new YPoint(15, -15));
    
    //e2 shall leave and enter the node on the top side
    spc.set(e2, PortConstraint.create(PortConstraint.NORTH));
    tpc.set(e2, PortConstraint.create(PortConstraint.NORTH));
    //e3 uses no port constraints, i.e. layouter will choose best side
    graph.addDataProvider(PortConstraintKeys.SOURCE_PORT_CONSTRAINT_KEY, spc);
    graph.addDataProvider(PortConstraintKeys.TARGET_PORT_CONSTRAINT_KEY, tpc);
    
    
    //setup two edge labels for edge e1. The size of the edge labels will be set to
    //80x20. Usually the size of the labels will be determined by
    //calculaing the bounding box of a piece text that is displayed
    //with a specific font.
    EdgeLabelLayoutImpl ell1 = new EdgeLabelLayoutImpl();
    ell1.setBox(new YRectangle(0,0,80,20));
    //use a center slider edge model. the label will be placed on top of the
    //edge owning the label.
    ell1.setEdgeLabelModel(new SliderEdgeLabelModel(SliderEdgeLabelModel.CENTER_SLIDER));
    
    EdgeLabelLayoutImpl ell2 = new EdgeLabelLayoutImpl();
    ell2.setBox(new YRectangle(0,0,80,20));
    //use a side slider model. the label will be placed to one of the sides of the
    //edge owning the label.
    ell2.setEdgeLabelModel(new SliderEdgeLabelModel(SliderEdgeLabelModel.SIDE_SLIDER));
    
    EdgeLabelLayout[] ells = new EdgeLabelLayout[]{ell1, ell2};
    graph.setLabelLayout(e1, ells);
    
    HierarchicLayouter layouter = new HierarchicLayouter();
    layouter.setLayoutStyle(HierarchicLayouter.MEDIAN_SIMPLEX);
    layouter.setLabelLayouterEnabled(true);
    layouter.setLabelLayouter(new GreedyMISLabeling());
    
    new BufferedLayouter(layouter).doLayout(graph);
    
    //display result
    LayoutPreviewPanel lpp1 = new LayoutPreviewPanel(new CopiedLayoutGraph(graph));
    lpp1.createFrame("Hierarchical with general edge labeling").setVisible(true);
    
    D.bug("\n\nGRAPH LAID OUT USING GENERAL EDGE LABELING");
    D.bug("v1 center position = " + graph.getCenter(v1));
    D.bug("v2 center position = " + graph.getCenter(v2));
    D.bug("v3 center position = " + graph.getCenter(v3));
    D.bug("e1 path = " + graph.getPath(e1));
    D.bug("e2 path = " + graph.getPath(e2));
    D.bug("e3 path = " + graph.getPath(e3));
    D.bug("ell1 upper left location = " + getEdgeLabelLocation(graph,e1,ell1));  
    D.bug("ell2 upper left location = " + getEdgeLabelLocation(graph,e1,ell2));  
  
    EdgeLabelModel freeModel = new FreeEdgeLabelModel();
    ell1.setEdgeLabelModel(freeModel);
    ell1.setModelParameter(freeModel.getDefaultParameter());
    ell2.setEdgeLabelModel(freeModel);
    ell2.setModelParameter(freeModel.getDefaultParameter());
    layouter.setLabelLayouterEnabled(true);
    layouter.setLabelLayouter(new LabelLayoutTranslator());
    
    new BufferedLayouter(layouter).doLayout(graph);
    
    //display result
    LayoutPreviewPanel lpp2 = new LayoutPreviewPanel(graph);
    lpp2.createFrame("Hierarchical with internal labeling").setVisible(true);

    D.bug("\n\nGRAPH LAID OUT USING HIERARCHIC LAYOUTER WITH INTERNAL EDGE LABELING");
    D.bug("v1 center position = " + graph.getCenter(v1));
    D.bug("v2 center position = " + graph.getCenter(v2));
    D.bug("v3 center position = " + graph.getCenter(v3));
    D.bug("e1 path = " + graph.getPath(e1));
    D.bug("e2 path = " + graph.getPath(e2));
    D.bug("e3 path = " + graph.getPath(e3));
    D.bug("ell1 upper left location = " + getEdgeLabelLocation(graph,e1,ell1));  
    D.bug("ell2 upper left location = " + getEdgeLabelLocation(graph,e1,ell2));  
  }
  
  /**
   * Returns the calculated location of the edge label. Note that the labeling
   * machinery returns the edge labels positions as a parameter
   * of the model that belongs to the label. This model parameter can be used
   * to retrieve the actual location of the label as shown in this method.
   */ 
  YPoint getEdgeLabelLocation(LayoutGraph graph, Edge e, EdgeLabelLayout ell)
  {
    YPoint ellp = ell.getLabelModel().getLabelPlacement(
      ell.getBox(),
      graph.getEdgeLayout(e), 
      graph.getNodeLayout(e.source()),
      graph.getNodeLayout(e.target()),
      ell.getModelParameter());
    return ellp;
  }
}

Keywords: layout - labeling - Layout distribution - LayoutWithoutAView

Provide feedback:
How useful was this article?    less 1 2 3 4 5 more
Email address (optional):
COPYRIGHT © 2008 yWorks · ALL RIGHTS RESERVED imprint | top | home