package demo.view;

import java.awt.Color;
import java.awt.EventQueue;

import y.base.Edge;
import y.base.Node;
import y.base.NodeCursor;
import y.layout.BufferedLayouter;
import y.layout.hierarchic.IncrementalHierarchicLayouter;
import y.layout.hierarchic.incremental.SimplexNodePlacer;
import y.view.Arrow;
import y.view.EditMode;
import y.view.Graph2D;
import y.view.NodeRealizer;

public class TooltipDemo extends ViewActionDemo {
  
  public TooltipDemo() {
    Graph2D graph = view.getGraph2D();
    graph.getDefaultEdgeRealizer().setTargetArrow(Arrow.STANDARD);
    
    // create nodes
    Node v1 = graph.createNode(0,0,"Node 1");
    graph.getRealizer(v1).setFillColor(Color.RED);
    Node c1 = graph.createNode(0,0,"Node 2");
    graph.getRealizer(c1).setFillColor(Color.GREEN);
    Node c2 = graph.createNode(0,0,"Node 3");
    graph.getRealizer(c2).setFillColor(Color.BLUE);
    
    for (NodeCursor nc = graph.nodes(); nc.ok(); nc.next()) {
      graph.setSize(nc.node(), 100,50);
    }

    //create edges
    Edge e1 = graph.createEdge(v1,c1);
    Edge e2 = graph.createEdge(v1,c2);

    //layout graph
    IncrementalHierarchicLayouter layouter = new IncrementalHierarchicLayouter();
    ((SimplexNodePlacer)layouter.getNodePlacer()).setBaryCenterModeEnabled(true);
    layouter.setOrthogonallyRouted(true);
    new BufferedLayouter(layouter).doLayout(graph);
    
    view.fitContent();
  }
  
  protected EditMode createEditMode() {
    EditMode mode = new EditMode() {
      //overwrite getNodeTip with custom tooltip information
      public String getNodeTip(Node v) {
        //get NodeRealizer of node
        NodeRealizer nr = ((Graph2D)v.getGraph()).getRealizer(v);
        int red = nr.getFillColor().getRed();
        int green = nr.getFillColor().getGreen();
        int blue = nr.getFillColor().getBlue();
        
        //return custom tooltip
        return  "<html><b>Tooltip as HTML</b>" +
                "<table style=\"background-color:white\" >" +
                "<tr><td>Label text:</td><td>"+nr.getLabelText()+"</td></tr>" +
                "<tr><td>Color (R/G/B):</td><td><span style=\"background-color:rgb("+red+","+green+","+blue+")\">&nbsp;&nbsp;&nbsp;</span> "
                +red+"/"+green+"/"+blue+"</td></tr>" +
                "<tr><td>Incoming Edges:</td><td>"+v.inDegree()+"</td></tr>" +
                "<tr><td>Outgoing Edges:</td><td>"+v.outDegree()+"</td></tr>" +
                "</table>";
      }
      // overwrite getEdgeTip with custom tooltip information
      public String getEdgeTip(Edge e) {
        return "Tooltip as simple text: Edge from "+e.getGraph().getSource(e)+" to "+e.getGraph().getTarget(e);
      }
    };
    //enable node tooltips
    mode.showNodeTips(true);
    //enable edge tooltips
    mode.showEdgeTips(true);
    return mode;
  }
  
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      public void run() {
        initLnF();
        new TooltipDemo().start("Tooltip Demo");
      }
    });
  }
}
