Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.87 KB | None | 0 0
  1. package com.igor.grapheditor;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Cursor;
  5. import java.awt.Graphics;
  6. import java.awt.event.KeyEvent;
  7. import java.awt.event.KeyListener;
  8. import java.awt.event.MouseEvent;
  9. import java.awt.event.MouseListener;
  10. import java.awt.event.MouseMotionListener;
  11.  
  12. import javax.swing.JColorChooser;
  13. import javax.swing.JMenuItem;
  14. import javax.swing.JOptionPane;
  15. import javax.swing.JPanel;
  16. import javax.swing.JPopupMenu;
  17.  
  18. public class GraphPanel extends JPanel implements MouseListener, MouseMotionListener, KeyListener{
  19.  
  20. private static final long serialVersionUID = 1L;
  21.  
  22.  
  23.  
  24. protected Graph graph;
  25.  
  26. private int mouseX = 0;
  27. private int mouseY = 0;
  28. private boolean mouseButtonLeft = false;
  29. @SuppressWarnings("unused")
  30. private boolean mouseButtonRight = false;
  31. protected int mouseCursor = Cursor.HAND_CURSOR;
  32.  
  33. protected Node nodeUnderCursor = null;
  34. protected Edge edgeUnderCursor = null;
  35. protected Node createEdgeFrom = null;
  36.  
  37. public GraphPanel() {
  38. addMouseListener(this);
  39. addMouseMotionListener(this);
  40. addKeyListener(this);
  41. setFocusable(true);
  42. requestFocus();
  43. }
  44.  
  45. public Graph getGraph(){
  46. return this.graph;
  47. }
  48.  
  49. public void setGraph(Graph graph) {
  50. this.graph = graph;
  51. this.nodeUnderCursor = null;
  52. this.edgeUnderCursor = null;
  53. this.createEdgeFrom = null;
  54. this.setCursor(Cursor.getDefaultCursor());
  55. this.repaint();
  56. }
  57.  
  58. private Node findNode(int mx, int my) {
  59. for(Node node : graph.getNodes()) {
  60. if(node.isMouseOver(mx,my)) {
  61. return node;
  62. }
  63. }
  64. return null;
  65. }
  66.  
  67. private Node findNode(MouseEvent event) {
  68. return findNode(event.getX(), event.getY());
  69. }
  70.  
  71. private Edge findEdge(int mx, int my) {
  72. for(Edge edge : graph.getEdges()) {
  73. if(edge.isMouseOver(mx, my)) {
  74. return edge;
  75. }
  76. }
  77. return null;
  78. }
  79.  
  80. private Edge findEdge(MouseEvent event) {
  81. return findEdge(event.getX(), event.getY());
  82. }
  83.  
  84. protected void setMouseCursor(MouseEvent event) {
  85. this.nodeUnderCursor = this.findNode(event);
  86. this.edgeUnderCursor = this.findEdge(event);
  87. this.mouseCursor = this.nodeUnderCursor != null ? 12 : (this.createEdgeFrom != null ? 3 : (this.edgeUnderCursor != null ? 1 : (this.mouseButtonLeft ? 13 : 0)));
  88. this.setCursor(Cursor.getPredefinedCursor(this.mouseCursor));
  89. this.mouseX = event.getX();
  90. this.mouseY = event.getY();
  91. }
  92.  
  93. protected void setMouseCursor(int mx, int my) {
  94. this.nodeUnderCursor = this.findNode(mx, my);
  95. this.edgeUnderCursor = this.findEdge(mx, my);
  96. this.mouseCursor = this.nodeUnderCursor != null ? 12 : (this.createEdgeFrom != null ? 3 : (this.edgeUnderCursor != null ? 1 : (this.mouseButtonLeft ? 13 : 0)));
  97. this.setCursor(Cursor.getPredefinedCursor(this.mouseCursor));
  98. this.mouseX = mx;
  99. this.mouseY = my;
  100. }
  101.  
  102. private void moveNode(int dx, int dy, Node node) {
  103. node.setX(node.getX()+dx);
  104. node.setY(node.getY()+dy);
  105. }
  106.  
  107. private void moveAllNodes(int dx, int dy) {
  108. for(Node node : graph.getNodes()) {
  109. moveNode(dx, dy, node);
  110. }
  111. repaint();
  112. }
  113.  
  114. private void moveEdge(int dx, int dy, Edge edge) {
  115. this.moveNode(dx, dy, edge.getFrom());
  116. this.moveNode(dx, dy, edge.getTo());
  117. }
  118.  
  119. @Override
  120. protected void paintComponent(Graphics g) {
  121. super.paintComponent(g);
  122. if(graph == null) return;
  123. graph.draw(g);
  124. }
  125.  
  126. @Override
  127. public void mouseClicked(MouseEvent event){
  128. this.setMouseCursor(event);
  129. if (event.getButton() == 1) {
  130. if (this.createEdgeFrom != null && this.nodeUnderCursor != null && this.nodeUnderCursor != this.createEdgeFrom) {
  131. this.graph.addNewEdge(this.createEdgeFrom, this.nodeUnderCursor);
  132. this.repaint();
  133. }
  134. this.createEdgeFrom = null;
  135. }
  136. this.setMouseCursor(event);
  137. }
  138.  
  139. @Override
  140. public void mouseEntered(MouseEvent event){
  141.  
  142. }
  143.  
  144. @Override
  145. public void mouseExited(MouseEvent event){
  146.  
  147. }
  148.  
  149. @Override
  150. public void mousePressed(MouseEvent event){
  151. if(event.getButton() == 1) mouseButtonLeft = true;
  152. if(event.getButton() == 3) mouseButtonRight = true;
  153. setMouseCursor(event);
  154. }
  155.  
  156. @Override
  157. public void mouseReleased(MouseEvent event){
  158. if(event.getButton() == 1) mouseButtonLeft = false;
  159. setMouseCursor(event);
  160. if(event.getButton() == 1)
  161. {
  162.  
  163. }
  164. if(event.getButton() == 3) mouseButtonRight= false;
  165. setMouseCursor(event);
  166. if(event.getButton() == 3) {
  167. if(nodeUnderCursor != null) {
  168. createPopupMenu(event, nodeUnderCursor);
  169. }else if(edgeUnderCursor != null) {
  170. createPopupMenu(event, edgeUnderCursor);
  171. }else {
  172. createPopupMenu(event);
  173. }
  174. }
  175. }
  176.  
  177.  
  178. @Override
  179. public void mouseDragged(MouseEvent event) {
  180. if(mouseButtonLeft) {
  181. if(nodeUnderCursor != null) {
  182. moveNode(event.getX()-mouseX, event.getY()-mouseY, nodeUnderCursor);
  183. }else if (this.edgeUnderCursor != null) {
  184. this.moveEdge(event.getX() - this.mouseX, event.getY() - this.mouseY, this.edgeUnderCursor);
  185. }
  186. else {
  187. moveAllNodes(event.getX() - mouseX, event.getY() - mouseY);
  188. }
  189. }
  190. mouseX = event.getX();
  191. mouseY = event.getY();
  192. repaint();
  193. }
  194.  
  195. @Override
  196. public void mouseMoved(MouseEvent event) {
  197. setMouseCursor(event);
  198. }
  199.  
  200. @Override
  201. public void keyPressed(KeyEvent event) {
  202. {
  203. int dist;
  204. if (event.isShiftDown()) dist = 10;
  205. else dist = 1;
  206. switch(event.getKeyCode()) {
  207. case KeyEvent.VK_LEFT:
  208. moveAllNodes(-dist, 0);
  209. break;
  210. case KeyEvent.VK_RIGHT:
  211. moveAllNodes(dist, 0);
  212. break;
  213. case KeyEvent.VK_UP:
  214. moveAllNodes(0, -dist);
  215. break;
  216. case KeyEvent.VK_DOWN:
  217. moveAllNodes(0, dist);
  218. break;
  219. case KeyEvent.VK_DELETE:
  220. if(nodeUnderCursor != null) {
  221. graph.removeNode(nodeUnderCursor);
  222. nodeUnderCursor = null;
  223. }
  224. break;
  225. }
  226. repaint();
  227. }
  228.  
  229. }
  230.  
  231. @Override
  232. public void keyReleased(KeyEvent event) {
  233. }
  234.  
  235. @Override
  236. public void keyTyped(KeyEvent event) {
  237. char znak=event.getKeyChar();
  238. if (nodeUnderCursor!=null){
  239. switch (znak) {
  240. case 'r':
  241. nodeUnderCursor.setColor(Color.RED);
  242. break;
  243. case 'g':
  244. nodeUnderCursor.setColor(Color.GREEN);
  245. break;
  246. case 'b':
  247. nodeUnderCursor.setColor(Color.BLUE);
  248. break;
  249. case '+':
  250. int r = nodeUnderCursor.getR()+10;
  251. nodeUnderCursor.setR(r);
  252. break;
  253. case '-':
  254. r = nodeUnderCursor.getR()-10;
  255. if (r>=10) nodeUnderCursor.setR(r);
  256. break;
  257. }
  258. repaint();
  259. }
  260. }
  261.  
  262. protected void createPopupMenu(MouseEvent event) {
  263. JMenuItem menuItem;
  264. JPopupMenu popup = new JPopupMenu();
  265. menuItem = new JMenuItem("Create new node");
  266. menuItem.addActionListener((action) -> {
  267. graph.addNode(new Node(event.getX(), event.getY()));
  268. repaint();
  269. });
  270. popup.add(menuItem);
  271. popup.show(event.getComponent(), event.getX(), event.getY());
  272. }
  273.  
  274. protected void createPopupMenu(MouseEvent event, Node node) {
  275. JMenuItem menuItem;
  276.  
  277. JPopupMenu popup = new JPopupMenu();
  278. menuItem = new JMenuItem("Change node color");
  279. menuItem.addActionListener((a) -> {
  280. Color newColor = JColorChooser.showDialog(this,"Choose Background Color", node.getColor());
  281. if (newColor!=null){
  282. node.setColor(newColor);
  283. }
  284. repaint();
  285. });
  286. popup.add(menuItem);
  287.  
  288. menuItem = new JMenuItem("Remove this node");
  289. menuItem.addActionListener((action) -> {
  290. graph.removeNode(node);
  291. repaint();
  292. });
  293. popup.add(menuItem);
  294.  
  295. menuItem = new JMenuItem("Create new edge from this node");
  296. menuItem.addActionListener((ac) -> {
  297.  
  298. createEdgeFrom = node;
  299. mouseCursor = Cursor.WAIT_CURSOR;
  300. });
  301. popup.add(menuItem);
  302.  
  303. menuItem = new JMenuItem("Change name of this node");
  304. menuItem.addActionListener((ac) -> {
  305. String name = (String)JOptionPane.showInputDialog(this, "Enter new name:", "Change node name", 3, null, null, node.getName());
  306. if (name != null) {
  307. node.setName(name);
  308. }
  309. this.repaint();
  310. });
  311. popup.add(menuItem);
  312.  
  313. popup.show(event.getComponent(), event.getX(), event.getY());
  314. }
  315.  
  316. protected void createPopupMenu(MouseEvent event, Edge edge) {
  317. JPopupMenu popup = new JPopupMenu();
  318. JMenuItem menuItem = new JMenuItem("Remove this edge");
  319. menuItem.addActionListener(a -> {
  320. this.graph.removeEdge(edge);
  321. this.repaint();
  322. });
  323. popup.add(menuItem);
  324.  
  325. menuItem = new JMenuItem("Change edge color");
  326. menuItem.addActionListener((a) -> {
  327. Color newColor = JColorChooser.showDialog(this,"Choose Background Color", edge.getColor());
  328. if (newColor!=null){
  329. edge.setColor(newColor);
  330. }
  331. repaint();
  332. });
  333. popup.add(menuItem);
  334. popup.show(event.getComponent(), event.getX(), event.getY());
  335. }
  336.  
  337. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement