1 31 32 package org.antlr.xjlib.appkit.gview.shape; 33 34 import org.antlr.xjlib.appkit.gview.base.Path2D; 35 import org.antlr.xjlib.appkit.gview.base.Vector2D; 36 import org.antlr.xjlib.appkit.gview.object.GElementRect; 37 38 public class SLinkElbowLeftLeft { 39 40 public static final int LEFT_LEFT = 0; 41 public static final int RIGHT_RIGHT = 1; 42 public static final int LABEL_OFFSET = 10; 43 44 public SLinkElbow link = null; 45 public Path2D path = null; 46 47 public SLinkElbowLeftLeft(SLinkElbow link) { 48 this.link = link; 49 } 50 51 public void updateLeftLeft() { 52 this.path = link.path; 53 if(Math.abs(link.end.y-link.start.y)>=GElementRect.DEFAULT_WIDTH*0.5+10) { 54 buildVerticalPath(LEFT_LEFT); 55 } else { 56 if(link.start.x<link.end.x) 58 buildHorizontalRightBelowPath(); 59 else 60 buildHorizontalRightAbovePath(); 61 } 62 } 63 64 public void updateRightRight() { 65 this.path = link.path; 66 if(Math.abs(link.end.y-link.start.y)>=GElementRect.DEFAULT_WIDTH*0.5+10) { 67 buildVerticalPath(RIGHT_RIGHT); 68 } else { 69 if(link.start.x<link.end.x) 71 buildHorizontalRightAbovePath(); 72 else 73 buildHorizontalRightBelowPath(); 74 } 75 } 76 77 public void buildVerticalPath(int direction) { 78 Vector2D start_ = link.getStartWithOffset(); 79 Vector2D end_ = link.getEndWithOffset(); 80 81 double farest_x = 0; 82 if(direction == LEFT_LEFT) 83 farest_x = Math.min(start_.x, end_.x); 84 else 85 farest_x = Math.max(start_.x, end_.x); 86 87 Vector2D p1 = start_.add(new Vector2D(farest_x-start_.x, 0)); 88 Vector2D p2 = end_.add(new Vector2D(farest_x-end_.x, 0)); 89 90 path.add(link.start); 91 path.add(start_); 92 path.add(p1); 93 path.add(p2); 94 path.add(end_); 95 path.add(link.end); 96 97 link.label.setPosition(p1.add(p2.sub(p1).stretch(0.5)).shift(-LABEL_OFFSET, 0)); 98 } 99 100 public void buildHorizontalRightBelowPath() { 101 Vector2D start_ = link.getStartWithOffset(); 102 Vector2D end_ = link.getEndWithOffset(); 103 104 Vector2D start = link.start; 105 Vector2D end = link.end; 106 107 double farest_y = start_.y+GElementRect.DEFAULT_WIDTH*0.5+10; 108 109 111 Vector2D p1 = start_.add(new Vector2D(0, farest_y-start_.y)); 112 Vector2D p2 = end_.add(new Vector2D(0, farest_y-end_.y)); 113 114 path.add(start); 115 path.add(start_); 116 path.add(p1); 117 path.add(p2); 118 path.add(end_); 119 path.add(end); 120 121 link.label.setPosition(p1.add(p2.sub(p1).stretch(0.5)).shift(-LABEL_OFFSET, 0)); 122 } 123 124 public void buildHorizontalRightAbovePath() { 125 Vector2D start_ = link.getStartWithOffset(); 126 Vector2D end_ = link.getEndWithOffset(); 127 128 Vector2D start = link.start; 129 Vector2D end = link.end; 130 131 double farest_y = end_.y+GElementRect.DEFAULT_WIDTH*0.5+10; 132 133 135 Vector2D p1 = start_.add(new Vector2D(0, farest_y-start_.y)); 136 Vector2D p2 = end_.add(new Vector2D(0, farest_y-end_.y)); 137 138 path.add(start); 139 path.add(start_); 140 path.add(p1); 141 path.add(p2); 142 path.add(end_); 143 path.add(end); 144 145 link.label.setPosition(p1.add(p2.sub(p1).stretch(0.5)).shift(-LABEL_OFFSET, 0)); 146 } 147 148 } 149 | Popular Tags |