1 31 32 package org.antlr.works.visualization.skin.nfa; 33 34 import org.antlr.works.visualization.graphics.GContext; 35 import org.antlr.works.visualization.graphics.shape.GLink; 36 37 import java.awt.*; 38 39 public class NFALink { 40 41 public static void draw(GLink link) { 42 GContext context = link.getContext(); 43 44 float sx = link.source.getX()+context.getPixelNodeWidth()/2; 45 float sy = link.source.getY(); 46 47 float tx = link.target.getX()+context.getPixelNodeWidth()/2; 48 float ty = link.target.getY(); 49 50 float startOffset = context.getPixelNodeWidth()/2; 51 float endOffset = startOffset; 52 53 float sloopBaseWidth = context.getPixelValue(GContext.EPSILON_WIDTH); 54 55 context.setColor(context.linkColor); 56 57 if(link.virtualPosition != null) { 58 context.drawArcConnector(sx+(tx-sx)/2, link.getVirtualY(), sx, sy, startOffset, endOffset, 59 sloopBaseWidth, 0.25f*sloopBaseWidth, link.transition.loop); 60 context.drawArcConnector(sx+(tx-sx)/2, link.getVirtualY(), tx, ty, startOffset, endOffset, 61 sloopBaseWidth, 0.25f*sloopBaseWidth, !link.transition.loop); 62 } else if(sy > ty) { 63 if((tx-sx>sloopBaseWidth+startOffset+0.25f*sloopBaseWidth) && sloopBaseWidth>0) { 65 context.drawArcConnector(sx, sy, tx, ty, startOffset, endOffset, 66 sloopBaseWidth, 0.25f*sloopBaseWidth, true); 67 } else { 68 context.drawSpline(sx, sy, tx, ty, startOffset, endOffset, 0, true); 69 } 70 } else { 71 context.drawSpline(sx, sy, tx, ty, startOffset, endOffset, 0, true); 72 } 73 74 if(!link.transition.isEpsilon()) { 75 Font font; 76 if(link.transition.externalRuleRef) 77 font = context.getRuleFont(); 78 else 79 font = context.getBoxFont(); 80 81 context.setColor(context.getColorForLabel(link.transition.label)); 82 context.drawString(font, link.transition.label, sx+(tx-sx)/2, sy-2, GContext.ALIGN_CENTER_UP); 83 } 84 } 85 86 } 87 | Popular Tags |