content: package edu.cmu.hcii.whyline.ui.arrows;
  
  import java.awt.Graphics2D;
  import java.awt.Rectangle;
  import java.awt.geom.Area;
  import java.awt.geom.Line2D;
  
  import edu.cmu.hcii.whyline.qa.Explanation;
  import edu.cmu.hcii.whyline.ui.source.*;
  import edu.cmu.hcii.whyline.util.Util;
  
  /**
   * @author Andrew J. Ko
   *
   */
  public class FileControlArrow extends FileCausalArrow {
  
  	public FileControlArrow(FilesView.ArrowBox arrows, Explanation from, Explanation to) {
  		
  		super(arrows, null, from, to, Relationship.CONTROL, 0);
  
  		toRange = arrows.getFilesView().getRangeFor(from.getEventID());
  
  	}
  
  	protected void paintSelectedArrow(Graphics2D g, int labelLeft, int labelRight, int labelTop, int labelBottom) {
  		
  		if(toRange != null && toRange.first != null) {
  
  			Area area = files.getAreaForTokenRange(toRange);
  			if(area != null) {
  				Rectangle tokens = area.getBounds();
  
  				g.setColor(relationship.getColor(true));
  
  				// Outline the tokens
  				files.outline(g, toRange);
  			
  				// Get the boundaries of the selection.
  				int tokenLeft = (int)tokens.getMinX();
  				int tokenRight = (int) tokens.getMaxX();
  				int tokenTop = (int) tokens.getMinY();
  				int tokenBottom = (int) tokens.getMaxY();
  				
  				int labelX = tokenRight < (labelLeft + labelRight) / 2  ? labelLeft : labelRight;
  				int labelY = labelBottom - descent;
  				
  				Line2D line = Util.getLineBetweenRectangleEdges(
  						labelX, labelX + 1,
  						labelY, labelY + 1,
  						tokenLeft, tokenRight,
  						tokenTop, tokenBottom
  				);
  	
  				int xOff = 0;
  				int yOff = 0;
  
  				Util.drawQuadraticCurveArrow(g, (int)line.getX1(), (int)line.getY1(), (int)line.getX2(), (int)line.getY2(), xOff, yOff, true, relationship.getStroke(true));
  
  				g.drawLine(labelLeft, labelY, labelRight, labelY);
  				
  			}
  			
  		}
  		
  	}
  
  }