Advertisement
Guest User

Untitled

a guest
Aug 15th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.04 KB | None | 0 0
  1. package testung;
  2.  
  3. import javafx.event.EventHandler;
  4. import javafx.scene.Cursor;
  5. import javafx.scene.Node;
  6. import javafx.scene.canvas.Canvas;
  7. import javafx.scene.input.MouseEvent;
  8. import javafx.scene.shape.Rectangle;
  9. import outline.OutlineShape;
  10. import proj.DrawUI;
  11. import proj.models.Connector;
  12. import proj.models.Figures;
  13.  
  14. import java.util.ArrayList;
  15.  
  16. /**
  17. * ************* How to use ************************
  18. *
  19. * Rectangle rectangle = new Rectangle(50, 50);
  20. * rectangle.setFill(Color.BLACK);
  21. * DragResizeMod.makeResizable(rectangle, null);
  22. *
  23. * Pane root = new Pane();
  24. * root.getChildren().add(rectangle);
  25. *
  26. * primaryStage.setScene(new Scene(root, 300, 275));
  27. * primaryStage.show();
  28. *
  29. * ************* OnDragResizeEventListener **********
  30. *
  31. * You need to override OnDragResizeEventListener and
  32. * 1) preform out of main field bounds check
  33. * 2) make changes to the node
  34. * (this class will not change anything in node coordinates)
  35. *
  36. * There is defaultListener and it works only with Canvas nad Rectangle
  37. */
  38.  
  39. public class DragResizeMod {
  40.  
  41.  
  42. public interface OnDragResizeEventListener {
  43. void onDrag(Node node, double x, double y, double h, double w);
  44.  
  45. void onResize(Node node, double x, double y, double h, double w);
  46. }
  47.  
  48. private static final OnDragResizeEventListener defaultListener = new OnDragResizeEventListener() {
  49. @Override
  50. public void onDrag(Node node, double x, double y, double h, double w) {
  51. /*
  52. // TODO find generic way to get parent width and height of any node
  53. // can perform out of bounds check here if you know your parent size
  54. if (x > width - w ) x = width - w;
  55. if (y > height - h) y = height - h;
  56. if (x < 0) x = 0;
  57. if (y < 0) y = 0;
  58. */
  59. setNodeSize(node, x, y, h, w);
  60. }
  61.  
  62. @Override
  63. public void onResize(Node node, double x, double y, double h, double w) {
  64. /*
  65. // TODO find generic way to get parent width and height of any node
  66. // can perform out of bounds check here if you know your parent size
  67. if (w > width - x) w = width - x;
  68. if (h > height - y) h = height - y;
  69. if (x < 0) x = 0;
  70. if (y < 0) y = 0;
  71. */
  72. setNodeSize(node, x, y, h, w);
  73. }
  74.  
  75. private void setNodeSize(Node node, double x, double y, double h, double w) {
  76. OutlineShape outlineShape = (OutlineShape) node;
  77. outlineShape.changeParams(x,y,h,w);
  78. //Figures figure = (Figures) node;
  79. // figure.changeCoords(x,y,h,w);
  80. // for(Connector connector: connectors){
  81. // connector.recalculate();
  82. // connector.createConnector();
  83. // node.setLayoutX(x);
  84. System.out.println("Layout x: " + node.getLayoutX());
  85. // node.setLayoutY(y);
  86. // TODO find generic way to set width and height of any node
  87. // here we cant set height and width to node directly.
  88. // or i just cant find how to do it,
  89. // so you have to wright resize code anyway for your Nodes...
  90. //something like this
  91. // if (node instanceof Canvas) {
  92. // ((Canvas) node).setWidth(w);
  93. // ((Canvas) node).setHeight(h);
  94. // } else if (node instanceof Rectangle) {
  95. // ((Rectangle) node).setWidth(w);
  96. // ((Rectangle) node).setHeight(h);
  97. // }
  98. }
  99. };
  100.  
  101. public static enum S {
  102. DEFAULT,
  103. DRAG,
  104. NW_RESIZE,
  105. SW_RESIZE,
  106. NE_RESIZE,
  107. SE_RESIZE,
  108. E_RESIZE,
  109. W_RESIZE,
  110. N_RESIZE,
  111. S_RESIZE;
  112. }
  113.  
  114.  
  115. private double clickX, clickY, nodeX, nodeY, nodeH, nodeW;
  116.  
  117. private S state = S.DEFAULT;
  118.  
  119. private Node node;
  120. private OnDragResizeEventListener listener = defaultListener;
  121.  
  122. private static final int MARGIN = 8;
  123. private static final double MIN_W = 30;
  124. private static final double MIN_H = 20;
  125.  
  126. private DragResizeMod(Node node, OnDragResizeEventListener listener) {
  127. this.node = node;
  128. if (listener != null)
  129. this.listener = listener;
  130. }
  131.  
  132. public static void makeResizable(Node node) {
  133. makeResizable(node, null);
  134. }
  135.  
  136. public static void makeResizable(Node node, OnDragResizeEventListener listener) {
  137.  
  138. final DragResizeMod resizer = new DragResizeMod(node, listener);
  139.  
  140. node.setOnMousePressed(new AnotherBaseHandler() {
  141. @Override
  142. public void doHandle(MouseEvent event) {
  143. resizer.mousePressed(event);
  144. }
  145. });
  146. node.setOnMouseDragged(new AnotherBaseHandler() {
  147. @Override
  148. public void doHandle(MouseEvent event) {
  149. resizer.mouseDragged(event);
  150. // System.out.println("usual width: " + ((Rectangle)node).getWidth());
  151. System.out.println("parent width: " + node.getBoundsInParent().getWidth());
  152. System.out.println("local width: " + node.getBoundsInLocal().getWidth());
  153. // System.out.println("usual x: " + ((Rectangle)node).getX());
  154. System.out.println("parent x: " + node.getBoundsInParent().getMinX());
  155. System.out.println("local x: " + node.getBoundsInLocal().getMinX());
  156. }
  157. });
  158. node.setOnMouseMoved(new AnotherBaseHandler() {
  159. @Override
  160. public void doHandle(MouseEvent event) {
  161. resizer.mouseOver(event);
  162. }
  163. });
  164. node.setOnMouseReleased(new AnotherBaseHandler() {
  165. @Override
  166. public void doHandle(MouseEvent event) {
  167. resizer.mouseReleased(event);
  168. }
  169. });
  170. }
  171.  
  172. protected void mouseReleased(MouseEvent event) {
  173. node.setCursor(Cursor.DEFAULT);
  174. state = S.DEFAULT;
  175. // Figures figure = (Figures) node;
  176. //figure.changeCoords(nodeX,nodeY,nodeH,nodeW);
  177. }
  178.  
  179. protected void mouseOver(MouseEvent event) {
  180. S state = currentMouseState(event);
  181. Cursor cursor = getCursorForState(state);
  182. node.setCursor(cursor);
  183. }
  184.  
  185. private S currentMouseState(MouseEvent event) {
  186. S state = S.DEFAULT;
  187. boolean left = isLeftResizeZone(event);
  188. boolean right = isRightResizeZone(event);
  189. boolean top = isTopResizeZone(event);
  190. boolean bottom = isBottomResizeZone(event);
  191.  
  192. if (left && top) state = S.NW_RESIZE;
  193. else if (left && bottom) state = S.SW_RESIZE;
  194. else if (right && top) state = S.NE_RESIZE;
  195. else if (right && bottom) state = S.SE_RESIZE;
  196. else if (right) state = S.E_RESIZE;
  197. else if (left) state = S.W_RESIZE;
  198. else if (top) state = S.N_RESIZE;
  199. else if (bottom) state = S.S_RESIZE;
  200. else if (isInDragZone(event)) state = S.DRAG;
  201.  
  202. return state;
  203. }
  204.  
  205. private static Cursor getCursorForState(S state) {
  206. switch (state) {
  207. case NW_RESIZE:
  208. return Cursor.NW_RESIZE;
  209. case SW_RESIZE:
  210. return Cursor.SW_RESIZE;
  211. case NE_RESIZE:
  212. return Cursor.NE_RESIZE;
  213. case SE_RESIZE:
  214. return Cursor.SE_RESIZE;
  215. case E_RESIZE:
  216. return Cursor.E_RESIZE;
  217. case W_RESIZE:
  218. return Cursor.W_RESIZE;
  219. case N_RESIZE:
  220. return Cursor.N_RESIZE;
  221. case S_RESIZE:
  222. return Cursor.S_RESIZE;
  223. default:
  224. return Cursor.DEFAULT;
  225. }
  226. }
  227.  
  228.  
  229. protected void mouseDragged(MouseEvent event) {
  230.  
  231. if (listener != null) {
  232. double mouseX = parentX(event.getX());
  233. double mouseY = parentY(event.getY());
  234. if (state == S.DRAG) {
  235. listener.onDrag(node, mouseX - clickX, mouseY - clickY, nodeH, nodeW);
  236. } else if (state != S.DEFAULT) {
  237. //resizing
  238. double newX = nodeX;
  239. double newY = nodeY;
  240. double newH = nodeH;
  241. double newW = nodeW;
  242.  
  243. // Right Resize
  244. if (state == S.E_RESIZE || state == S.NE_RESIZE || state == S.SE_RESIZE) {
  245. newW = mouseX - nodeX;
  246. }
  247. // Left Resize
  248. if (state == S.W_RESIZE || state == S.NW_RESIZE || state == S.SW_RESIZE) {
  249. newX = mouseX;
  250. newW = nodeW + nodeX - newX;
  251. }
  252.  
  253. // Bottom Resize
  254. if (state == S.S_RESIZE || state == S.SE_RESIZE || state == S.SW_RESIZE) {
  255. newH = mouseY - nodeY;
  256. }
  257. // Top Resize
  258. if (state == S.N_RESIZE || state == S.NW_RESIZE || state == S.NE_RESIZE) {
  259. newY = mouseY;
  260. newH = nodeH + nodeY - newY;
  261. }
  262.  
  263. //min valid rect Size Check
  264. if (newW < MIN_W) {
  265. if (state == S.W_RESIZE || state == S.NW_RESIZE || state == S.SW_RESIZE)
  266. newX = newX - MIN_W + newW;
  267. newW = MIN_W;
  268. }
  269.  
  270. if (newH < MIN_H) {
  271. if (state == S.N_RESIZE || state == S.NW_RESIZE || state == S.NE_RESIZE)
  272. newY = newY + newH - MIN_H;
  273. newH = MIN_H;
  274. }
  275.  
  276. listener.onResize(node, newX, newY, newH, newW);
  277. }
  278. }
  279. }
  280.  
  281. protected void mousePressed(MouseEvent event) {
  282.  
  283. if (isInResizeZone(event)) {
  284. setNewInitialEventCoordinates(event);
  285. state = currentMouseState(event);
  286. } else if (isInDragZone(event)) {
  287. setNewInitialEventCoordinates(event);
  288. state = S.DRAG;
  289. } else {
  290. state = S.DEFAULT;
  291. }
  292. }
  293.  
  294. private void setNewInitialEventCoordinates(MouseEvent event) {
  295. nodeX = nodeX();
  296. nodeY = nodeY();
  297. nodeH = nodeH();
  298. nodeW = nodeW();
  299. clickX = event.getX();
  300. clickY = event.getY();
  301. }
  302.  
  303. private boolean isInResizeZone(MouseEvent event) {
  304. return isLeftResizeZone(event) || isRightResizeZone(event)
  305. || isBottomResizeZone(event) || isTopResizeZone(event);
  306. }
  307.  
  308. private boolean isInDragZone(MouseEvent event) {
  309. double xPos = parentX(event.getX());
  310. double yPos = parentY(event.getY());
  311. double nodeX = nodeX() + MARGIN;
  312. double nodeY = nodeY() + MARGIN;
  313. double nodeX0 = nodeX() + nodeW() - MARGIN;
  314. double nodeY0 = nodeY() + nodeH() - MARGIN;
  315.  
  316. return (xPos > nodeX && xPos < nodeX0) && (yPos > nodeY && yPos < nodeY0);
  317. }
  318.  
  319. private boolean isLeftResizeZone(MouseEvent event) {
  320. return intersect(0, event.getX());
  321. }
  322.  
  323. private boolean isRightResizeZone(MouseEvent event) {
  324. return intersect(nodeW(), event.getX());
  325. }
  326.  
  327. private boolean isTopResizeZone(MouseEvent event) {
  328. return intersect(0, event.getY());
  329. }
  330.  
  331. private boolean isBottomResizeZone(MouseEvent event) {
  332. return intersect(nodeH(), event.getY());
  333. }
  334.  
  335. private boolean intersect(double side, double point) {
  336. return side + MARGIN > point && side - MARGIN < point;
  337. }
  338.  
  339. private double parentX(double localX) {
  340. return nodeX() + localX;
  341. }
  342.  
  343. private double parentY(double localY) {
  344. return nodeY() + localY;
  345. }
  346.  
  347. private double nodeX() {
  348. return node.getBoundsInParent().getMinX();
  349. }
  350.  
  351. private double nodeY() {
  352. return node.getBoundsInParent().getMinY();
  353. }
  354.  
  355. private double nodeW() {
  356. return node.getBoundsInParent().getWidth();
  357. }
  358.  
  359. private double nodeH() {
  360. return node.getBoundsInParent().getHeight();
  361. }
  362. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement